前言

本文继续为大家讲解docker的基本知识

一、容器启动

1.1 创建容器(这里以httpd为例)

docker create -it 容器名称:标签
docker ps -a ——————————查看所有容器
docker ps ——————————查看所有启动的容器
在这里插入图片描述

1.2 启动与停止容器

docker start 容器名字或id ————————————启动容器
在这里插入图片描述
docker stop 容器名字或id ————————————停止容器
docker restart 容器名字或id ————————————重启容器
在这里插入图片描述

1.3 创建并启动容器

1.3.1 前台一次性创建并启动

容器在前台启动时会产生一个pid进程,当这个命令完成后,系统会默认这个pid进程挂掉,因此容器会停止,也就意为这命令一旦结束,容器就会停止。

docker run -it httpd:latest /usr/bin/bash -c ls /———————————— 一次性启动(查看httpd容器中根目录的所有文件与目录)
在这里插入图片描述

1.3.2 前台创建容器并持续性启动

从上文可知,如果在前端启动docker,一旦命令结束,容器就会自动停止,那么若要使容器在前台启动并且不会结束,命令就不能停止,因此可以用无限循环达到这一点。
docker run -it httpd:latest /usr/bin/bash -c “while true;sleep 2;do echo xjy;done” ————————————每隔两秒输出一次xjy
在这里插入图片描述

1.3.3 后台创建并启动

docker run -itd httpd:latest /usr/bin/bash -c “while true;sleep 1;do echo 123;cone” ————————————后台启动
docker run -itd --name httpd-1 httpd:latest /bin/bash ————————创建并启动容器,并且自定义名字为httpd-1
在这里插入图片描述

Docker容器主要有以下7个状态:
created:已创建,还未运行的容器
running:正在运行中的容器
restarting:容器正在重启中
removing:容器正在迁移中
paused:已暂停状态的容器
exited:停止状态的容器
dead:死亡,主要是操作系统出现异常或者断电关机等有可能引发dead状态,不是很常见。

暂停和停止状态的区别:
docker pause:命令挂起指定容器中的所有进程。(暂停)
docker stop:容器内主进程会在指定时间内被杀死,默认为10s后。(停止)

1.4 容器启动的原理

在这里插入图片描述
大致意思为:当启动容器时,docker会现在本地镜像库中寻找要开启的镜像,如果找到了就直接启动,如果没找到就会在本地镜像源中搜索并下载镜像之后开启,如果本地镜像源也没有就会报错。
(这里注意:如果没有该镜像,创建容器时会自动从镜像源中下载好镜像)
在这里插入图片描述

二、容器交互

2.1 进入容器

docker start 容器id或名称 ——————————开启容器
docker run -itd httpd:latest /usr/bin/bash ——————————后台开启
在这里插入图片描述
docker exec -it 容器id或名称 /bin/bash ————————————进入容器
在这里插入图片描述
在这里插入图片描述

2.2 主机与容器的复制(传输)

docker cp 主机文件的文件或目录 容器id:要放置的路径 ——————————将主机的文件或目录复制到容器中
在这里插入图片描述
docker cp 容器id:文件或目录路径 主机要放置的路径 ——————————将容器中的文件或目录复制到主机中
在这里插入图片描述

2.3 容器的导入与导出

2.3.1 容器导入与导出的作用

容器一旦停止,内部所有数据都会丢失,比如在容器中创建一个目录,停止容器后再重启,容器内部将不会有之前的目录,但是如果在停止之前导出容器,就算停止了容器,数据也会存放在导出的tar包中,之后以导入的方式将tar包变为镜像,开启该镜像为容器,容器中会存有之前的数据。

docker export 容器名字或id > 主机存放路径 ————————将容器导出到主机下,导出后以tar包形式
在这里插入图片描述
cat httpd.tar | docker import - httpd:xjy ————————导入镜像,并且镜像标签为xjy
在这里插入图片描述

2.3.2 export、import与save -o、load -i的区别

前两个是用于容器的,后两个是用于镜像的。

2.4 容器的删除

