docker容器的管理

一、创建容器的常用选项

1、常用参数说明
选项描述
-i, –interactive交互式
-t, –tty分配一个伪终端
-d, –detach运行容器到后台
-e, –env设置环境变量
-p, –publish list发布容器端口到主机
-P, –publish-all发布容器所有EXPOSE的端口到宿主机随机端口
–name string指定容器名称
-h, –hostname设置容器主机名
–ip string指定容器IP,只能用于自定义网络
–network连接容器到一个网络
–mount mount将文件系统附加到容器
-v, –volume list绑定挂载一个卷
–restart string容器退出时重启策略,默认no,可选值:always或on-failure
2、常用参数实践
#测试itd和不加it的区别
[root@localhost ~]# docker run -d  --name jia1  centos
[root@localhost ~]# docker run -itd  --name jia2  centos

#发现jia1挂掉,jia2运行。
[root@localhost ~]# docker ps -a|grep centos 
2e9bf8ea2a7b   centos    "/bin/bash"              24 seconds ago       Up 23 seconds                             jia2
bb25e7c2d64d   centos    "/bin/bash"              About a minute ago   Exited (0) About a minute ago             jia1
【原因】
1、由于centos本身没有进程,所以创建了会1自动退出了
2、如果是纯净镜像,没任何进程,则需要加-it
3、进入容器时需要加-it
4、nginx、tomcat等本身有进程,则可以不用加-it
#启动nginx容器,并且暴露端口为8081,容器名称jiawenchao,容器退出总是重启,并且在后台运行
docker run -d --restart=always  -e ABC=123 -e CDE=456 -p 8081:80 --name jiawenchao -h web nginx:latest
#查看启动容器
[root@localhost ~]# docker ps|grep jiawenchao
db7ebee4837c   nginx:latest   "/docker-entrypoint.…"   21 seconds ago   Up 20 seconds   0.0.0.0:8081->80/tcp, :::8081->80/tcp   jiawenchao
#进入容器查看
[root@localhost ~]# docker exec -it jiawenchao /bin/bash
#查看主机名称
root@web:/# hostname 
web
#查看变量
root@web:/# echo $ABC
123
root@web:/# echo $CDE
456

【参数说明】:
-d 			                    #开启Daemon模式,以守护进程方式运行(后台)
--restart=always	            #在容器退出时总是(docker开机/重启)自动启动
-p 8081:80		                #指定端口映射(容器暴露端口/镜像本身暴露端口)
--name jiawenchao 	            #容器识别名称jiawenchao
nginx:latest			        #镜像名称
-P				                #默认匹配docker容器的80端口号到宿主机的80 to 65535端口
-p 容器暴露端口:基础镜像端口    	#指定端口号8081:80
--rm			                #退出时删除容器
-h web                          #指定容器主机名为web
-e ABC=123 -e CDE=456           #设置环境变量ABC=123 CDE=456

挂载宿主机三个文件修改:

hostname        # --hostname
host            # --add-host
resolv.conf     # --dns

#命令帮助详细查看
[root@localhost ~]# docker run  --help |grep dns
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains
[root@localhost ~]# docker run  --help |grep host
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
      --cgroupns string                Cgroup namespace to use (host|private)
                                       'host':    Run the container in the Docker host's cgroup namespace
      --device list                    Add a host device to the container
  -h, --hostname string                Container host name
      --oom-score-adj int              Tune host's OOM preferences (-1000 to 1000)
  -p, --publish list                   Publish a container's port(s) to the host
[root@localhost ~]# docker run  --help |grep hostname
  -h, --hostname string                Container host name


二、创建容器并做资源限制

【详解网址】https://www.cnblogs.com/zhuochong/p/9728383.html

1、参数介绍
选项描述
-m,–memory容器可以使用的最大内存量
–memory-swap允许交换到磁盘的内存量 (尽量不使用,硬盘的速度很慢))
–memory-swappiness=<0-100>容器使用SWAP分区交换的百分比(0-100,默认为-1)
–oom-kill-disable禁用OOM Killer(物理内存不足时,,查找一个消耗资源大kill掉)
–cpus可以使用的CPU数量
–cpuset-cpus限制容器使用特定的CPU核心,如(0-3, 0,1)
–cpu-sharesCPU共享(相对权重)

