Docker——2. Docker基础

news2024/12/23 6:44:50

1. 常见命令

不用重复使用docker run命令,这是创建容器命令,启动容器应该是docker start;
docker ps 查看进程运行状态;
docker rmi 删除镜像、rm 删除容器;
docker logs 查看日志、docker exec 执行命令进入容器内部;

在这里插入图片描述

案例

在这里插入图片描述

# 第1步,去DockerHub查看nginx镜像仓库及相关信息

# 第2步,拉取Nginx镜像
docker pull nginx

# 第3步,查看镜像
docker images

# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx

# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 第6步,访问网页,地址:http://虚拟机地址

# 第7步,停止容器
docker stop nginx

# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 第9步,再次启动nginx容器
docker start nginx

# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 第11步,查看容器详细信息
docker inspect nginx

# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p

# 第13步,删除容器
docker rm nginx
# 运行中的容器无法删除,可以先停止再删除
docker stop nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

镜像常规命令

# 打包镜像
docker save -o nginx.tar nginx:latest
# 删除镜像
docker rmi nginx:latest
# 导入镜像
docker load -i nginx.tar

容器常规命令

# 创建容器
docker run -d --name nginx -p 80:80 nginx
# 查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 容器停止
docker stop nginx
# 容器启动
docker start nginx
# 查看所有的容器(未启动包括在内)
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" -a

查看日志

# 持续输出日志,ctrl c停止
docker logs -f nginx
1.1 命名别名

找到root目录下的bashrc的文件

vi ~/.bashrc
# 或者
vi /root/.bashrc

在这里插入图片描述

添加一个别名

alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'

保存:wq,执行以下命令使别名生效

source /root/.bashrc
# 或者
source ~/.bashrc

2. 数据卷

问题引入,容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。

  1. 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
  2. MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?
  3. 想要让Nginx代理我的静态资源怎么办

以上问题都说明,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。

2.1 数据卷概念

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁

Nginx有两个关键目录:

  1. html:存放一些静态资源
  2. conf:放置配置文件

但是这些文件均在容器内部,所以必须利用数据卷将两个目录与宿主机目录关联,方便操作

在这里插入图片描述

创建的数据卷conf、html和nginx容器中的两个目录关联;
数据卷分别指向宿主机/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录;
这样容器内的目录就和宿主机的目录关联起来了,成为挂载
此时操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

在这里插入图片描述

在这里插入图片描述

在执行docker run命令时,使用 -v 数据卷名:容器内目录 可以完成数据卷挂载;
当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷;

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

# 2.然后查看数据卷
docker volume ls

# 3.查看数据卷详情
docker volume inspect html

# 4.查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data
# 可以看到与nginx的html目录内容一样

# 5.进入该目录,并随意修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html

# 6.打开页面,查看效果

# 7.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化
docker exec -it nginx bash
2.2 本地目录挂载

在这里插入图片描述

查看mysql容器是否有数据卷挂载

# 1.查看MySQL容器详细信息
docker inspect mysql
# 关注其中.Config.Volumes部分和.Mounts部分

发现容器是有数据卷,但是创建容器mysql时并没有使用-v参数,这是因为容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义,所以这是匿名卷;
当想对mysql容器进行版本升级,此时删除容器,再创建一个mysql最新版本的容器且不指定自定义数据卷,同样会生成一个非常长的名称的匿名卷,到时候做数据迁移不太方便,可以但是不方便,所以使用自定义卷而不是匿名卷;

在这里插入图片描述

基于宿主机目录实现mysql数据目录、配置文件、初始化脚本的挂载;
方法与之前创建数据卷的方式相似,执行docker run 命令时,使用-v 本地目录:容器目录 就可以完成本地目录挂载;
注意:本地目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

先删除之前的mysql容器,先创建这三个目录;

docker rm -f mysql
# 创建mysql目录
mkdir mysql
cd mysql
# 创建3个目录
mkdir data
mkdir conf
mkdir init

将下载好的conf和init文件直接拖到root目录下(Xftp7软件)

在这里插入图片描述
在这里插入图片描述

运行本地目录挂载命令

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v /root/mysql/data:/var/lib/mysql \
  -v /root/mysql/conf:/etc/mysql/conf.d \
  -v /root/mysql/init:/docker-entrypoint-initdb.d \
  mysql

