一、查看 Docker 基本情况
1、查看 Docker 版本
查看 Docker 版本包括 Docker 版本号、API 版本号、对应的 Git Commit、Containerd 和 runC的版本信息等。
# docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:05:12 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:03:33 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.6
GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version: 1.1.2
GitCommit: v1.1.2-0-ga916309
docker-init:
Version: 0.19.0
GitCommit: de40ad0
OCI:Open Container Initiative的简称,由Linux基金会主导开发OCI规范和标准,目的是围绕容器格式和Runtime(运行时)制定的一个开放的工业化标准。
Containerd:Docker为了兼容OCI标准,将容器Runtime及其管理功能从Docker守护进程中剥离出来,用于不启动Docker也能直接通过Containerd来管理容器。
RunC:Docker按照OCF(Open Container Format)开放容器格式标准制定的一个轻量级工具,可以使用RunC不通过Docker引擎即可实现容器的启动、停止和资源隔离等功能。
2、查看 Docker 详细信息
# docker info
Client: # Client 端
Context: default
Debug Mode: false # 是否开启 Debug 模式
........
Server: # Server 端
Containers: 37 # 容器个数
Running: 37 # 正在运行的容器个数
Paused: 0 # 暂停的容器个数
Stopped: 0 # 停止的容器个数
Images: 122 # 镜像个数
Server Version: 20.10.17 # 当前服务器 Docker Server 的版本
Storage Driver: overlay2 # 存储驱动,一般为 overlay2,性能好速度快。其他驱动 aufs、overlay、brtfs
Backing Filesystem: extfs # 服务器文件系统
Supports d_type: true # 目录条目类型,用来表示一个文件是文件、管道还是套接字。在格式化 xfs 文件系统时,必须指定 ftype=1
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file # 日志驱动,json-file 表示存在本地
Cgroup Driver: cgroupfs # 限制和隔离的驱动,生产环境建议使用 systemd
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog # Docker 支持的日志驱动
Swarm: inactive # Docker 官方的容器编排工具,inactive 不开启,active 开启
.........
Docker Root Dir: /var/lib/docker # Docker 根目录,生产环境建议使用 SSD 硬盘,或者独立的磁盘,不要和系统盘用同一个磁盘。
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://12azv802.mirror.aliyuncs.com/
Live Restore Enabled: true # Docker 热更新,生产环境建议设置为 true
二、Docker镜像命令
1、搜索镜像
nginx为关键字,可替换
# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 18001 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 183
bitnami/nginx Bitnami nginx Docker Image 150 [OK]
2、拉取/下载镜像
# 把公网上的镜像拉取到本地服务器,不指定版本号为 latest
# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:b8f2383a95879e1ae064940d9a200f67a6c79e710ed82ac42263397367e7cc4e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#拉取指定版本
# docker pull nginx:1.20
1.20: Pulling from library/nginx
Digest: sha256:38f8c1d9613f3f42e7969c3b1dd5c3277e635d4576713e6453c6193e66270a6d
Status: Downloaded newer image for nginx:1.20
docker.io/library/nginx:1.20
当出现以下情况时表示无法连接到docker镜像库
# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ...
Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ...
Get https://registry-1.docker.io/v2/networkboot/dhcpd/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Anetworkboot%2Fdhcpd%3Apull&service=registry.docker.io: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
解决办法:配置加速器
3、查看镜像信息
查看本地所有镜像,添加仓库名称:[标签]时为指定镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a99a39d070bf 3 weeks ago 142MB
nginx 1.20 0584b370e957 8 months ago 141MB
参数 | 说明 |
---|---|
REPOSITORY | 镜像属于的仓库 |
TAG | 镜像的标签信息,标记同—个仓库中的不同镜像 |
IMAGE ID | 镜像的唯一ID号,唯一标识了该镜像 |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
获取镜像的详细信息
# docker inspect nginx:1.20
4、更改镜像 tag
为本地镜像添加新的名称为web,新的标签为nginx
# docker tag nginx:latest web:nginx
# 如果是推送到自己公司内部的镜像仓库,可以使用如下命令 docker tag nginx:latest 你公司的镜像仓库地址/nginx:latest
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a99a39d070bf 3 weeks ago 142MB
web nginx a99a39d070bf 3 weeks ago 142MB
prom/node-exporter latest 0da6a335fe13 2 months ago 22.5MB
nginx 1.20 0584b370e957 8 months ago 141MB
5、删除镜像
删除掉 web:nginx 镜像
# docker rmi web:nginx
Untagged: web:nginx
当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉所有指向该镜像的标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
6、导出镜像和载入镜像
1、把镜像导出
# docker save -o nginx.tar nginx:latest
# ls -lh nginx.tar
-rw------- 1 root root 140M Feb 1 14:55 nginx.tar
或者
# docker save > nginx.tar nginx:latest
# docker save nginx:latest | gzip > alpine-latest.tar.gz
如果我们结合这两个命令以及 ssh 甚至 pv 的话,利用 Linux 强大的管道,我们可以写一个命令完成从一个机器将镜像迁移到另一个机器,并且带进度条的功能
# docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
2、把文件*.tar中载入镜像到本地镜像库中
# docker load --input nginx.tar
Loaded image: nginx:latest
或者
# docker load < nginx.tar
# docker load -i nginx.tar
-i : 指定导入的文件,代替 STDIN
也可从本地光盘中导入
# docker load --input /media/nginx.tar
7、推送镜像
推送本地镜像到远程仓库
# docker push 远程仓库名/nginx-v2:test
三、Docker容器操作
1、容器的创建与启动
1、 新建一个容器
# docker create -it --name nginx nginx:latest
1a0b30a0e4f901ef376f03c3b456c4d11d0db0880ba3f2d5ced06e18646cca32
2、查看容器
查看正在运行的容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
查看所有容器,包括正在运行和没有运行的容器
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a0b30a0e4f9 nginx:latest "/docker-entrypoint.…" 33 seconds ago Created nginx
3、启动容器
# docker start nginx
2、容器的运行与终止
1、运行一个容器
# docker run -itd --name nginx nginx:latest
69b09f3d42616f70b4c8a544958fb11813fdc53bbd7f11cddaa50f205a8039c2
参数 | 说明 |
---|---|
-i | 可交互 |
-t | 伪终端 |
-d | 后台运行 |
--name | 给容器命名 |
--restart=always | 始终保持运行(随着docker开启而运行) |
--rm | 会随着退出容器的操作而删除容器 |
2、停止容器运行
# docker stop nginx
3、重启容器
# docker restart nginx
4、挂起容器
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69b09f3d4261 nginx:latest "/docker-entrypoint.…" About a minute ago Up 35 seconds (Paused) 80/tcp nginx
5、恢复状态
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69b09f3d4261 nginx:latest "/docker-entrypoint.…" About a minute ago Up 54 seconds 80/tcp nginx
6、删除容器
# docker rm nginx
nginx
# docker rm -f nginx //强制删除正在运行的容器
3、容器的进入
1、正在运行着的容器nginx
# docker exec -it nginx /bin/bash
root@8d38bdbad453:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@8d38bdbad453:/# exit
exit
或者
# docker attach nginx
区别 | 进入方式 | 退出状态 | 本质 |
---|---|---|---|
exec | 需要添加-i -t选项,后边还需要给容器一个shell环境 | 如果执行exit退出,容器仍然保持运行 | 会生产新的进程 |
attach | 可以直接进入 | 如果执行exit退出,容器会被关闭。如果想要保持容器不被关闭,可以使用键盘: Ctrl + p Ctrl + q可以实现 | 不会生产新进程 |
4、容器的文件传输
宿主机和容器之前相互传东西
# docker cp 123.txt nginx:/root
# docker exec -it nginx /bin/bash
root@8d38bdbad453:/# cd /root
root@8d38bdbad453:~# ls
123.txt
5、从容器创建一个新的镜像
# docker commit nginx nginx:123
sha256:194d63a4e61d1122ce19051b47e06957e29702161ab399fe51a7055f447a71e5
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 123 194d63a4e61d 14 seconds ago 142MB
nginx latest a99a39d070bf 3 weeks ago 142MB
四、Docker资源控制
默认情况下,容器没有资源限制,并且可以在主机的内核调度程序允许的情况下使用尽可能多的给定资源。Docker 提供了一些方法来控制容器可以使用多少内存或 CPU,设置docker run
命令的运行时配置标志。
1、对CPU的控制
1、CPU核心控制
对多核CPU的服务器,docker还可以控制容器运行限定使用哪些cpu内核和内存节点,即使用–cpuset-cpus和–cpuset-mems参数。对具有NUMA拓扑(具有多CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则–cpuset-mems的配置基本上不会有明显效果。 使用示例:
表示创建的容器只能用0、1、2这三个内核
docker run -tid --name cpu1 --cpuset-cpus 0-2 ubuntu
最终生成的cgroup的cpu内核配置如下:
# cat /sys/fs/cgroup/cpuset/docker/<容器的完整长ID>/cpuset.cpus
0-2
容器中的进程可以在 cpu 1 和 cpu 3 上执行
docker run -it --cpuset-cpus="1,3" ubuntu:22.04 /bin/bash
使用命令创建容器,命令中的–cpu-shares 参数值不能保证可以获得一个vcpu或者多少GHz的cpu资源,它仅是一个弹性的加权值。这仅在 CPU 周期受限时强制执行。当有足够的 CPU 周期可用时,所有容器都会根据需要使用尽可能多的 CPU。这样,这是一个软限制。--cpu-shares
不会阻止容器以 swarm 模式进行调度。它为可用的 CPU 周期确定容器 CPU 资源的优先级。它不保证或保留任何特定的 CPU 访问权限。
docker run -itd --cpu-shares 100 centos:stress stress -c 10
2、CPU相对份额限制
所谓CPU相对份额限制,指的是给Docker的镜像分配一个“份额”,使得当CPU资源紧张时,不同的Docker镜像之间对CPU资源的竞争大致上是按照这个份额的比例来进行使用的。
但是,CPU的相对份额限制又不是绝对的,即当CPU资源不紧张时,任何一个Docker容器都可以“任意”占据CPU资源。这样,即使是一个份额比较小的Docker容器,占据的CPU资源也会超过份额比较大的Docker容器。
Docker容器在执行运行命令时,可以使用-c(或者是–cpu-shares)参数来指定该容器的CPU使用份额。在默认情况下,Docker容器的CPU份额是1024。
由于该参数对CPU限制的特殊性,因此,当系统中只有一个Docker容器在运行的时候,该参数的配置是没有意义的。即,这种CPU限制只会在CPU资源紧缺时才会生效,任何一个Docker容器都可以在CPU资源不紧缺的时候,都可以任意的占据使用CPU,这种限制此时不会生效,同样的,这种限制也无法保证Docker容器获得多长的CPU使用时间或者是CPU频率。
# docker run -itd --name test -c 512 centos:7 /bin/bash # 限制CPU的权重为512
# docker exec -it test /bin/bash
# cat /sys/fs/cgroup/cpu/cpu.shares
512
3、CPU使用绝对限制
不同与CPU的份额相对限制,Docker还支持一种“硬性”的对CPU资源的限制。我们都知道,现代操作系统为了保证多程序多任务的运行,对CPU的使用采取了分片的策略,CPU在使用时会不断的从一个任务切换到另一个任务,每次获得CPU资源的进程实际上就是获得了CPU的使用权,或者说获得了CPU分片。
在Docker容器运行时,我们可以通过–cpu-period和–cpu-quota参数来指定Docker容器对CPU的占用情况。–cpu-priod参数指定容器对CPU使用的分配周期,而–cpu-quota则指定了在该周期内,该进程最多可以使用CPU的时间。–cpu-period和–cpu-quota的单位均为微妙(1秒=1000000微妙)。
例如,我们设置–cpu-period为1000000,设置–cpu-quota的值为100000,则表示在1秒钟内,该Docker容器使用CPU最长为0.1秒。
–cpu-period参数的最小值为1000,最大值为1000000,默认值为100000。–cpu-quota的默认值为-1,表示不进行控制。
# docker run -itd --cpu-period 1000000 --cpu-quota 100000 --name test centos /bin/bash
# docker exec -it test /bin/bash
# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
1000000
# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
100000
除了使用--cpu-period
和--cpu-quota
设置 CPU 周期约束外,还可以指定--cpus
一个浮点数来达到相同的目的。
例如,如果有 1 个 CPU,则将达到与设置和(50% CPU)--cpus=0.5
相同的结果。--cpu-period=50000``--cpu-quota=25000
docker run -it --cpus=".5" centos /bin/bash
2、限制容器对内存的访问
重要的是不要让正在运行的容器消耗过多的主机内存。在 Linux 主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出OOME
, or Out Of Memory Exception
,并开始终止进程以释放内存。任何进程都可能被杀死,包括 Docker 和其他重要应用程序。如果错误的进程被杀死,这可以有效地导致整个系统崩溃。
Docker 试图通过调整 Docker 守护进程的 OOM 优先级来降低这些风险,这样它比系统上的其他进程更不容易被杀死。容器的 OOM 优先级没有调整。这使得单个容器更有可能被杀死,而不是 Docker 守护进程或其他系统进程被杀死。您不应尝试通过--oom-score-adj
在守护程序或容器上手动设置为极端负数,或通过--oom-kill-disable
在容器上设置来规避这些保护措施。
限制新建容器的内存使用限额为 512MB
# docker run -tid -m 512MB dhcp:dhcp
f708e0d599606750bde50af156d2604c62d18334faa02a5853d484f7dc8d1f11
限制该容器最多使用200M内存和100M的swap
# docker run -itd --name test -m 200MB --memory-swap 100MB centos:7
3、对Block IO的限制
--device-write-bps
参数限制了设备的写入速率(每秒字节数)。例如,此命令创建一个容器并将写入速率限制为40mb
每秒/dev/sda
,只能限制设备而不能限制分区
# docker run -it --device-write-bps /dev/sda:40mb ubuntu
# time dd if=/dev/zero of=test bs=100M count=9 oflag=direct
9+0 records in
9+0 records out
943718400 bytes (944 MB) copied, 22.5101 s, 41.9 MB/s
real 0m22.523s
user 0m0.000s
sys 0m0.183s
--device-read-bps
标志限制了设备的读取速率(每秒字节数)。例如,此命令创建一个容器并将读取速率限制为1mb
每秒来自`/dev/sda
# docker run -it --device-read-bps /dev/sda:1mb ubuntu
--device-read-iops
标志限制了设备的读取速率(每秒 IO)。例如,此命令创建一个容器并将读取速率限制为 1000
每秒 IO /dev/sda
# docker run -ti --device-read-iops /dev/sda:1000 ubuntu
--device-write-iops
标志限制了设备的写入速率(每秒 IO)。例如,此命令创建一个容器并将 1000
每秒写入 IO的速率限制为/dev/sda
docker run -ti --device-write-iops /dev/sda:1000 ubuntu
评论区