容器

运行容器

docker run 是启动容器的方法。在讨论 Dockerfile 时我们已经学习到,可用三种方式指定容器启动时执行的命令:

CMD 指令。

ENDPOINT 指令。

在 docker run 命令行中指定。

 容器启动时执行 pwd,返回的 / 是容器中的当前目录。 执行 docker ps 或 docker container ls 可以查看 Docker host 中当前运行的容器:

 让容器长期运行

我们可以加上参数 -d 以后台方式启动容器

CONTAINER ID 是容器的 “短ID”,前面启动容器时返回的是 “长ID”。短ID是长ID的前12个字符。

NAMES 字段显示容器的名字,在启动容器时可以通过 --name 参数显示地为容器命名,如果不指定,docker 会自动为容器分配名字。

两种进入容器的方法

docker attach

通过 docker attach 可以 attach 到容器启动命令的终端,可通过 Ctrl+p 然后 Ctrl+q 组合键退出 attach 终端

docker exec

通过 docker exec 进入相同的容器

① -it 以交互模式打开 pseudo-TTY,执行 bash,其结果就是打开了一个 bash 终端。

② 进入到容器中,容器的 hostname 就是其 “短ID”。

③ 可以像在普通 Linux 中一样执行命令。ps -elf 显示了容器启动进程while 以及当前的 bash 进程。

④ 执行 exit 退出容器,回到 docker host。

docker exec -it <container> bash|sh 是执行 exec 最常用的方式。

attach VS exec
attach 与 exec 主要区别如下:

attach 直接进入容器 启动命令 的终端,不会启动新的进程。

exec 则是在容器中打开新的终端,并且可以启动新的进程。

如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。

当然,如果只是为了查看启动命令的输出,可以使用 docker logs 命令: -f 的作用与 tail -f 类似,能够持续打印输出。

运行容器的最佳实践

1. 服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。

2. 工具类容器通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行,比如:

运行 busybox,run -it 的作用是在容器启动后就直接进入。我们这里通过 wget 验证了在容器中访问 internet 的能力。执行 exit 退出终端,同时容器停止。

工具类容器多使用基础镜像,例如 busybox、debian、ubuntu 等。

 

容器常用操作

stop/start/restart 容器

通过 docker stop 可以停止运行的容器。

容器在 docker host 中实际上是一个进程,docker stop 命令本质上是向该进程发送一个 SIGTERM 信号。如果想快速停止容器,可使用 docker kill 命令,其作用是向容器进程发送 SIGKILL 信号。

对于处于停止状态的容器,可以通过 docker start 重新启动

docker start 会保留容器的第一次启动时的所有参数。

docker restart 可以重启容器,其作用就是依次执行 docker stop 和docker start。

容器可能会因某种错误而停止运行。对于服务类容器,我们通常希望在这种情况下容器能够自动重启。启动容器时设置 --restart 就可以达到这个效果。

--restart=always 意味着无论容器因何种原因退出(包括正常退出),就立即重启。该参数的形式还可以是 --restart=on-failure:3,意思是如果启动进程退出代码非0,则重启容器,最多重启3次。

pause/unpause 容器

有时我们只是希望暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,这时可以执行 docker pause

处于暂停状态的容器不会占用 CPU 资源,直到通过 docker unpause 恢复运行。

删除容器

使用 docker 一段时间后,host 上可能会有大量已经退出了的容器。

 

 这些容器依然会占用 host 的文件系统资源,如果确认不会再重启此类容器,可以通过 docker rm 删除。

docker rm 一次可以指定多个容器,如果希望批量删除所有已经退出的容器,可以执行如下命令:

docker rm -v $(docker ps -aq -f status=exited)

顺便说一句:docker rm 是删除容器,而 docker rmi 是删除镜像。

Docker命令-docker start/stop/stats/restart

docker start

启动一个或多个已停止的容器

$ docker start [options] container [container...]

--attach, -a 连接容器

--checkpoint 从某一个切入点还原(类似快照?)

--checkpoint-dir 使用一个自定义的切入点目录

--detach-keys 覆盖默认的后台运行命令

--interactive, -i 连接容器终端

$ docker start my_container

docker stop

停止一个或多个docker容器。

$ docker stop [options] container [container...]

--time, -t 10 停止容器之前需要等待的时间(秒)

eg: $ doker stop muy_container

docker stats

查看运行中的容器资源状态信息,也可以指指定已停止的容器,但是不会返回任何信息。

$ docker stats [options] [container...]

不加容器ID则显示所有运行中容器的信息。

--all, -a 查看所有容器信息(默认显示运行中的)

--format Go模板展示镜像信息

--no-stream 不展示容器的一些动态信息

--no-trunc 不截断容器信息,例如展示容器完整64位ID

docker restart

重启一个或多个容器

$ docker restart [options] container [container...]

--time, -t 10 停止容器之前需要等待的时间(秒)

eg: $ docker restart my_container

docker kill

杀掉一个或多个运行中的容器

$ docker kill [options] container [container...]

--signal, -s KILL 向容器发送信号

使用示例

向容器发送一个KILL信号(默认)$ docker kill my_container

向容器发送一个自定义信号
例如发送一个SIGHUP信号 $ docker kill -s=SIGHUP my_container

你可以通过名字或数字指定自定义信号,SIG前缀是可选的,例如下面的命令是等价的:

$ docker kill -s=SIGHUP my_container
$ docker kill -s=HUP my_container
$ docker kill -s=1 my_container

docker stop VS docker kill

两个命令都是发送信息并停止容器,但是docker stop有一个可选的停止容器的前置时间通知,而docker kill则没有。

可以看出用docker stop是一个更优雅的停止容器的方式。

限制容器对内存的使用

内存限额

与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap。 Docker 通过下面两组参数来控制容器内存的使用量。

-m 或 --memory:设置内存的使用限额,例如 100M, 2G。

--memory-swap:设置 内存+swap 的使用限额。

当我们执行如下命令:

docker run -m 200M --memory-swap=300M ubuntu

其含义是允许该容器最多使用 200M 的内存和 100M 的 swap。默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。

限制容器对CPU的使用

默认设置下,所有容器可以平等地使用 host CPU 资源并且没有限制。

Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。

与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。

换句话说:通过 cpu share 可以设置容器使用 CPU 的优先级。

docker run --name "container_A" -c 1024 ubuntu

docker run --name "container_B" -c 512 ubuntu


container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

需要特别注意的是,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU。

限制容器的 Block IO

Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论。

注:目前 Block IO 限额只对 direct IO(不使用文件缓存)有效

block IO 权重

默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级。

--blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。在下面的例子中,container_A 读写磁盘的带宽是 container_B 的两倍。

docker run -it --name container_A --blkio-weight 600 ubuntu

docker run -it --name container_B --blkio-weight 300 ubuntu

限制 bps 和 iops

bps 是 byte per second,每秒读写的数据量

iops 是 io per second,每秒 IO 的次数

可通过以下参数控制容器的 bps 和 iops:

--device-read-bps,限制读某个设备的 bps。

--device-write-bps,限制写某个设备的 bps。

--device-read-iops,限制读某个设备的 iops。

--device-write-iops,限制写某个设备的 iops。

下面这个例子限制容器写 /dev/sda 的速率为 30 MB/s

docker run -it --device-write-bps /dev/sda:30MB ubuntu

 

 

 

 

 

 

 

posted @ 2020-02-05 17:57  弱水三千12138  阅读(196)  评论(0)    收藏  举报