Docker容器管理
容器启动方式
交互式启动
-i 交互式启动
-t 开一个终端
docker container run -it 镜像名/镜像ID
[root@hwf ~]# docker container run -it 1d622ef86b13
root@a56369d31aeb:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
定义容器名称进行启动
docker container run -it --name="Kk" 镜像ID号
要是启动不了,在后面加上/bin/bash
docker container run -it --name="Kk" 镜像ID号 /bin/bash
守护进程式启动
-d 守护进程,后台运行的方式
docker run -d --name="Kk_nginx" 镜像ID/镜像名称
[root@hwf ~]# docker container run -d --name="Kk_nginx" nginx:1.16
如果没有下载镜像,也可以使用run命令,在启动容器时会自动去远程仓库进行拉去镜像
查看已经启动的容器
docker container ls
docker container ls -a 显示所有容器
[root@hwf ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a56369d31aeb 1d622ef86b13 "/bin/bash" 19 minutes ago Exited (0) 15 minutes ago busy_goldberg a7863eaea588 hello-world "/hello" 24 minutes ago Exited (0) 24 minutes ago laughing_leavitt 6a20aaccf72b hello-world "/hello" 24 minutes ago Exited (0) 24 minutes ago thirsty_meitner
CONTAINER ID:
- 容器的唯一ID
IMAGE:
- 镜像名称
NAME:
- 容器的名字(可以自动生成,也可以手动生成)
STATUS:
- 容器的运行状态[ Exitted退出状态,up开启状态 ]
查看容器的详细信息
docker container inspect 容器名称
[root@hwf ~]# docker container inspect Kk_nginx
可以看到IP地址,这个地址是可以通过宿主机进行直接访问的
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
检查nginx是否可用,这个地址windows上访问不了,只能在linux上访问
[root@hwf ~]# curl -I 172.17.0.2
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Thu, 07 May 2020 08:49:28 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes
显示容器正在干什么
docker container ls -a --no-trunc 容器ID/容器名
查看容器
docker container ls -a等同于 docker ps -a
容器的应用场景
交互式的容器:
- 工具类
- 开发
- 测试
- 临时性的任务
这类容器使用的时候都会在启动的后面加一个 --rm当容器退出时自动删除容器
docker container run -it --name="Kk_ubu" --rm 镜像的ID/镜像的名称
[root@hwf ~]# docker container run -it --name="Kk_ubu" --rm 1d622ef86b13
root@9b3dccfcafaf:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
守护式容器:
- 服务
因为服务式的容器只能在内部使用,外部无法访问的内部容器,要添加一个映射端口,可以式外部的用户访问到自己
docker run -d -p 8080:80 --name="Kk_nginx" nginx:1.16
8080:代表你宿主机的IP地址加上8080端口就可以访问到docker容器里的nginx服务【相当于外部的端口】
80:代表把8080端口映射为docker容器的80端口【映射的内部端口】
[root@hwf ~]# docker run -d -p 7070:80 --name="Kk_ng" nginx:1.16 4bb42897f1ead28ebfb1c50527047bcbbd6dbdba4cbafd5c091e8b27c187c294 [root@hwf ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4bb42897f1ea nginx:1.16 "nginx -g 'daemon of…" 8 seconds ago Up 7 seconds 0.0.0.0:7070->80/tcp Kk_ng 7dd636e4da25 nginx:1.16 "nginx -g 'daemon of…" 56 minutes ago Up 56 minutes 80/tcp Kk_nginx
容器的重启
对于一个关闭的容器
不加-i 就是启动起来不连接进去
docker container start -i 交互式容器ID/交互式容器名称
不加-i 适合守护进程容器,不用连接进去
docker container start 守护式容器ID/守护式容器名称
容器的停止
容器的停止stop,这种方式式温柔的停止,可以防止数据在暴力停止的时候丢失
docker contariner stop 守护式容器ID/守护式容器名称
交互式容器的停止,直接exit
exit
容器的连接方法
比如说是,交互式容器在启动的时候没有加-i参数,它现在正在后台运行,我想要连接进去,这种情况下就会有两种连接方式,前提式这个容器要打开
attach的方式
docker container start 交互式容器名称/交互式容器ID
[root@hwf ~]# docker container start busy_goldberg
busy_goldberg
[root@hwf ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bb42897f1ea nginx:1.16 "nginx -g 'daemon of…" 33 minutes ago Up 33 minutes 0.0.0.0:7070->80/tcp Kk_ng
a56369d31aeb 1d622ef86b13 "/bin/bash" 3 hours ago Up 2 seconds busy_goldberg
docker container attach 后台容器名称/后台容器ID
[root@hwf ~]# docker container attach busy_goldberg root@a56369d31aeb:/# ls bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
exec子进程的方式登陆
docker container exec -it 交互式容器ID/交互式容器名称 /bin/bash
这个是重点,在登陆使用容器的时候,退出不会关闭容器,对其它正在使用这个容器的人没有任何影响
如何把交互式容器的界面放到后台
Ctrl+p+q,先按Ctrl再按p再按q
这样就可以在后台运行
容器的删除
docker container rm -f `docker container ls -a -q`
这个加了-f全部容器都会删除
不加-f运行中的容器不会删除,没有运行的容器全部都会被删除
容器的网络访问
测试两个容器主机能否互相通讯
实验准备:
- 建立两个centos6.9的容器,安装iproute*进行测试
docker container run -it --name="Kk_cent6.9" centos:6.9
yum -y install iproute*
[root@c1a18e500368 /]# ping 172.17.0.3 PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data. 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.066 ms 64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.080 ms ^C --- 172.17.0.3 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1329ms rtt min/avg/max/mdev = 0.066/0.073/0.080/0.007 ms [root@c1a18e500368 /]# ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.072 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.132 ms ^C --- 172.17.0.2 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1365ms rtt min/avg/max/mdev = 0.072/0.102/0.132/0.030 ms
通过小实验发现,镜像容器内的主机地址是可以相互通讯的,在一个广播域内
容器的外部访问
前面在守护进程式容器里已经写过了-p参数的一些,这里在写几个
指定外部IP地址访问容器
docker container run -it -p 10.0.0.100:777:80 --name="Kk_centos6.9" centos:6.9
这样只能通过10.0.0.100的地址才能访问到容器
指定外部IP地址访问容器,默认端口号匹配
docker container run -it -p 10.0.0.01::80 --name="kK_centos6.9" centos:6.9
指定多个端口进行映射[适用于多服务]
docker container run -it -p 8080:80 -p 33060:3306 -p 220:22 --name --name="kK_centos6.9" centos:6.9
查看容器运行了什么进程
docker container top 容器名称/容器ID
[root@hwf ~]# docker container top Kk_cont7.1
UID PID PPID C STIME TTY TIME CMD
root 40949 40931 0 14:09 pts/0 00:00:00 /bin/bash
root 41040 40949 0 14:10 ? 00:00:00 /sbin/udevd -d
root 41176 40931 0 14:12 pts/1 00:00:00 bash
查看容器的日志
docker container logs 容器名称/容器ID
[root@hwf ~]# curl -I 172.17.0.3
curl: (7) Failed connect to 172.17.0.3:80; Connection refused
[root@hwf ~]# curl -I 172.17.0.4
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Fri, 08 May 2020 08:26:06 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes
[root@hwf ~]# docker container logs Kk_nginx
172.17.0.1 - - [08/May/2020:08:26:06 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"
要想显示的更加详细 添加 -tf参数
-f 实时监控
-t 显示时间
docker container logs -tf Kk_nginx
[root@hwf ~]# docker container logs -tf Kk_nginx
2020-05-08T08:26:06.413334337Z 172.17.0.1 - - [08/May/2020:08:26:06 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"
--tail 10 尾部多少行
docker container logs -tf -tail 10 Kk_nginx
容器的调试
对容器进行设置,检查,配置
查看交互式容器系统版本
cat /etc/os-release
如何在Docker中进行数据交互
比如/opt/中有一个index.html的文件如何拷贝到容器中
docker container cp 宿主机上的哪个文件 容器名称/容器ID:放到哪里
[root@hwf ~]# docker container cp /opt/index.html Kk_nginx:/usr/share/nginx/html/
将容器的文件下载到本地
docker container cp 容器名/容器ID:文件位置 放到宿主机的什么位置
docker container cp Kk_nginx:/usr/share/nginx/html/index.html /opt/这里还可以给文件改名
[root@hwf ~]# docker container cp Kk_nginx:/usr/share/nginx/html/index.html /opt/xx
[root@hwf ~]# cat /opt/xx
haha
Docker的数据卷实现持久化存储
volume实现宿主机和容器的数据共享,类似于共享存储
实现方法:
mkdir -p /opt/html/
echo "hewenfu" >/opt/html/index.html
现在就要做一个把宿主机的/opt/html/和Docker容器中的宿主机目录/usr/share/nginx/html/目录进映射关系
docker container run -d --name="nginx1.16" -p 99:80 -v 宿主机目录:Docker容器目录地址 容器名称/容器ID
docer container run -d --name="nginx1.16" -p 99:80 -v /opt/html/:/usr/share/nginx/html/ nginx:1.16
[root@hwf ~]# mkdir -p /opt/html/
[root@hwf ~]# echo "hewenfu" >/opt/html/index.html
[root@hwf ~]# docker container run -d --name="nginx1.16" -p 99:80 -v /opt/html/:/usr/share/nginx/html/ nginx:1.16
dc212e68fe83d84854b083234638dc34afc3daecdc33a58f16ab741664c38064
[root@hwf ~]# curl 192.168.1.3:99
hewenfu
然后可以在宿主机的文件里修改文件,Docker容器里的nginx站点目录就会跟着变化
[root@hwf ~]# echo "docker container" > /opt/html/index.html
[root@hwf ~]# curl 192.168.1.3:99
docker container
要想查看一个容器是否配置了volume使用的命令:
docker container inspect 容器名称/容器ID
在其中的mounts板块中可以看到容器的映射目录
docker container inspect nginx
"Mounts": [ { "Type": "bind", "Source": "/opt/html", "Destination": "/usr/share/nginx/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
使用数据卷容器
应用在于:在集中管理群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理
把一个系统作为映射模板,通过调用--volumes-from参数就在其它容器创建的时候,调用这个映射模板,就可以完成繁琐的工作
拷贝数据到数据卷中
实践方式:
宿主机操作:
[root@hwf ~]# mkdir -p /opt/volume/{a,b}
[root@hwf ~]# touche /opt/volume/{a,b}/xx.txt
启动数据卷容器
docker container run -it --name="数据卷容器的名字" -v /opt/volume/a:/opt/a -v /opt/volume/b 容器名称/容器ID
[root@hwf ~]# docker container run -it --name="volume_cent1" -v /opt/volume/:/opt/a -v /opt/volume/:/opt/b centos:6.9
ctrl +p +q
使用数据卷容器
docker container run -d -p 88:80 --name="nginx1.16" --volumes-from 数据库容器名称 nginx:1.16
[root@hwf ~]# docker container run -d -p 71:80 --volumes-from volume_cent --name="ll" nginx:1.16
ea2a58f4fdfd81db5026d89acf6a4fa2fed8a1f162d558095f92d461c252284e
比如说一个服务,你修改了它的配置文件,在宿主机的目录里,那么想要让这个修改后的配置生效,就重启一下对应的容器就可以了
docker 的网络模式
docker 自带3个网络模式:
- bridge网络
- host网络模式
- none网络模式
[root@hwf ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
21ef2f505e7e bridge bridge local
f4ac58fe0476 host host local
8e26390a8f01 none null local
1.none网络
这种网络模式下容器只有lo回环网络,没有其它网卡。none网络可以在容器创建时通过 --network=none 来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性
查看host网络模式的容器信息
docker network inspect none
2.host网络
通过命令--network=host指定,使用host模式的容器可以直接使用docker host的IP地址与外接通讯,容器内部的服务端口也可以使用宿主机的端口,不需要进行nat,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能在用了,网络的隔离线不好
[root@hwf ~]# docker container run -it --name="xx" --network=host centos:6.9
查看host网络模式的容器信息
docker network inspect host
3.bridge网络
容器的默认网络模式,docker在安装时会创建一个名为docker0的Linux bridge ,在不指定--network的情况下创建的容器会默认挂载到docker0上面
查看容器的bridge网络模式的ip地址
docker network inspect bridge
[root@hwf ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "21ef2f505e7e71c427113ebdd1008944fa5b0adeac5fd6104aeddfbbed30da44",
"Created": "2020-05-06T12:51:02.459115291+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
查看主机网桥情况,brctl show,在docker 0 网桥下有2个接口,对应前面容器各自的虚拟网卡,创建一个容器之后一个就是容器创建时创建的虚拟网卡。bridge模式为容器创建独立的网络栈,保证容器内的进程使用独立的网络缓解,使容器之间,容器和docker host之间实现网络隔离
[root@hwf ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242dad3861f no veth6637605
veth8083bc5
virbr0 8000.5254006ed26a yes virbr0-nic
这里可以看出docker0网桥上对应了2个容器挂靠的虚拟网卡,此3个容器之间可以互相通信,因为在一同一个网桥下面
容器的重启策略
no 默认策略,在容器退出时不重启容器 on-failure 在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3 在容器非正常退出时重启容器,最多重启3次 always 在容器退出时总是重启容器 unless-stopped 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
容器退出的状态码
0 表示正常退出
非0,表示异常退出(退出状态码采用chroot标准)
125,Docker守护进程本身的错误
126,容器启动后,要执行的默认命令无法调用
127,容器启动后,要执行的默认命令不存在
其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
docker continer --restart 参数
通过--restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。
--restart选项通常只用于detached模式的容器。
--restart选项通常只用于detached模式的容器。
--restart选项通常只用于detached模式的容器。
容器的重启策略设置为on-failure:3,容器不正常退出就重启,最大次数为3
[root@hwf ~]# docker container run -d --name="nginx_1" --network=bridge --restart=on-failure:3 -p 11:80 nginx:1.16
313e04b4f25936312a9349db71807d3227a20be3219957134b45b3213f5e4210
进行查看容器的重启策略类型
[root@hwf ~]# docker container inspect nginx_1|grep -A 5 -i "restartpolicy"
"RestartPolicy": {
"Name": "on-failure",
"MaximumRetryCount": 3
},
"AutoRemove": false,
"VolumeDriver": "",
容器的重启策略设置为always,容器退出就重启
[root@hwf ~]# docker container run -d --name="nginx_2" --network=bridge --restart=always -p 12:80 nginx:1.16
beb3adef38e8688037d8c919bdf4a0c3c22bd44fd64c3d4682972881e70724fc
进行查看容器的重启策略类型
[root@hwf ~]# docker container inspect nginx_2 |grep -i -A 5 "restartpolicy"
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
修改已有容器的--restart参数
[root@hwf ~]# docker update --restart=always nginx_1
nginx_1
进行查看
[root@hwf ~]# docker container inspect nginx_1 |grep -i -A 5 "restartpolicy"
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",

评论