零基础学习 Docker(二)| 基本命令的使用
0. 系列导读
本系列共六篇:
- 零基础学习 Docker(一)| 安装与运行
- 零基础学习 Docker(二)| 基本命令的使用
- 零基础学习 Docker(三)| 关于镜像
- 零基础学习 Docker(四)| 关于网络通信
- 零基础学习 Docker(五)| 关于存储
- 零基础学习 Docker(六)| 关于多主机管理
1. 相关命令
# 运行
docker run [-d] --name <contain name> --hostname <hostname> <image> /bin/bash -c "while true;do sleep 1;done"
# 进入
docker attach <contain id> -> ctl+p+q 退出
docker exec -it <contain id> bash -> exit 退出,bash必须指定
# 二者有什么区别
1. attach 查看命令输出,和docker log [-f] <contain id> 一样
2. exec -it 进入交互模式
# 查看日志输出
docker logs [-f] <contain id> # -f 和 tail -f 一样时时输出
# 更名
docker rename <contain id> <new name>
# 关闭容器
docker stop <contain id> # 久一些
docker kill <contain id> # 快一些
# 开启容器
docker start <contain id>
# 让httpd遇到出错后,也能自动重启
docker run -d --restart=always httpd
# 暂停
docker pause <contain id> # 这时候可以做快照了
docker unpause <contain id>
# 删除容器
docker rm <contain id> <contain id>...
# 创建一个容器
docker create <image>
2. 内存限额
$ docker run -m 200M --memory-swap=300M ubuntu
-m 或 --memory:设置内存的使用限额,例如 100M, 2G。
--memory-swap:设置 内存+swap 的使用限额。
$ docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
--vm 1:启动 1 个内存工作线程。
--vm-bytes 280M:每个线程分配 280M 内存。如果分配超过300,就会出错,容器退出
3. cpu配额
默认设置下,所有容器可以平等地使用 host CPU 资源并且没有限制。
Docker 可以通过 -c
或 --cpu-shares
设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
通过-c
设置的cpu share
并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share
占所有容器 cpu share
总和的比例。所以说权重值越大,能分配到的资源就越多。
# 如果当前host只有一个cpu,那运行这个容器后,用top查看,可以发现,一个容器就可以把cpu压满。
docker run --name container_A -it -c 1024 <image> --cpu 1
# 如果当前host还是只有一个cpu,那运行这个容器A和B后,用top查看,A占用2/3,B占用1/3的 CPU 资源
docker run --name container_A -it -c 1024 <image> --cpu 1
docker run --name container_B -it -c 512 <image> --cpu 1
4. blkio配额
Block IO
限制不同容器的读写资源分配
Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽。
默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight
参数来改变容器 block IO 的优先级。设置的是相对权重值,默认为 500。
# 这个例子限制A的读写带宽是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。
# 举例
# 限制写入sda这块盘每秒只能写入30M
docker run -it --device-write-bps /dev/sda:30MB ubuntu
docker run -it ubuntu
time dd if=/dev/zero out=test.out bs=1M count=800 oflag=direct # 测试速度
5. cgroup
cgroup
全称Control Group
。Linux
操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。
在相应路径下,每个容器都有对应一个以id命令的文件夹,里面有一些配置文件,就记录了配额信息。
1. cpu
路径:/sys/fs/cgroup/cpu/docker
2. memory
路径:/sys/fs/memory/cpu/docker
3. blkio
路径:/sys/fs/blkio/cpu/docker
6. namespace
namespace
管理着 host
中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace
实现了容器间资源的隔离。
namespace 有下面六种
1. Mount namespace
让容器有自己的 / 目录,可以执行 mount 和 umount 命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。
2. UTS namespace
让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h 或 --hostname 参数设置。
3. IPC namespace
让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起。
4. PID namespace
让容器拥有自己独立的一套 PID,而不与其他容器或者host冲突。
5. Network namespace
让容器拥有自己独立的网卡、IP、路由等资源。我们会在后面网络章节详细讨论。
6. User namespace
让容器能够管理自己的用户,host 不能看到容器中创建的用户。
正在运行的容器
文件夹内容