66d40c0a7e29fbba673b044.png)
在这里插入图片描述

3. 自定义镜像

制作自己的Java项目镜像

3.1 镜像结构

镜像中包含了程序运行需要的系统函数库、环境、配置、依赖;
所以自定义镜像也就需要配备项目的基础环境、依赖、配置等文件;

在这里插入图片描述

上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合;
镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer(层);
构建时如果某些层其他人制作过,可以直接拷贝使用这些层,无需重复制作,例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像;

在这里插入图片描述

3.2 Dockerfile

docker提供自动打包镜像的功能,无需自己逐级处理和打包,只需提供每一层要做的事情,用固定语法写下来,交给docker执行即可;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 网络

实现容器之间的访问

在这里插入图片描述

但是,容器内的IP实质上是一个虚拟IP,并不固定,如果该容器停止,另一个容器启动,很可能IP就被其它容器占用,此时如果开发时写死了IP,那么连接就会失败;
所以引出docker的网络功能来解决这个问题;

在这里插入图片描述

# 1.首先通过命令创建一个网络
docker network create hmall

# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID     NAME      DRIVER    SCOPE
639bc44d0a87   bridge    bridge    local
403f16ec62a2   hmall     bridge    local
0dc0f72a0fbb   host      host      local
cd8d3e8df47b   none      null      local
# 其中,除了hmall以外,其它都是默认的网络

# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmall mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect hmall dd
# 3.3.也可以在新建容器阶段就接入网络
docker run -d --name demo -p 8080:8080 --network hmall docker-demo
docker run -d --name nginx_demo -p 80:80 --network nxj nginx
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#读取XML文件实现晶圆wafermapping显示demo计算电机坐标以便控制电机移动

c#读取XML文件实现晶圆wafermapping显示 功能: 1.读取XML文件,显示mapping图 2.在mapping视图图标移动,实时查看bincode,x,y索引与计算的电机坐标 3.通过设置wafer放在平台的位置x,y轴电机编码值,相机在wafer的中心位置&#…

jstree组件的使用详细教程,部分案例( PHP / fastAdmin )

jstree 组件的使用。 简介:JsTree是一个jquery的插件,它提交一个非常友好并且强大的交互性的树,并且是完全免费或开源的(MIT 许可)。Jstree技持Html 或 json格式的的数据, 或者是ajax方式的动态请求加载数…

基于ssm的汽车服务商城系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Vue的汽车服务商城系统,来更好的为用户提供服务。 本基于Vue的汽车服务商城系统应用Java技术,MYSQL数据库存储数据,基于SSMVue框架开发。在网站的整个开发过程中,首先对…

关于响应式布局,你需要了解的知识点

什么是响应式布局? 响应式布局,就是根据不同设备展示不同的布局,以免更方便用户浏览页面。 举个很简单的例子,我们在电脑上浏览网页,屏幕非常大,这时候可能采用的是如下图所示的布局方式。这种布局方式很宽…

[陇剑杯 2021]日志分析

