docker004 container 容器
容器是镜像的一个运行实例.
查看
# 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
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次。
退出容器
# 1. run进去, exit方式退出, 容器停止
# 2. run进去, ctrl+p+q退出, 容器不停止
与容器运行模式相关参数
与容器和环境配置相关参数
与容器资源限制和安全保护相关参数
终止容器 docker stop
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
# 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复制命令
# 从container复制到宿主机
docker cp [options] container:path localPath
# 从宿主机复制到container
docker cp [options] localPath container:path
logs查看日志
docker logs -f --tail 20 container
docker logs --tail 20 -t 00since container