欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

容器

程序员文章站 2022-06-17 08:25:22
...
01.如何运行容器
#启动容器 -d 后台,--name指定容器运行的名称
[email protected]:~# docker run   --name "my_httpd_server" -d httpd
8bd623b3e7b88c585f99aeab17e97c597e2e0193d65f581a61d0c58ebb0d6043
#查看容器
[email protected]:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS                    NAMES
8bd623b3e7b8        httpd               "httpd-foreground"       22 seconds ago      Up 20 seconds                     80/tcp                   my_httpd_server
#干掉容器 短ID=长ID的前12位  如何指定容器:1)长ID 2)短ID 3)name
[email protected]:~# docker stop 8bd623b3e7b8
8bd623b3e7b8

02.进入容器
#运行一个
docker run -d centos /bin/bash -c "while true;do sleep 1;echo hha;done"
#attached进入 attach 直接进入容器 启动命令 的终端,不会启动新的进程
docker attach a4967bf73180af7f5a02f9fa464bb50d46798060ae57b427e000dfb7d4f03f64
#exec进入 exec 则是在容器中打开新的终端,并且可以启动新的进程
docker exec -it  a4967bf73180af7f5a02f9fa464bb50d46798060ae57b427e000dfb7d4f03f64
#查看log
docker logs -f a4967bf73180af7f5a02f9fa464bb50d46798060ae57b427e000dfb7d4f03f64

03.容器运行的最佳实践
按用途容器大致可分为两类:服务类容器和工具类的容器
A.服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。
B.工具类容器通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行,比如

04.docker create start stop restart pause unpause  rm/rmi 
--restart=always 意味着无论容器因何种原因退出(包括正常退出),就立即重启。该参数的形式还可以是 --restart=on-failure:3,意思是如果启动进程退出代码非0,则重启容器,最多重启3次。

下面是容器的常用操作命令:

create      创建容器  
run         运行容器  
pause       暂停容器  
unpause     取消暂停继续运行容器  
stop        发送 SIGTERM 停止容器  
kill        发送 SIGKILL 快速停止容器  
start       启动容器  
restart     重启容器  
attach      attach 到容器启动进程的终端  
exec        在容器中启动新进程,通常使用 "-it" 参数  
logs        显示容器启动进程的控制台输出,用 "-f" 持续打印  
rm          从磁盘中删除容器

05.限制对内存的使用
内存限额
与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap。 Docker 通过下面两组参数来控制容器内存的使用量。

-m 或 --memory:设置内存的使用限额,例如 100M, 2G。

--memory-swap:设置 内存+swap 的使用限额。

当我们执行如下命令:

docker run -m 200M --memory-swap=300M ubuntu

其含义是允许该容器最多使用 200M 的内存和 100M 的 swap。默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。

06.限制对CPU的使用
Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。

与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。

换句话说:通过 cpu share 可以设置容器使用 CPU 的优先级。

比如在 host 中启动了两个容器:

docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu

container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

07.限制容器的BLOCK IO
Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论。

注:目前 Block IO 限额只对 direct IO(不使用文件缓存)有效。

block IO 权重
默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级。

--blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。在下面的例子中,container_A 读写磁盘的带宽是 container_B 的两倍。

docker run -it --name container_A --blkio-weight 600 ubuntu   
docker run -it --name container_B --blkio-weight 300 ubuntu

08.底层实现技术
cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。/sys/fs/cgroup/下有container的ID
namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。