2、示例

内存限额:

#允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer
docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx

#查看
[root@localhost ~]# docker stats nginx03
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS
382df7bf0b7f   nginx03   0.00%     1.984MiB / 500MiB   0.40%     648B / 0B   0B / 7.17kB   3

#和一个并未被限制对比内存
[root@localhost ~]# docker stats web1
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O     PIDS
928f069f0180   web1      0.00%     1.977MiB / 3.685GiB   0.05%     648B / 0B   0B / 9.22kB   3

CPU限额:

#允许容器最多使用一个半的CPU
docker run -d --name nginx04 --cpus="1.5" nginx

#允许容器最多使用50%的CPU(.5即为50%):
docker run -d --name nginx05 --cpus=".5" nginx

#查看
docker stats nginx04
docker stats nginx05

三、管理容器常用命令

1、常用参详
选项描述
ls列出容器
inspect查看一个或多个容器详细信息
exec在运行容器中执行命令
commit创建一个新镜像来自一个容器
cp拷贝文件/文件夹到一个容器
logs获取一个容器日志
port列出或指定容器端口映射
top显示一个容器运行的进程
stats显示容器资源使用统计
stop/start/restart停止/启动一个或多个容器
rm删除一个或多个容器
prune移除已停止的容器
2、操作详解

【命令大全】https://www.runoob.com/docker/docker-command-manual.html

ls:
#列出在运行容器
docker container ls 

#列出在所有容器
docker container ls -a 

#查看帮助
docker container ls --help

inspect:
##查看容器IP地址
docker  inspect id |grep -i ipaddr

#查容器详情
docker  inspect

exec:
#进入容器终端
docker  exec  -it  容器id  /bin/bash 

#查看容器的IP地址
docker  exec  id ifconfig			
commit:
#将容器web1 保存为新的镜像,并添加提交人信息和说明信息。
docker commit -a "作者名称" -m "说名文字" web1  nginx:v1 
cp:
#将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/

#将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/runoob 96f7f14e99ab:/www

#将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
docker cp  96f7f14e99ab:/www /tmp/	

logs:
#查看容器mynginx从2016年7月1日后的最新10条日志。
docker logs --since="2016-07-01" --tail=10 mynginx

#跟踪查看容器mynginx的日志输出。
docker logs -f mynginx
port;
#容器必须在有映射端口方能查看
 docker port 容器名称
top:
#查看容器mymysql的进程信息。
docker top mymysql

#查看所有运行容器的进程信息。
for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
stats:
#查看WEB1资源使用
[root@localhost ~]# docker stats web1
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O     PIDS
928f069f0180   web1      0.00%     1.977MiB / 3.685GiB   0.05%     648B / 0B   0B / 9.22kB   3

【参数说名】:
CPU % and MEM %	            #容器正在使用的主机CPU和内存的百分比
MEM USAGE / LIMIT	        #容器正在使用的总内存以及允许使用的总内存量
NET I/O                 	#容器通过其网络接口发送和接收的总数据量
BLOCK I/O	                #容器已从主机上的块设备读取和写入的数据量
PIDs                        #容器创建的进程或线程数
stop/start/restart:
#关闭容器
docker stop 容器名称/容器ID

#启动容器
docker start 容器名称/容器ID

#重启容器
docker restart 容器名称/容器ID
rm:
#删除容器
docker rm <CONTAINER_ID>

#强制删除容器
docker rm -f <CONTAINER_ID>	

#删除所有容器
docker rm `docker ps -a -q`	

#停止运行的容器
docker kill `docker ps -q` 

#删除已经停止的所有容器
docker rm `docker images -q -a`  

