[Docker 4] Docker 容器
第 4 章 Docker 容器
指定容器
# 指定容器
<container> = "短ID" / "长ID" / "容器名称"
4.1 容器常用命令
# 创建容器
docker create ...
# 后台方式启动容器
docker start <container>
# 创建并运行容器
docker run = docker create + docer start
# 重启
docker --restart
# -it 以交互模式进入容器,并打开终端
docker run -it <container>
# -d 后台运行容器
docker run -d <container>
# --name 为容器命名
docker run --name "my.http.servre" -d <container>
# 查看当前运行的容器,-a显示所有状态的容器
docker ps [-a]
or
docker container ls [-a]
# 两种方法进入容器
# 1. docker attach <container>("长ID")
# 退出:Ctrl+p,然后 Ctrl+q 退出attach终端
# 2. docker exec -it <container>("短ID") bash|sh
# 查看进程:ps -elf
# 退出:exit
# 3. attach VS exec
# (1) attach 直接进入容器启动命令的终端,不会启动新的进程;exec 则在容器中打开新的终端,并且可以启动新的进程。
# (2) 如果想直接在终端中查看命令的输出,用attach;其他情况使用exec
# 查看启动命令的输出, -f 类似 tail -f ,持续打印输出
docker logs -f <container>
-
create
:创建容器 -
start
:启动容器 -
ps
:查看运行的容器,-a 显示所有状态的容器 -
run
:运行容器docker run = docker create + docer start
Options Mean -i 以交互模式运行容器,通常与 -t 同时使用; -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用; -d 后台运行容器,并返回容器ID; -
stop
:发送SIGTERM停止容器 -
restart
:重启容器,相当于 docker stop + docker start–restart=always 无论容器以何种原因退出(包括正常退出),都立即重启。
–restart=on-failure:3,意思是如果启动进程退出代码非 0,则重启容器,最多重启 3 次。
-
kill
:发送SIGKILL快速停止容器 -
pause
:暂停运行容器,暂停的容器不会占用 CPU 资源 -
unpause
:继续运行容器 -
attach
:attach 到容器启动进程的终端 -
exec
:在容器中启动新进程,通常使用 “-it” 参数 -
logs
:显示容器启动进程的控制台输出,用 “-f” 持续打印 -
rm
:从磁盘中删除容器,可以删除不会再重启的容器,以减少占用 host 文件系统资源# 批量删除所有已经退出的容器 docker rm -v $(docker ps) # 查看所有 httpd 容器 [root@CentOS7 ~]# docker ps -a | grep httpd d7050c2cabf0 httpd "httpd-foreground" 13 days ago Exited (0) 12 days ago pensive_faraday 63dcc8bd1687 httpd "httpd-foreground" 13 days ago Exited (0) 13 days ago condescending_lamport # 删除所有 httpd 镜像创建容器 [root@CentOS7 ~]# docker ps -a | grep httpd | awk '{print $1}' | xargs -n1 -I {} docker rm {}
注意:
docker rm
是删除容器,docker rmi
是删除镜像。
4.2 如何运行服务器/工具类容器
1. 服务器类容器
服务器容器类以 daemon 的形式运行,对外提供服务,比如 Web Server、数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it
进入容器。
# 启动容器
docker run -d <container>
# 进入容器
docker exec -it <container>("短ID")
# 查看进程
ps -elf
# 退出
exit
2. 工具类容器
工具类容器通常为了提供临时工作环境,常以 run -it
方式运行,run -it
的作用是在容器启动后就直接进入。
# run -it 的作用是在容器启动后就直接进入
docker run -it <container>
# 退出
exit
4.3 资源限制
4.3.1 内存限额
-m
|--memory
:设置内存的使用限额,例如 100MB,2GB。--memory-swap
:设置内存+swap 的使用限额,不指定则默认为-m
的两倍。--vm
1:启动 1 个内存工作线程。--vm-bytes 280M
:每个线程分配 280M 内存。
# 启动一个容器并使用 progrium/stress 进行压力测试,分配 200MB 内存和 100MB 的 swap
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
4.3.2 CPU 限额
-c
| --cpu-shares
:设置 CPU 权重,不指定则默认值为 1024。
**注:分配的是权重值,比如有两个容器,一个为1024,另一个为512,则在 CPU 压满时,前者 CPU 资源是后者的两倍。若某一方空闲,另一方也可以分配到全部 CPU **
# 启动 container_A, cpu share 为 1024
docker run --name container_A -it -c 1024 progrium/stress --cpu 1
# 启动 container_B, cpu share 为 512
docker run --name container_B -it -c 512 progrium/stress --cpu 1
# 在 host 中执行top,查看容器对 CPU 的使用情况
top
# 暂停 container_A,再次查看 CPU
docker pause container_A
top
4.3.3 Block IO 带宽限额
1. block IO 权重
-blkio-weight
:设置 Block IO 磁盘读写优先级。
# container_A 读写磁盘的带宽是 container_B 的两倍
docker run -it --name container_A --blkio-weight 600 ubuntu
docker run -it --name container_B --blkio-weight 300 ubuntu
2. 限制 bps 和 iops
bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。
--device-read-bps
:限制读某个设备的 bps。--device-write-bps
:限制写某个设备的 bps。--device-read-iops
:限制读某个设备的 iops。--device-write-iops
:限制写某个设备的 iops。
# 限制容器写 /dev/sda 的速率为 30MB/s
docker run -it --device-write-bps /dev/sda:30MB ubuntu
# 测试:dd 测试在容器中写磁盘的速度,容器的文件系统是在 host /dev/sda 上,所以相当于对 host /dev/sda 进行写操作。另外,oflag=direct 指定用 direct IO 方式写文件,这样 --device-write-bps 才能生效
time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
# 不限速对比
docker run -it ubuntu
time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
4.4 实现容器的底层技术
4.4.1 cgroup
/sys/fs/cgroup 保存了容器所有 cgroup 相关的配置
- sys/fs/cgroup/cpu/docker/容器ID :容器与 cpu 相关的 cgroup 配置
- sys/fs/cgroup/memory/docker/容器ID :容器与内存相关的 cgroup 配置
- sys/fs/cgroup/blkio/docker/容器ID :容器与 Block IO 相关的 cgroup 配置
# 启动一个容器
docker run -it --cpu-shares 512 progrium/stress -c 1
# 查看容器 ID
docker ps
# 查看容器 cpu 相关的 cgroup 配置
ls /sys/fs/cgroup/cpu/docker/容器 ID
4.4.2 namespace
namespace 使得每个容器认为自己拥有文件系统、网卡等独立的资源。它管理着 host 中全局唯一的资源,实现了容器间资源的隔离。
- Mount namespace : 容器看上去有整个文件系统,有自己的
/
目录,可以mount
和unmount
。 - UTS namespace : 容器有自己的hostname。
- IPC namespace : 容器拥有自己的共享内存和信号量来实现进程间的通信。
- PID namespace : 容器在 host 中以进程的形式运行。host 通过
docker ps
查看容器进程,容器通过ps axf
查看容器内的进程。所有容器的进程都挂在 dockerd 进程下。 - Network namespace : 容器拥有自己独立的网卡、IP、路由等资源。
- User namespace : 容器能够管理自己的用户,host 不能看到容器中创建的用户。 容器可以使用
useradd 用户名
创建用户。
声明:该篇博文,仅记录个人学习笔记,详细内容参考《每天5分钟玩转Docker容器技术.CloudMan》。如有侵权,请告知删除。