第4章 操作docker容器
容器是docker的另一个核心概念,简单的来说,容器就是镜像的一个运行实例。镜像是静态只读的文件,而容器带有运行是需要的可写文件层,同事容器中的应用进程是出于运行状态。
创建容器
新建容器
可以使用docker [container] create -it [--name 容器名称]命令创建一个容器,创建的容器是停止状态,可以使用docker start 进项名称 命令启动
name可以不传递,不传递会自动起一个
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
17286@LAPTOP-IV46MOMH ~ docker create -it ubuntu:latest
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
2293fd544e1ab63491257e9b75c565990430a7c0050a2510085bd9ae559514f3
17286@LAPTOP-IV46MOMH ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17286@LAPTOP-IV46MOMH ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2293fd544e1a ubuntu:latest "bash" 26 seconds ago Created objective_murdock
「create 命令与容器运行模式相关的选项」
| 选项 | 说明 |
|---|---|
| -a, --attach=[] | 是否绑定到标准输入、输出和错误 |
| -d,--detach=true | false |
| --detach-keys="" | 从 attach 模式退出的快捷键 |
| --entrypoint="" | 镜像存在入口命令时,覆盖为新的命令 |
| --expose=[] | 指定容器会暴露出来的端口或者端口范围 |
| --group-add=[] | 运行容器的用户组 |
| -i, --interactive=true | false |
| --ipc="" | 容器的 IPC 命令空间,可以为其他容器或者主机 |
| --isolation="default" | 容器使用的隔离级别 |
| --log-driver="json-file" | 指定容器的日志驱动类型,可以为 json-file、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs 或 none |
| --log-opt=[] | 传递给日志驱动的选项 |
| --net="bridge" | 指定容器网络模式,包括 bridge、none、其他容器内网络、host 的网络或者某个现有网络等 |
| --net-alias=[] | 容器在网络中的别名 |
| -P,--publish-all=true | false |
| -p,--publish=[] | 指定如何映射到本地主机端口,例如 -p 11234-12234:1234-2234 |
| --pid=host | 容器的 PID 命名空间 |
| --userns="" | 启动 userns-remap 时配置用户命名空间的模式 |
| --uts=host | 容器的 UTS 命名空间 |
| --restart="no" | 容器的重启策略,包括 no、on-failure[:max-retry]、always、unless-stopped 等 |
| --rm=true | false |
| -t,--tty=true | false |
| --tmpfs=[] | 挂载临时文件系统到容器 |
| -v,--volume[=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]] | 挂载主机上的文件卷到容器内 |
| --volume-driver="" | 挂载文件卷的驱动类型 |
| --volumes-from=[] | 从其他容器挂载卷 |
| -w,--workdir="" | 容器内的默认工作目录 |
「create 命令与容器环境和配置相关的选项」
| 选项 | 说明 |
|---|---|
| --add-host=[] | 在容器内添加一个主机名到 IP 地址的映射关系(通过 /etc/hosts 文件) |
| --device=[] | 映射物理机上的设备到容器内 |
| --dns-search=[] | DNS搜索域 |
| --dns-opt=[] | 自定义的 DNS 选项 |
| --dns=[] | 自定义的 DNS 服务器 |
| -e,--env=[] | 指定容器内环境变量 |
| --env-file=[] | 从文件中读取环境变量到容器内 |
| -h,--hostname="" | 指定容器内的主机名 |
| --ip="" | 指定容器的 IPv4 地址 |
| --ip6="" | 指定容器的 IPv6 地址 |
| --link=[:alias] | 链接到其他容器 |
| --link-local-ip=[]: | 容器本地地址链接表 |
| --mac-address="" | 指定容器的 Mac 地址 |
| --name="" | 指定容器的别名 |
「create 命令与容器资源限制和安全保护相关的选项」
| 选项 | 说明 |
|---|---|
| --blkio-weight=10~1000 | 容器读写块设备的 I/O 性能权重,默认为 0 |
| --blkio-weight-device=[DEVICE_NAME:WEIGHT] | 指定各个块设备的 I/O 性能权重 |
| --cpu-shares=0 | 允许容器使用 CPU 资源的相对权重,默认一个容器能用满一个核的 CPU |
| --cap-add=[] | 增加容器的 Linux 指定安全能力 |
| --cap-drop=[] | 移除容器的 Linux 指定安全能力 |
| --cgroup-parent="" | 容器 cgroups 限制的创建路径 |
| --cidfile="" | 指定容器的进程 ID 号写到文件 |
| --cpu-period=0 | 限制容器在 CFS 调度器下的 CPU 占用时间片 |
| --cpuset-cpus="" | 限制容器能使用那些 CPU 核心 |
| --cpuset-mems="" | NUMA 架构下使用哪些 CPU 核心的内存 |
| --cpu-quota=0 | 限制容器在 CFS 调度器下的 CPU 配额 |
| --device-read-bps=[] | 挂载设备的读吞吐率(以 bps 为单位)限制 |
| --device-write-bps=[] | 挂载设备的写吞吐率(以 bps 为单位)限制 |
| --device-read-iops=[] | 挂载设备的读速率(以每秒 i/o 次数为单位)限制 |
| --device-write-iops=[] | 挂载设备的写速率(以每秒 i/o 次数为单位)限制 |
| --health-cmd="" | 指定检查容器健康状态的命令 |
| --health-interval=0s | 执行健康检查的间隔时间,单位可以以 ms、s、m 或 h |
| --health-retries=int | 健康检查的失败重试次数,超过则认为不健康 |
| --health-start-period=0s | 容器启动后进行健康检查的等待时间,单位可以为 ms、s、m 或 h |
| --health-timeout=0s | 健康检查的执行超时,单位可以为 ms、s、m 或 h |
| --no-healthcheck=true | false |
| --init | 在容器中执行一个 init 进程,来响应信号和处理僵尸状态的子进程 |
| --kernel-momory="" | 限制容器内核的内存大小,单位可以是 b、k、m 或 g |
| -m,--memory="" | 限制容器内应用使用的内存,单位可以时 b、k、m 或 g |
| --memory-reservation="" | 当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值 |
| --memory-swap="LIMIT" | 限制容器使用内存和交换区的总大小 |
| --oom-kill-disable=true | false |
| --oom-score-adj="" | 调整容器的内存耗尽参数 |
| --pids-limit="" | 限制容器的 pid 格式 |
| --privileged=true | false |
| --read-only=true | false |
| --security-opt=[] | 指定一些安全参数,包括权限、安全能力、apparmor 等 |
| --stop-signal=SIGTERM | 指定停止容器的系统信号 |
| --shm-size="" | /dev/shm 的大小 |
| --sig-proxy=true | false |
| --memory-swappiness="0~100" | 调整容器的内存交换区参数 |
| -u,--user="" | 指定在容器内执行命令的用户信息 |
| --userns="" | 指定用户命名空间 |
| --ulimit=[] | 通过 ulimit 来限制最大文件数、最大进程数等 |
其他选项有:
- -l,--lable=[] : 以键值对方式指定容器的标签信息
- --lable-file=[] : 从文件中读取标签信息
启动容器
使用 docker [container] start 命令可以启动一个已经创建的容器
17286@LAPTOP-IV46MOMH ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17286@LAPTOP-IV46MOMH ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e47e42c64319 ubuntu:latest "bash" 13 minutes ago Exited (0) 2 minutes ago web
2293fd544e1a ubuntu:latest "bash" 21 minutes ago Created objective_murdock
17286@LAPTOP-IV46MOMH ~ docker start web
web
17286@LAPTOP-IV46MOMH ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e47e42c64319 ubuntu:latest "bash" 13 minutes ago Up 13 seconds web
新建并启动容器
docker [container] run 命令等价于先执行 docker [container] create 再执行 docker [container] start。当使用 docker [container] run 命令创建并启动容器时,Docker 在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建一个容器,并启动该容器
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从网桥的地址池配置一个 IP 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被自动终止
创建并启动一个ubuntu容器,并允许用户进行交互
-i选项让docker分配一个伪终端并绑定到容器的标准输入上-i则是让容器的标准输入保持打开
当用户在bash里面退出时,容器也会自动退出,因为里面没有运行其他的东西,容器也就停止了
17286@LAPTOP-IV46MOMH ~ docker run -it ubuntu:18.04 /bin/bash
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
284055322776: Pull complete
Digest: sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6
Status: Downloaded newer image for ubuntu:18.04
root@a0e17d0f958e:/# pwd
/
root@a0e17d0f958e:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@a0e17d0f958e:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
12 pts/0 00:00:00 ps
root@a0e17d0f958e:/#
有时候执行docker run的时候因为命令无法正常执行容器会出错直接退出,常见的代码错误包括:
- 125 :Docker daemon 执行出错,例如指定了不支持的Docker 命令参数;
- 126: 所指定命令无法执行,例如权限出错;
- 127:容器内命令无法找到。
守护态运行
更多的时候,需要让 Docker 容器在后台以守护态形式运行。此时可以使用 -d 参数来实现
17286@LAPTOP-IV46MOMH ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17286@LAPTOP-IV46MOMH ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17286@LAPTOP-IV46MOMH ~ docker run -it ubuntu:18.04 /bin/bash
root@6c0e37a75b5a:/# exit
exit
17286@LAPTOP-IV46MOMH ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17286@LAPTOP-IV46MOMH ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c0e37a75b5a ubuntu:18.04 "/bin/bash" 17 seconds ago Exited (0) 11 seconds ago relaxed_bhaskara
17286@LAPTOP-IV46MOMH ~ docker run -it -d ubuntu:18.04 /bin/bash
8693bdd50cce204166e775c39fb26a5c17a16bf56b2334a5a07e709995dfa036
17286@LAPTOP-IV46MOMH ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8693bdd50cce ubuntu:18.04 "/bin/bash" 3 seconds ago Up 3 seconds vigilant_tesla
17286@LAPTOP-IV46MOMH ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8693bdd50cce ubuntu:18.04 "/bin/bash" 7 seconds ago Up 7 seconds vigilant_tesla
6c0e37a75b5a ubuntu:18.04 "/bin/bash" 37 seconds ago Exited (0) 32 seconds ago relaxed_bhaskara
查看容器输出(日志)
可以通过 docker [container] logs 命令获取容器的输出信息。 该命令支持的选项包括:
- -details : 打印详细信息
- -f,-follow : 持续保持输出
- -since string: 输出从某个时间开始的日志
- -tail string : 输出最近的若干信息
- -t, -timestamps : 显示时间戳信息
- -until string : 输出某个时间之前的日志
例如,查看某容器最新的日志输出 docker logs -tail kong
停止容器
暂停容器
可以使用docker pause 容器名称将容器进行停止
PS C:\Users\fe> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fce480b3756 ubuntu:18.04 "/bin/bash" About a minute ago Up About a minute jolly_ramanujan
PS C:\Users\fe> docker pause jolly_ramanujan
jolly_ramanujan
PS C:\Users\fe> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fce480b3756 ubuntu:18.04 "/bin/bash" About a minute ago Up About a minute (Paused) jolly_ramanujan
处于pause(暂停)的容器可以使用docker unpause 镜像名称进行恢复,这两个命令后面可以跟着多个容器名称
PS C:\Users\fe> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4092ec02e35a ubuntu:18.04 "/bin/bash" About a minute ago Up About a minute test
0fce480b3756 ubuntu:18.04 "/bin/bash" 6 minutes ago Up 6 minutes jolly_ramanujan
PS C:\Users\fe> docker pause jolly_ramanujan test
jolly_ramanujan
test
PS C:\Users\fe> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4092ec02e35a ubuntu:18.04 "/bin/bash" 2 minutes ago Up 2 minutes (Paused) test
0fce480b3756 ubuntu:18.04 "/bin/bash" 6 minutes ago Up 6 minutes (Paused) jolly_ramanujan
PS C:\Users\fe> docker unpause jolly_ramanujan test
jolly_ramanujan
test
PS C:\Users\fe> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4092ec02e35a ubuntu:18.04 "/bin/bash" 2 minutes ago Up 2 minutes test
0fce480b3756 ubuntu:18.04 "/bin/bash" 6 minutes ago Up 6 minutes jolly_ramanujan