第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 imageforubuntu: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=truefalse
--detach-keys=""从 attach 模式退出的快捷键
--entrypoint=""镜像存在入口命令时,覆盖为新的命令
--expose=[]指定容器会暴露出来的端口或者端口范围
--group-add=[]运行容器的用户组
-i, --interactive=truefalse
--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=truefalse
-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=truefalse
-t,--tty=truefalse
--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=truefalse
--init在容器中执行一个 init 进程,来响应信号和处理僵尸状态的子进程
--kernel-momory=""限制容器内核的内存大小,单位可以是 b、k、m 或 g
-m,--memory=""限制容器内应用使用的内存,单位可以时 b、k、m 或 g
--memory-reservation=""当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值
--memory-swap="LIMIT"限制容器使用内存和交换区的总大小
--oom-kill-disable=truefalse
--oom-score-adj=""调整容器的内存耗尽参数
--pids-limit=""限制容器的 pid 格式
--privileged=truefalse
--read-only=truefalse
--security-opt=[]指定一些安全参数,包括权限、安全能力、apparmor 等
--stop-signal=SIGTERM指定停止容器的系统信号
--shm-size=""/dev/shm 的大小
--sig-proxy=truefalse
--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 imageforubuntu: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 minutetest
0fce480b3756 ubuntu:18.04"/bin/bash"6 minutes ago Up 6 minutes jolly_ramanujan
PS C:\Users\fe> docker pause jolly_ramanujantest
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_ramanujantest
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 minutestest
0fce480b3756 ubuntu:18.04"/bin/bash"6 minutes ago Up 6 minutes jolly_ramanujan