#强制删除镜像名称中包含“doss-api”的镜像
docker rmi  -f  $(docker images | grep doss-api | awk '{print $3}')
prune:
#移除没标记(none)和使用的镜像
docker image prune

#清除所有没有容器引用的镜像,增加一个 -a 标志就可以搞定
docker image prune -a

#只清除超过创建时间超过24小时的镜
docker image prune -a --filter "until=24h"

四、容器核心技术

1、namespace

在容器化中,一台物理计算机可以运行多个不同操作系统,那就需要解决“隔离性”,彼此感知不到对方存在,有问题互不影响。

Linux内核从2.4.19版本开始引入了namespace概念,其目的是将特定的全局系统资源通过抽象方法使得namespace中的进程看 起来拥有自己隔离的资源。Docker就是借助这个机制实现了容器资源隔离。

Linux的Namespace机制提供了6种不同命名空间:

  • IPC:隔离进程间通信
  • MOUNT:隔离文件系统挂载点
  • NET:隔离网络协议栈
  • PID:隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
  • USER:隔离用户 • UTS:隔离主机名和域名
#利用liunx特性,特定的全局系统资源查看
[root@master ~]# ll /proc/$$/ns
total 0
lrwxrwxrwx 1 root root 0 Aug 16 10:55 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Aug 16 10:55 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Aug 16 10:55 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 Aug 16 10:55 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Aug 16 10:55 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Aug 16 10:55 uts -> uts:[4026531838]

2、CGroups

Docker利用namespace实现了容器之间资源隔离,但是namespace不能对容器资源限制,比如CPU、内存。

如果某一个容器属于CPU密集型任务,那么会影响其他容器使用CPU,导致多个容器相互影响并且抢占资源。

如何对多个容器的资源使用进行限制就成了容器化的主要问题。

答:引入Control Groups(简称CGroups),限制容器资源

CGroups: 所有的任务就是运行在系统中的一个进程,而 CGroups 以某种标准将一组进程为目标进行资源分配和控制。

例如CPU、内存、带宽等,并且可以动态配置。

CGroups主要功能:

  • 限制进程组使用的资源数量( Resource limitation ):可以为进程组设定资源使用上限,例如内存
  • 进程组优先级控制( Prioritization ):可以为进程组分配特定CPU、磁盘IO吞吐量
  • 记录进程组使用的资源数量( Accounting ):例如使用记录某个进程组使用的CPU时间
  • 进程组控制( Control ):可以将进程组挂起和恢复
[root@master ~]# ls /sys/fs/cgroup/ -l
total 0
drwxr-xr-x 6 root root  0 Jan 20  2021 blkio
lrwxrwxrwx 1 root root 11 Jan 20  2021 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Jan 20  2021 cpuacct -> cpu,cpuacct
drwxr-xr-x 6 root root  0 Jan 20  2021 cpu,cpuacct
drwxr-xr-x 4 root root  0 Jan 20  2021 cpuset
drwxr-xr-x 6 root root  0 Jan 20  2021 devices
drwxr-xr-x 4 root root  0 Jan 20  2021 freezer
drwxr-xr-x 4 root root  0 Jan 20  2021 hugetlb
drwxr-xr-x 6 root root  0 Jan 20  2021 memory
lrwxrwxrwx 1 root root 16 Jan 20  2021 net_cls -> net_cls,net_prio
drwxr-xr-x 4 root root  0 Jan 20  2021 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Jan 20  2021 net_prio -> net_cls,net_prio
drwxr-xr-x 4 root root  0 Jan 20  2021 perf_event
drwxr-xr-x 6 root root  0 Jan 20  2021 pids
drwxr-xr-x 6 root root  0 Jan 20  2021 systemd

