docker技术入门与实战 第3版学习笔记之第4章

100 阅读11分钟

第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=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 (02 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.04Pulling from library/ubuntu
284055322776Pull complete
Digestsha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6
StatusDownloaded 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 (011 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 (032 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