[陇剑杯 2021]日志分析 题目做法及思路解析(个人分享) 问一:单位某应用程序被攻击,请分析日志,进行作答: 网络存在源码泄漏,源码文件名是_____________。(请提交带有文件后缀的文件名&…

vue项目debugger调试看不到源码

vue项目debugger调试看不到源码 引用地址:vue项目debugger调试看不到源码_hua_ban_yu的博客-CSDN博客_vue项目网页源代码查看不了 在开发vue项目时,不知为啥进行debug但是查看不到页面源代码,尝试过很多方法,最后在看到大神相关…

WSL的安装与使用 (超详细图文版安装教程)

安装与使用 Windows Subsystem for Linux - WSL 安装(两种方式均可实现WSL的安装)图文版安装文字版安装步骤1:启用 WSL 功能步骤2:选择并安装 Linux 发行版步骤3:配置和使用 WSL步骤4:与 Windows 的互操作性…

探索高级AJAX技术:深入研究异步请求和响应处理

大家有关于JavaScript知识点不知道可以去 🎉博客主页:阿猫的故乡 🎉系列专栏:JavaScript专题栏 🎉ajax专栏:ajax知识点 🎉欢迎关注:👍点赞🙌收藏✍️留言 目录…

Docker-consul容器服务自动发现与注册

什么叫微服务或者注册与发现? 是一种分布式管理系统,定位服务的方法。 在传统的架构中,应用程序之间直连到已知的服务。 已知的服务:设备提供的网络、IP地址、基于tcp/ip端口 基于现微服务部署,服务的动态性&#…

在MDK开发调试过程中,发现程序正常运行,但是打断点无法进入。

在MDK开发调试过程中,发现程序正常运行,但是打断点无法进入。 打断点无法进入: 程序无法进行: 查找问题:这些都已经配置 上面都已经配置,最终发现: 勾选后进入断点成功。

以csv为源 flink 创建paimon 临时表相关 join 操作

目录 概述配置关键配置测试启动 kyuubi执行配置中的命令 bug解决bug01bug02 结束 概述 目标:生产中有需要外部源数据做paimon的数据源,生成临时表,以使用与现有正式表做相关统计及 join 操作。 环境:各组件版本如下 kyuubi 1.8…

Redis 过期删除策略、内存回收策略、单线程理解

不知从何开始Redis的内存淘汰策略也开始被人问及,卷!真的是太卷了。难不成要我们去阅读Redis源码吗,其实问题的答案,在Redis中的配置文件中全有,不需要你阅读源码、这个东西就是个老八股,估计问这个东西是想…

微信小程序识别小程序码并传参

一、场景 连续看到几个类似关于小程序生成二维码场景的问题,分销的场景和单商品购买的页面居多 二、思路 #mermaid-svg-8CjFXSzutuF1OvO8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8CjFXSzutuF1…

中小企业业财融合策略(2):财务赋能,如何支持业务经营?

上一文《中小企业业财融合(1):把财务从琐碎的凭证处理、核算中解放出来!》,我们提出了财务升级的背景以及必要性,本篇我们就财务赋能,如何支持业务经营?提出一些简要的看法,希望对大家有所帮助。 一、财务赋能&#x…

com.sun.org.apache.xerces.internal.impl.dv.util.Base64

com.sun.org.apache.xerces.internal.impl.dv.util.Base64 Access restriction: The type Base64 is not API (restriction on required library D:\Java\jdk1.8.0_341\jre\lib\rt.jar) Maven Update Project 虽然没错误了,但是有警告,好奇?…

TCL实业,在智能时代风中起舞

从惠州的一个磁带厂起步,成长为智能终端、半导体显示、新能源光伏三大业务齐头并进的制造业大鳄,TCL是中国制造业穿越周期的一面旗帜。而作为国内电视品牌中唯一拥有上游供应链自主权的企业,C端用户往往更熟悉那个总是在电视终端领域拿出好产…

RT-DETR优化:ASF-YOLO提取多尺度特征 | 2023年12月最新成果

🚀🚀🚀本文改进: ASF-YOLO一种新的特征融合网络架构,该网络由两个主要的组件网络组成,可以为小目标分割提供互补的信息:(1)SSFF模块,它结合了来自u;(2)TFE模块,它可以捕获小目标的局部精细细节等 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学…

网络协议 - TCP 协议详解

网络协议 - TCP 协议详解 简述TCP头格式TCP的状态机数据传输中的Sequence NumberTCP重传机制超时重传机制快速重传机制SACK 方法Duplicate SACK – 重复收到数据的问题示例一:ACK丢包示例二,网络延误 TCP的RTT算法经典算法Karn / Partridge 算法Jacobson…

记录 | Microsoft Remote Desktop for mac安装

Microsoft Remote Desktop for mac安装 网上一些教程的下载安装老是跳转来跳转去,而且下载了的也不一定适用于 mac, 这里直接提供 Microsoft Remote Desktop for mac 的安装包的下载地址: microsoft-remote-desktop-for-mac

f盘隐藏的文件夹怎么找出来?介绍几种有效方法

在计算机中,我们经常会遇到隐藏的文件或文件夹,在F盘中隐藏的文件夹也不例外。隐藏的文件夹可能是由系统生成的,或者是用户自行设定的隐私文件夹。无论是因为误操作还是出于其他原因,如果你想找出F盘中的隐藏文件夹,本…