docker rm 容器名或id ——————————删除容器
(删除之前要关闭)
在这里插入图片描述
docker rm -f 容器名或id ——————————强制删除容器
(可以不用关闭)
在这里插入图片描述
docker ps -a | awk ‘NR>=2{print $1}’ | xargs docker stop ——————————删除大于等于第二行的所有容量
在这里插入图片描述
docker ps -a | awk ‘NR>=5{print $1}’| xargs docker rm ————————删除第5行开始所有的容量
在这里插入图片描述
docker ps -a | awk ‘NR>=2{print $1}’| xargs docker rm ——————————删除所有容器
在这里插入图片描述

三、docker网络管理

3.1.1 Docker 网络实现原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接
通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时
候就通过[宿主机IP]:[容器端口]访问容器。

大致意思为:容器创建之后,主机上就会创建一个虚拟网卡专门给容器去使用,只要容器启动,docker网桥的网段(固定172.17.0.1网段)会分配一个ip给容器使用,所有容器都在同一个网段中,因此可以互相通讯。从容器到网卡eth0(交换机)需要通过在创建容器时自动生成的一个虚拟网卡vethpa来进行连接,容器连接到docker0之后,通过网桥与iptables与主机网卡进行端口映射,实现容器到主机的连接,最后实现外网访问。
在这里插入图片描述
在这里插入图片描述

3.1.2 外网访问容器实验

第一步 创建容器时指定端口
docker run -itd --name httpd-2 -P httpd:latest /usr/bin/bash ————————随机分配端口在主机上(默认从32768开始)
在这里插入图片描述
在这里插入图片描述
docker run -itd --name httpd-3 -p 3344:80 httpd:latest /usr/bin/bash ——————————自定义端口3340映射到主机上
在这里插入图片描述
在这里插入图片描述

3.2 Docker 的网络模式

3.2.1 host模式

相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,MountNamespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespace隔离。 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace, 而是和宿主
机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

大致意思为:容器与物理机共用同一个ip与端口,假如我想访问httpd容器中的apache界面,在浏览器上搜索主机ip即可。

docker run -d --name httpd-host --net host httpd:latest
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.2 Container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
大致意思为:这个模式下所有容器共用同一个ip与用户。

第一步 先创建一个容器
docker run -itd --name httpd-4 httpd:latest /bin/bash
在这里插入图片描述
第二步 查看第一个容器的进程号
docker inspect -f ‘{{.State.Pid}}’ 容器id
在这里插入图片描述
第三步 查看容器编号
ls -l /proc/12095/ns
在这里插入图片描述
第四步 创建第二个容器用container的模式
docker run -itd --name httpd-5 --net=container:第一个容器的id httpd:latest /bin/bash
在这里插入图片描述
第五步 与上述步骤一样查看编号
可以发现两个容器net编号一样
在这里插入图片描述

3.2.3 无网络模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保容器的安全性。

3.2.4 桥接模式

桥接模式为默认模式,也就是3.1.2实验中的模式,这种模式只要创建一个容器,172.17.0.0网段就会分配一个ip,并且docker会创建一个虚拟网卡在主机中,若要使外网能够访问则要做端口映射。考虑到前面做过实验,这里就不过多介绍。

3.2.5 自定义模式

可以自己创建一个固定网段,并且在创建容器时可以指定ip,这样可以提供更高的网络控制和隔离性。
自定义模式实验:
第一步 创建一个网卡
docker network create --subnet=172.18.0.0/16 --opt “com.docker.network.bridge.name”=“docker1” xjy-network ————————网段为172.18.0.0 子网掩码 255.255.0.0 网络名字为xjy-network
在这里插入图片描述
在这里插入图片描述
第二步 创建并运行容器(网络模式为自定义模式xjy-network)
在这里插入图片描述

3.2.6 总结网络模式

1.桥接模式(bridge)
默认的网络模式,容器通过虚拟网桥与宿主机和其他容器通信。
2.主机模式(host)
容器共享宿主机的网络栈,直接使用宿主机的 IP 地址。
3.容器模式(container)
容器共享另一个容器的网络栈,两个容器可以使用相同的 IP 地址进行通信。
4.无网络模式(none)
容器没有网络配置,只有回环接口(lo)。
5.自定义网路
定义网络允许用户自定义容器的网络范围、子网和路由,从而提供更高的网络控制和隔离性。

总结

本文继续为大家讲解docker的基本知识,谢谢观看

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