一、创建容器的常用选项
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-shares | CPU共享(相对权重) |
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
联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统,形成一种分层的模型。