零基础学习 Docker(二)| 基本命令的使用

作者: 王炳明 分类: Docker 发布时间: 2020-12-25 14:26 热度:140

0. 系列导读

本系列共六篇:

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

bpsiops限制单个容器的读写速度。

  • 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 GroupLinux 操作系统通过 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 不能看到容器中创建的用户。

正在运行的容器
零基础学习 Docker(二)|  基本命令的使用插图
文件夹内容
零基础学习 Docker(二)|  基本命令的使用插图(1)

weixin

文章有帮助,请作者喝杯咖啡?

发表评论

邮箱地址不会被公开。 必填项已用*标注