Docker:启动容器
Brief
:docker run,以镜像为基础启动生成容器
运行第一个Docker容器
docker run -it ubuntu bash
[root@tvl-cnss-uat-3127 pro]# docker run -it ubuntu bash root@a2ca2202d464:/#
执行命令后可以看到进入了root@a2ca2202d464的容器中,就像远程ssh到ubuntu系统一样(实际这个容器只是ubuntu系统的一个极简缩版)。在容器里面可以像操作ubuntu系统一样操作。
退出 容器
root@a2ca2202d464:/# exit exit [root@tvl-cnss-uat-3127 pro]#
docker run
启动一个容器
-it 等价于 -i -t
-i 代表容器中STDIN为开启状态 可进标准输入shell交互
-t 告诉容器需要创建一个伪tty终端 新创建的容器才能提供一个交互式shell
ubuntu 代表启动的容器基于这个镜像 没有指定tag则默认使用 latest 带tag的镜像指定 ubuntu:xxxx
bash 代表的是启动这个容器时初始化执行了一个 /bin/bash 命令
docker ps 查看本地宿主机上已经存在的容器
[root@tvl-cnss-uat-3127 pro]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a2ca2202d464 ubuntu "bash" 6 minutes ago Exited (0) 3 minutes ago beautiful_swirles
CONTAINER ID
容器ID 唯一
IMAGE
容器基于什么镜像启动
COMMAND
启动时执行的命令
CREATED
创建时间
STATUS
容器状态
PORTS
容器的端口 可以通过docker run -p 指定或者通过Dockerfile主动暴露容器端口
NAMES
容器名称 可通过 docker run --name 指定,容器名称不能重复
docker ps 默认查看正在运行的容器可以通过 -a 查看所有
创建一个守护线程类型的容器
刚才的命令虽然创建了一个容器,但是执行exit命令后,容器也随即停止运行。通过-d参数来创建后台执行的守护线程容器。
[root@tvl-cnss-uat-3127 pro]# docker run -d ubuntu tail -f /etc/hosts 41616ad592666e9c764fb0e3df70efb664c3ec969e8c9ccae2bb27d5bb5a6181 [root@tvl-cnss-uat-3127 pro]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 41616ad59266 ubuntu "tail -f /etc/hosts" 4 seconds ago Up 3 seconds interesting_tu [root@tvl-cnss-uat-3127 pro]#
tail -f /etc/hosts 创建了一个持续交互的任务,并不是-d参数使用就永远容器挂载后台运行,当容器中任务完成时,容器也会正常退出。这里使用tail -f 创建一个不会立即停止的任务
通过-d传建的容器,通过docker ps可以看到即使没有进入容器,它也在后台运行。
进入一个正在运行的容器
docker exec
[root@tvl-cnss-uat-3127 pro]# docker exec -it 41616ad59266 bash root@41616ad59266:/# ps PID TTY TIME CMD 7 pts/0 00:00:00 bash 15 pts/0 00:00:00 ps root@41616ad59266:/# ps -ef | grep tail root 1 0 0 14:32 ? 00:00:00 tail -f /etc/hosts root@41616ad59266:/#
通过docker exec命令进入容器41616ad59266中,并创建了一个交互式伪终端,通过ps -ef | grep tail 查看到了容器创建时执行的命令,也证明进入了这个正在运行的容器
也可以通过docker attach命令进入一个正在运行的容器,且这个容器只在运行stdin任务,不能处理后台容器。attach命令会随着自主退出而结束整个容器的运行,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
容器管理
查看容器详细情况
docker inspect 容器ID/容器名称
[root@tvl-cnss-uat-3127 pro]# docker inspect 41616ad59266 [ { "Id": "41616ad592666e9c764fb0e3df70efb664c3ec969e8c9ccae2bb27d5bb5a6181", "Created": "2021-03-12T14:32:15.914494107Z", "Path": "tail", "Args": [ "-f", "/etc/hosts" ], ....... "NetworkSettings": { "Bridge": "", "SandboxID": "024c5445260a0a8dccf01c4294c3acef3f4ce436286dbc1a341efe2248017da1", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/024c5445260a", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "105ed0fc2d1bae3ddfb582b1e0a486db659aa339f2a1ef0b0129400e68eecc69", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "583342abfc06a9c6b702e6f5a27676dbfd6ad0a06a8df3c771ec2b826d611dca", "EndpointID": "105ed0fc2d1bae3ddfb582b1e0a486db659aa339f2a1ef0b0129400e68eecc69", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } } } } ] [root@tvl-cnss-uat-3127 pro]#
通过docker inspect -f(--format) 格式化内容,定位关注数据
[root@tvl-cnss-uat-3127 pro]# docker inspect 41616ad59266 -f='{{ .NetworkSettings.Networks.bridge.NetworkID }}' 583342abfc06a9c6b702e6f5a27676dbfd6ad0a06a8df3c771ec2b826d611dca [root@tvl-cnss-uat-3127 pro]# docker inspect 41616ad59266 -f='{{ .State.Status }}' running [root@tvl-cnss-uat-3127 pro]# docker inspect 41616ad59266 -f='{{ .NetworkSettings.Networks.bridge.Gateway }}' 172.17.0.1
重启/停止容器(守护线程类型的后台服务)
docker stop/start/restart 容器ID/容器名称
设置容器自动重启
docker run --restart={}
always
无论容器退出时发出何种退出代码,立即重启
on-failure
只有当退出代码不为0时,容器才会自动重启,on-failure:5 最多失败重启5次
容器删除
docker rm 容器ID、容器名称
目前docker没有直接删除所有容器的命令,但可以通过docker rm `docker ps -aq`删除所有容器,容器删除前必须处于停止状态。