ls /sys/fs/cgroup/ -l 查看cgroups可控制的资源:

  • blkio :对快设备的IO进行限制。
  • cpu:限制CPU时间片的分配,与cpuacct挂载同一目录。
  • cpuacct :生成cgroup中的任务占用CPU资源的报告,与cpu挂载同一目录。
  • cpuset :给cgroup中的任务分配独立的CPU(多核处理器)和内存节点。
  • devices :允许或者拒绝 cgroup 中的任务访问设备。
  • freezer :暂停/恢复 cgroup 中的任务。
  • hugetlb :限制使用的内存页数量。
  • memory :对cgroup 中任务的可用内存进行限制,并自动生成资源占用报告。
  • net_cls :使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制程序(tc)可以识别来自特定从cgroup 任务的数据包,并进行网络限制。
  • net_prio:允许基于cgroup设置网络流量的优先级。
  • perf_event:允许使用perf工具来监控cgroup。 • pids:限制任务的数量。

容器实际资源限制位置:

/sys/fs/cgroup/<资源名>/docker/<容器ID>

例:

#对容器内存限制查看
[root@master ~]# cat    /sys/fs/cgroup/memory/docker/b3078f86d06d43c624a928523353c9877ee57e3ed7767052fcd700c33af20e1d/tasks
3453
3528
3529
3530
3531

#查看进程找出对应服务
[root@master ~]# ps -ef|grep 3528
root      3194 10495  0 13:47 pts/0    00:00:00 grep --color=auto 3528
101       3528  3453  0 Aug05 ?        00:00:00 nginx: worker process


#查看未对内存限制值
[root@master ~]# cat    /sys/fs/cgroup/memory/docker/b3078f86d06d43c624a928523353c9877ee57e3ed7767052fcd700c33af20e1d/memory.limit_in_bytes
9223372036854771712

#查看
[root@master ~]# docker stats b307
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
b3078f86d06d        chao1               0.00%               3.09MiB / 3.701GiB   0.08%               116B / 0B           0B / 12.3kB         5

#动态修改
[root@master ~]# cat /sys/fs/cgroup/memory/docker/b3078f86d06d43c624a928523353c9877ee57e3ed7767052fcd700c33af20e1d/memory.limit_in_bytes
9223372036854771712

#动态修改内存限制100M
[root@master ~]# echo "100M" >/sys/fs/cgroup/memory/docker/b3078f86d06d43c624a928523353c9877ee57e3ed7767052fcd700c33af20e1d/memory.limit_in_bytes
[root@master ~]# cat /sys/fs/cgroup/memory/docker/b3078f86d06d43c624a928523353c9877ee57e3ed7767052fcd700c33af20e1d/memory.limit_in_bytes
104857600

#发现动态修改内存限制成功
[root@master ~]# docker stats b307
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
b3078f86d06d        chao1               0.00%               3.09MiB / 100MiB    3.09%               116B / 0B           0B / 12.3kB         5


五、Docker核心组件之间关系

  • Docker Daemon:Docker守护进程,负责与Docker Clinet交互,并管理镜像、容器。
  • Containerd:是一个简单的守护进程,向上给Docker Daemon提供接口,向下通过containerd-shim结合runC管理容器。
  • runC:一个命令行工具,它根据OCI标准来创建和运行容器。
    在这里插入图片描述
#进程查看
[root@master ~]# ps ajxf|grep nginx
10495 14539 14538 10495 pts/0    14538 S+       0   0:00      |   \_ grep --color=auto nginx
27357 27382 27382 27382 ?           -1 Ss       0   0:00  |   |   \_ nginx: master process nginx -g daemon off;
27382 27484 27382 27382 ?           -1 S      101   0:00  |   |       \_ nginx: worker process
27382 27488 27382 27382 ?           -1 S      101   0:00  |   |       \_ nginx: worker process
27382 27489 27382 27382 ?           -1 S      101   0:00  |   |       \_ nginx: worker process
27382 27491 27382 27382 ?           -1 S      101   0:00  |   |       \_ nginx: worker process

六、知识点总结

 Namespace

命名空间,Linux内核提供的一种对进程资源隔离的机制,例如进程、网络、挂载点等资源。

 CGroups

控制组,Linux内核提供的一种对进程组限制资源的机制;例如CPU、内存等资源。

 UnionFS

联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统,形成一种分层的模型。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨话浮生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值