[Docker 4] Docker 容器

13 篇文章 0 订阅
7 篇文章 0 订阅

第 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

    OptionsMean
    -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 内存限额

  1. -m | --memory:设置内存的使用限额,例如 100MB,2GB。
  2. --memory-swap:设置内存+swap 的使用限额,不指定则默认为 -m 的两倍。
  3. --vm 1:启动 1 个内存工作线程。
  4. --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 : 容器看上去有整个文件系统,有自己的 / 目录,可以 mountunmount
  • UTS namespace : 容器有自己的hostname。
  • IPC namespace : 容器拥有自己的共享内存和信号量来实现进程间的通信。
  • PID namespace : 容器在 host 中以进程的形式运行。host 通过 docker ps 查看容器进程,容器通过 ps axf 查看容器内的进程。所有容器的进程都挂在 dockerd 进程下。
  • Network namespace : 容器拥有自己独立的网卡、IP、路由等资源。
  • User namespace : 容器能够管理自己的用户,host 不能看到容器中创建的用户。 容器可以使用useradd 用户名 创建用户。

声明:该篇博文,仅记录个人学习笔记,详细内容参考《每天5分钟玩转Docker容器技术.CloudMan》。如有侵权,请告知删除。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值