Skip to content
On this page

docker004 container 容器

容器是镜像的一个运行实例.

查看

bash
# docker ps
# ps选项常用的是a和q
  -a, --all             Show all containers (default shows just running)
  -q, --quiet           Only display container IDs
docker ps -a

docker container ls
docker container ls -a

# 查看容器内部信息
docker top id

创建

docker run = docker create + docker start

bash
docker run --help
# Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# examples
# 1. 交互式
docker run -it ubuntu /bin/bash
# 2. daemon方式

常用options如下:

  • 创建容器 docker create

stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

--rm: 容器执行完命令或程序后就销毁

-P: 随机端口映射,容器内部端口随机映射到主机的高端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

--name="nginx-lb": 为容器指定一个名称;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;

--volume , -v: 绑定一个卷

  • 启动容器 docker start

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

退出容器

bash
# 1. run进去, exit方式退出, 容器停止
# 2. run进去, ctrl+p+q退出, 容器不停止

与容器运行模式相关参数

与容器和环境配置相关参数

与容器资源限制和安全保护相关参数

终止容器 docker stop

bash
docker stop 容器ID或名称(ID可以简写,唯一即可)
docker container stop

# 停止所有容器
docker stop $(docker ps -a -q)

暂停容器 pause/unpause

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

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

进入容器

attach

缺点: 所有attach的终端会同步显示,阻塞

exec

退出不会导致容器停止

docker exec -it xxxxxxxx /bin/bash

nsenter工具

删除容器 docker rm

bash
# docker rm 一次可以指定多个容器,如果希望批量删除所有已经退出的容器,可以执行如下命令:
docker rm -v $(docker ps -aq -f status=exited)

# 因为没有使用 -v,volume 遗留了下来。对于这样的孤儿 volume,可以用 docker volume rm 删除:
# 如果想批量删除孤儿 volume,可以执行:
docker volume ls
docker volume rm $(docker volume ls -q)

导入/导出容器

docker export x.tar xxx docker import x.tar - test/ubuntu:v1.0

容器限额

限额内存(run)

docker run --help

容器可使用的内存包括两部分:物理内存和 swap

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

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

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

下面我们将使用 progrium/stress 镜像来学习如何为容器分配内存。该镜像可用于对容器执行压力测试。执行如下命令:

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

--vm 1:启动 1 个内存工作线程。

--vm-bytes 280M:每个线程分配 280M 内存。

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M

如果在启动容器时只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍,比如:

docker run -it -m 200M ubuntu

容器最多使用 200M 物理内存和 200M swap。

限额CPU(run)

docker run --help

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

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

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

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

限额Block IO(run)

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

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

--blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。

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

限制 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

cp复制命令

bash
# 从container复制到宿主机
docker cp [options] container:path localPath 
# 从宿主机复制到container
docker cp [options] localPath container:path

logs查看日志

bash
docker logs -f  --tail 20 container
docker logs --tail 20 -t 00since  container

Last updated:

Released under the MIT License.