2-2-1-docker管理和使用
1. 基础入门与安装
Docker 目前已经支持多种操作系统的安装运行, 比如Ubuntu、CentOS、Redhat、Debian、Fedora , 甚至是还支持了Mac和Windows , 在linux系统上需要内核版本在3.10或以上。
docker版本号之前一直是0.X版本或1.X版本 , 但是从2017年3月1号开始改为每个季度发布一次稳版 , 其版本号规则也统一变更为YY.MM , 例如17.09表示是2017年9月份发布的。
Docker之前没有区分版本 , 但是2017年推出(将docker更名为)新的项目Moby , github地址 : https://github.com/moby/moby , Moby项目属于Docker项目的全新上游 , Docker将是一个隶属于的Moby的子产品 , 而且之后的版本之后开始区分为CE(Docker Community Edition , 社区版本 )和 EE(Docker Enterprise Edition , 企业收费版 ) , CE社区版本和EE企业版本都是每个季度发布一个新版本 , 但是EE版本提供后期安全维护1年 , 而CE版本是4个月, 以下为官方(https://blog.docker.com/2017/03/docker-enterprise-edition/)原文 :
Docker CE and EE are released quarterly, and CE also has a monthly “Edge” option. Each Docker EE release is supported and maintained for one year and receives security and critical bugfixes during that period. We are also improving Docker CE maintainability by maintaining each quarterly CE release for 4 months. That gets Docker CE users a new 1-month window to update from one version to the next.如果要布署到kubernets上 , 需要查看相关kubernets对docker版本要求的说明, 比如:https://github.com/kubernetes/kubernetes/blob/v1.17.2/CHANGELOG-1.17.md
1.1 Ubuntu 安装与卸载
官方文档 : https://docs.docker.com/engine/install/ubuntu/
1.1.1 安装
更新
apt包索引 , 安装包允许apt通过 HTTPS 使用存储库。sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release添加docker官方的gpg证书
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg使用以下命令设置
stable的安装源。echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装docker引擎
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io如果需要安装特定版本的docker引擎,使用以下命令列出所有版本
root@ubuntu1804:~# apt-cache madison docker-ce docker-ce | 5:20.10.6~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:20.10.5~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:20.10.4~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:20.10.3~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:20.10.2~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:20.10.1~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:20.10.0~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:19.03.15~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:19.03.14~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:19.03.13~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:19.03.12~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:19.03.11~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:19.03.10~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages docker-ce | 5:19.03.9~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages安装特定版本的docker版本,例如版本:
5:20.10.6~3-0~ubuntu-bionicsudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io root@ubuntu1804:~# apt-get install docker-ce=5:20.10.6~3-0~ubuntu-bionic docker-ce-cli=5:20.10.6~3-0~ubuntu-bionic containerd.io验证安装是否正确
root@ubuntu1804:~# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world b8dfde127a29: Pull complete Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/此命令下载测试映像并在容器中运行它。当容器运行时, 它会打印一条信息性消息并退出。
安装脚本如下
[root@ubuntu1804 ~]#cat install_docker_ubuntu.sh
#!/bin/bash
#Description: Install docker on Ubuntu1804
#Version:1.0
#Date:2020-01-22
COLOR="echo -e \\033[1;31m"
END="\033[m"
DOCKER_VERSION="5:19.03.5~3-0~ubuntu-bionic"
install_docker(){
dpkg -s docker-ce &> /dev/null && {COLOR}"Docker已安装, 退出"{END} && exit
apt update
apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update
{COLOR}"Docker有以下版本"{END}
apt-cache madison docker-ce
{COLOR}"5秒后即将安装: docker-"{DOCKER_VERSION}" 版本....."{END}{COLOR}"如果想安装其它Docker版本, 请按ctrl+c键退出, 修改版本再执行"{END}
sleep 5
apt -y install docker-ce={DOCKER_VERSION} docker-ce-cli=${DOCKER_VERSION}
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker version && ${COLOR}"Docker 安装成功"${END} || ${COLOR}"Docker 安装失败"${END}
}
install_docker相关配置文件:
root@ubuntu1804:~# dpkg -L docker-ce
/.
/etc
/etc/default
/etc/default/docker
/etc/init
/etc/init/docker.conf
/etc/init.d
/etc/init.d/docker
/lib
/lib/systemd
/lib/systemd/system
/lib/systemd/system/docker.service
/lib/systemd/system/docker.socket
/usr
/usr/bin
/usr/bin/docker-init
/usr/bin/docker-proxy
/usr/bin/dockerd
/usr/share
/usr/share/doc
/usr/share/doc/docker-ce
/usr/share/doc/docker-ce/README.md
/usr/share/doc/docker-ce/changelog.Debian.gz1.1.2 卸载
[root@ubuntu ~]#apt purge docker-ce
[root@ubuntu ~]#rm -rf /var/lib/docker1.2 Centos 安装与卸载
官方文档 :https://docs.docker.com/engine/install/centos/
CentOS 6 因内核太旧 , 即使支持安装docker , 但会有各种问题 , 不建议安装
CentOS 7 的 extras 源虽然可以安装docker ,但包比较旧 , 建议从官方源或镜像源站点下载安装docker
CentOS 8 有新技术podman 代替 docker
[root@centos76 ~]# yum list docker
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.ustc.edu.cn
* extras: mirrors.ustc.edu.cn
* updates: mirrors.ustc.edu.cn
Available Packages
docker.x86_64 2:1.13.1-205.git7d71120.el7.centos extrasrpm包下载地址如下:
官方rpm包下载地址 : https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里镜像下载地址 : https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
安装步骤如下
通过yum源安装
yum install wget
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all
yum -y install docker-ce
systemctl enable --now docker如果需要卸载docker则运行以下命令
[root@centos7 ~]#yum remove docker-ce
[root@centos7 ~]#rm -rf /var/lib/docker通过以下命令验证docker的安装版本
root@ubuntu1804:~# docker version
Client: Docker Engine - Community
Version: 20.10.6
API version: 1.41
Go version: go1.13.15
Git commit: 370c289
Built: Fri Apr 9 22:46:01 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.6
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 8728dd2
Built: Fri Apr 9 22:44:13 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@ubuntu1804 ~]#docker info
Client:
Debug Mode: false #client 端是否开启 debug
Server:
Containers: 2 #当前 主机运行的容器总数
Running: 0 #有几个容器是正在运行的
Paused: 0 #有几个容器是暂停的
Stopped: 2 #有几个容器是停止的
Images: 4 #当前服务器的镜像数
Server Version: 19.03.5 #服务端版本
Storage Driver: overlay2 #正在使用的存储引擎
Backing Filesystem: extfs #后端文件系统, 即服务器的磁盘文件系统
Supports d_type: true #是否支持 d_type
Native Overlay Diff: true #是否支持差异数据存储
Logging Driver: json-file #日志类型
Cgroup Driver: cgroupfs #Cgroups 类型
Plugins: #插件
Volume: local #卷
Network: bridge host ipvlan macvlan null overlay #overlay跨主机通信
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog #日志类型
Swarm: inactive #是否支持 swarm
Runtimes: runc #已安装的容器运行时
Default Runtime: runc #默认使用的容器运行时
Init Binary: docker-init #初始化容器的守护进程, 即 pid 为 1的进程
containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339 #版本
runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657 #runc 版本
init version: fec3683 #init 版本
Security Options: #安全选项
apparmor #安全模块, https://docs.docker.com/engine/security/apparmor/
seccomp #安全计算模块, 即制容器操作, https://docs.docker.com/engine/security/seccomp/
Profile: default #默认的配置文件
Kernel Version: 4.15.0-29-generic #宿主机内核版本
Operating System: Ubuntu 18.04.1 LTS #宿主机操作系统
OSType: linux #宿主机操作系统类型
Architecture: x86_64 #宿主机架构
CPUs: 1 #宿主机 CPU 数量
Total Memory: 962MiB #宿主机总内存
Name: ubuntu1804.magedu.org #宿主机 hostname
ID: IZHJ:WPIN:BRMC:XQUI:VVVR:UVGK:NZBM:YQXT:JDWB:33RS:45V7:SQWJ #宿主机 ID
Docker Root Dir: /var/lib/docker #宿主机关于docker数据的保存目录
Debug Mode: false #server 端是否开启 debug
Registry: https://index.docker.io/v1/ #仓库路径
Labels:
Experimental: false #是否测试版
Insecure Registries:
127.0.0.0/8 : #非安全的镜像仓库
Registry Mirrors:
https://si7y70hh.mirror.aliyuncs.com/ #镜像仓库
Live Restore Enabled: false #是否开启活动重启(重启dockerdocker-daemon不关闭容器 )
WARNING: No swap limit support #系统警告 信息 (没有开启 swapswap资源限制 )最后WARNING: No swap limit support的报警,可以通过编辑以下文件解决
root@ubuntu1804:~# cat /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="swapaccount=1" #修改此行,添加swapaccount=1
root@ubuntu1804:~# update-grub
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-143-generic
Found initrd image: /boot/initrd.img-4.15.0-143-generic
Found linux image: /boot/vmlinuz-4.15.0-112-generic
Found initrd image: /boot/initrd.img-4.15.0-112-generic
done1.3 二进制编译
安装文档 : https://docs.docker.com/install/linux/docker-ce/binaries/
二进制下载路径 :
安装步骤
获取
docker二进制安装包[root@centos8 ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.5.tgz --2023-09-25 13:53:23-- https://download.docker.com/linux/static/stable/x86_64/docker-19.03.5.tgz Resolving download.docker.com (download.docker.com)... 108.139.1.114, 108.139.1.115, 108.139.1.19, ... Connecting to download.docker.com (download.docker.com)|108.139.1.114|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 63252595 (60M) [application/x-tar] Saving to: ‘docker-19.03.5.tgz’ docker-19.03.5.tgz 100%[======================================================================================================================>] 60.32M 6.38MB/s in 14s 2023-09-25 13:53:38 (4.45 MB/s) - ‘docker-19.03.5.tgz’ saved [63252595/63252595]解压
docker二进制包[root@centos8 ~]# tar -xf docker-19.03.5.tgz [root@centos8 ~]# ll /root/docker total 204720 -rwxr-xr-x 1 1000 1000 34625816 Nov 13 2019 containerd -rwxr-xr-x 1 1000 1000 6116160 Nov 13 2019 containerd-shim -rwxr-xr-x 1 1000 1000 18850136 Nov 13 2019 ctr -rwxr-xr-x 1 1000 1000 65641786 Nov 13 2019 docker -rwxr-xr-x 1 1000 1000 72090824 Nov 13 2019 dockerd -rwxr-xr-x 1 1000 1000 764144 Nov 13 2019 docker-init -rwxr-xr-x 1 1000 1000 2877369 Nov 13 2019 docker-proxy -rwxr-xr-x 1 1000 1000 8649792 Nov 13 2019 runc复制命令到
/usr/bin目录中[root@centos8 ~]# cp /root/docker/* /usr/bin/创建docker 用户组
[root@centos8 ~]# groupadd -r docker将
Ubuntu1804或CentOS7基于包方式安装的相关文件复制到相应目录下[root@centos7 ~]# scp /usr/lib/systemd/system/docker.* root@192.168.194.131:/usr/lib/systemd/system/ [root@centos7 ~]# scp /lib/systemd/system/containerd.service root@192.168.194.131:/usr/lib/systemd/system/ [root@centos8 ~]# cat /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket firewalld.service containerd.service time-set.target Wants=network-online.target containerd.service Requires=docker.socket [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutStartSec=0 RestartSec=2 Restart=always # Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229. # Both the old, and new location are accepted by systemd 229 and up, so using the old location # to make them work for either version of systemd. StartLimitBurst=3 # Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230. # Both the old, and new name are accepted by systemd 230 and up, so using the old name to make # this option work for either version of systemd. StartLimitInterval=60s # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity # Comment TasksMax if your systemd version does not support it. # Only systemd 226 and above support this option. TasksMax=infinity # set delegate yes so that systemd does not reset the cgroups of docker containers Delegate=yes # kill only the docker process, not all processes in the cgroup KillMode=process OOMScoreAdjust=-500 [Install] WantedBy=multi-user.target [root@centos8 ~]# cat /usr/lib/systemd/system/docker.socket [Unit] Description=Docker Socket for the API [Socket] # If /var/run is not implemented as a symlink to /run, you may need to # specify ListenStream=/var/run/docker.sock instead. ListenStream=/run/docker.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target [root@centos8 ~]# cat /usr/lib/systemd/system/containerd.service # Copyright The containerd Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/bin/containerd Type=notify Delegate=yes KillMode=process Restart=always RestartSec=5 # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNPROC=infinity LimitCORE=infinity LimitNOFILE=infinity # Comment TasksMax if your systemd version does not supports it. # Only systemd 226 and above support this version. TasksMax=infinity OOMScoreAdjust=-999 [Install]启动对应
systemd服务[root@centos8 ~]# systemctl daemon-reload [root@centos8 ~]# systemctl enable --now docker测试安装后的结果
[root@centos8 ~]# docker version Client: Docker Engine - Community Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 633a0ea838 Built: Wed Nov 13 07:22:05 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.5 API version: 1.40 (minimum version 1.12) Go version: go1.12.12 Git commit: 633a0ea838 Built: Wed Nov 13 07:28:45 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: v1.2.10 GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339 runc: Version: 1.0.0-rc8+dev GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657 docker-init: Version: 0.18.0 GitCommit: fec3683 [root@centos8 ~]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 719385e32844: Pull complete Digest: sha256:4f53e2564790c8e7856ec08e384732aa38dc43c52f02952483e3f003afbf23db Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/查看系统中对应进程
[root@centos8 ~]# pstree -p systemd(1)─┬─NetworkManager(887)─┬─{NetworkManager}(940) │ └─{NetworkManager}(941) ├─VGAuthService(885) ├─anacron(1588) ├─atd(992) ├─auditd(853)─┬─sedispatch(855) │ ├─{auditd}(854) │ └─{auditd}(856) ├─containerd(2402)─┬─{containerd}(2403) │ ├─{containerd}(2404) │ ├─{containerd}(2405) │ ├─{containerd}(2406) │ ├─{containerd}(2407) │ ├─{containerd}(2408) │ ├─{containerd}(2410) │ ├─{containerd}(2411) │ └─{containerd}(2412) ├─crond(986) ├─dbus-daemon(883) ├─dockerd(1812)─┬─{dockerd}(1813) │ ├─{dockerd}(1814) │ ├─{dockerd}(1815) │ ├─{dockerd}(1816) │ ├─{dockerd}(1817) │ ├─{dockerd}(1818) │ ├─{dockerd}(1819) │ ├─{dockerd}(1820) │ ├─{dockerd}(1926) │ └─{dockerd}(2106) ├─irqbalance(878)───{irqbalance}(893) ├─login(993)───bash(1485) ├─lsmd(879) ├─mcelog(882) ├─polkitd(880)─┬─{polkitd}(953) │ ├─{polkitd}(954) │ ├─{polkitd}(955) │ ├─{polkitd}(956) │ └─{polkitd}(1019) ├─rsyslogd(971)─┬─{rsyslogd}(1462) │ └─{rsyslogd}(1465) ├─smartd(877) ├─sshd(946)───sshd(1512)───sshd(1514)───bash(1515)───pstree(2413) ├─sssd(884)─┬─sssd_be(942) │ └─sssd_nss(957) ├─systemd(1476)───(sd-pam)(1478) ├─systemd-journal(737) ├─systemd-logind(977) ├─systemd-udevd(777) ├─tuned(947)─┬─{tuned}(1450) │ ├─{tuned}(1454) │ ├─{tuned}(1455) │ └─{tuned}(1456) └─vmtoolsd(886)─┬─{vmtoolsd}(904) └─{vmtoolsd}(908)
1.4 安装podman
在CentOS8上安装docker会自动安装podman ,docker工具只是一个脚本 , 调用了Podman
[root@centos8 ~]# dnf install docker
[root@centos8 ~]# rpm -ql podman-docker
/usr/bin/docker
/usr/lib/tmpfiles.d/podman-docker.conf
[root@centos8 ~]# cat /usr/bin/docker
#!/bin/sh
[ -f /etc/containers/nodocker ] || \
echo "Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg." >&2
exec /usr/bin/podman "$@"修改拉取镜像的地址的顺序 , 提高速度
[root@centos8 ~]#vim /etc/containers/registries.conf
[registries.search]
registries = ['docker.io' , 'quay.io' , 'registry.redhat.io', 'registry.access.redhat.com']2. docker 管理
2.1 存储引擎管理
目前docker的默认存储引擎为Overlay2。不同的存储引擎需要相应的系统支持, 如需要磁盘分区的时候传递d-type文件分层功能, 即需要传递内核参数开启格式化磁盘的时候指定功能。
官方文档关于存储引擎的相关文档:
https://docs.docker.com/storage/storagedriver/
https://docs.docker.com/storage/storagedriver/select-storage-driver/
AUFS: (AnotherUnionFS) 是一种Union FS, 是文件级的存储驱动。所谓UnionFS就是把不同物理位置的目录合并mount到同一个目录中。简单来说就是支持将不同目录挂载到一个虚拟文件系统下的。这种可以层层地叠加修改文件。无论底下有多少都是只读的 , 最上系统可写的。当需要修改一个文件时 ,AUFS创建该文件的一个副本 , 使用CoW将文件从只读层复制到可写进行修改 , 结果也保存在Docker 中 , 底下的只读层就是image, 可写层就是Container, 是Docker 18.06及更早版本的首选存储驱动程序 , 在内核3.13上运行Ubuntu 14.04时不支持overlay2Overlay: 一种Union FS文件系统 ,Linux内核3.18后支持overlay2:Overlay的升级版 , 到目前为止 , 所有Linux发行版推荐使用的存储类型 , 也是docker默认使用的存储引擎为overlay2, 需要磁盘分区支持d-type功能 , 因此需要系统磁盘的额外支持devicemapper: 因为早期CentOS和RHEL版本内核版本不支持overlay2, 默认使用的存储驱动程序 , 最大数据容量只支持100GB且性能不佳 , 当前较新版本的CentOS已经支持overlay2, 因此推荐使用overlay2ZFS(Sun -2005)/btrfs(Oracle-2007) : 目前没有广泛使用vfs: 用于测试环境 , 适用于无法使用copy-on -writewrite时的情况。 此存储驱动程序的性能很差, 通常不建议用于生产
Docker官方推荐首选存储引擎为overlay2 , 其次为devicemapper , 但是devicemapper存在使用空间方面的一些限制 , 虽然可以通过后期配置解决 , 但是官方依然推荐使用overlay2 , 以下是生产故障事例 : https://www.cnblogs.com/youruncloud/p/5736718.html
如果docker数据目录是一块单独的磁盘分区而且是xfs格式的 , 那么需要在格式化的时候加上参数-n ftype=1(启用此功能表示节点文件类型存入在目录结构中) , 否则后期在启动容器的时候会报错不支持d-type
[root@centos76 ~]# xfs_info /
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=3276800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=13107200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=6400, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0如果不配置该参数,会出现如下图所示报错。

CentOS7.3修复了此问题。
2.1.1 overlay2
Overlay2 将一个 Linux 主机中的两个目录组合起来, 一个在上, 一个在下, 对外提供统一的视图。这两个目录就是层layer , 将两个层组合在一起的技术被称为联合挂载(union mount)。在Overlay2中 , 上层的目录被称作 upperdir, 下层的目录被称作 lowerdir, 对外提供的统一视图被称作 merged。
官网的图片很生动 , 就是原来diff目录叫upperdir。官网还没有更新。 OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层 , 统一过程被称为联合挂载。OverlayFS关联的底层目录称为lower , 合并过后统一视图称为merged。
下图是一个docker镜像和docker容器的分层图 , docker镜像是lower, docker容器是diff。而统一的视图层是merged层

注意到 , 镜像层和容器层可以有相同的文件 , 这种情况下 , upperdir 中的文件覆盖 lowerdir 中的文件。
注:
Overlay2文件系统最多支持 128 个层数叠加 , 也就是说你的Dockerfile最多只能写 128 行。
2.1.1.1 工作机制
在centos7.6中通过docker pull ubuntu命令下载了一个ubuntu镜像。 下载的镜像共有图中所示的三层:2afde...57cd; 68a51...c3a1; cf65b...3ba3。目录中(/var/lib/docker/overlay2)l(小写的L),这里面都是软连接文件目录的简写标识, 这个主要是为了避免mount时候页大小的限制。

查看ubuntu镜像中的三层对应目录中的内容。

每一层中,link文件对应l目录中的链接目录。lower目录中可以查看该层中对应的下级目录内容。可以看到68a51...c3a1目录中没有lower文件,表示该层为最底层 ; cf65b...3ba3的lower文件中可以看到其他两层,表示该层为最顶层。 2afde...57cd为中间层

使用命令运行一个容器docker run -ti ubuntu /bin/bash。可以看到生成了两个新的目录

新增的目录中,查看不带-init的目录中的信息。与原本的最顶层cf65b...3ba3相比,多了merged目录,这个目录就是我们再container里边看到的目录结构。 读写层-init , 这个只读层, 它的目的是为了初始化容器配置信息, 譬如hostname等信息

如果这个时候将ubuntu容器中的/usr/bin目录下的文件sleep、sync两个文件拷贝到/home目录下,之后在/home目录下面创建一个文件xiong.test。之后查看diff目录。可以看出已经将sleep、sync这两个文件在目录/usr/bin目录中标记为删除了。

2.1.1.2 文件操作
官网的图片很生动 , 就是原来diff目录叫upperdir。官网还没有更新。 OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层 , 统一过程被称为联合挂载。OverlayFS关联的底层目录称为lower , 合并过后统一视图称为merged。
下图是一个docker镜像和docker容器的分层图 , docker镜像是lower, docker容器是diff。而统一的视图层是merged层。

读 :
如果该文件在容器层不存在 : 文件不存在
diff中, 则从lower中读取 。只在容器层存在 : 文件只存在
diff中 , 则直接从容器中读取该文件文件同时存在容器曾和镜像层 : 容器层
diff会覆盖镜像层lowdir中的文件
修改
在
diff中不存在 , 在overlay和overlay2中 , 执行copy_up操作 , 把文件从lowdir拷贝到diff。然后所以的更改都是在容器层内修改副本的操作 , 由于overlayfs是文件级别的 , 不是块级别的 , 这就意味着即使文件只有很少的一点修改 , 也会产生的copy_up的行为, 不过有两点需要注意 :copy_up操作只发生在文件首次写入, 以后都是只修改副本overlayfs只适用两层 , 因此性能很好 , 查找搜索都更快
删除文件和目录
当文件在容器被删除时 , 在容器层(
diff)创建whiteout文件 , 镜像层的文件是不会被删除的 , 因为他们是只读的 , 但without文件会阻止他们展现 , 当目录在容器内被删除时 , 在容器层(diff)一个不透明的目录 , 这个和上面whiteout原理一样 , 阻止用户继续访问, 即便镜像层仍然存在
2.1.2 aufs
aufs的全称是advanced multi-layered unification filesystem , 主要功能是把多个文件夹的内容合并到一起 , 提供一个统一的视图 , 主要用于各个Linux发行版的livecd中 , 以及docker里面用来组织image。
据说由于aufs代码的可维护性不好(代码可读性和注释不太好) , 所以一直没有被合并到Linux内核的主线中去 , 不过有些发行版的kernel里面维护的有该文件系统 , 比如在ubuntu 16.04的内核代码中 , 就有该文件系统。
在使用aufs之前 , 可以通过下面的命令确认当前系统是否支持aufs。
#下面的命令如果没有输出, 表示内核不支持aufs
root@ubuntu1804:~# grep aufs /proc/filesystems
nodev aufs
#这里nodev表示该文件系统不需要建在设备上
root@ubuntu1804:~# grep -i aufs /boot/config-4.15.0-143-generic
CONFIG_AUFS_FS=m
CONFIG_AUFS_BRANCH_MAX_127=y
# CONFIG_AUFS_BRANCH_MAX_511 is not set
# CONFIG_AUFS_BRANCH_MAX_1023 is not set
# CONFIG_AUFS_BRANCH_MAX_32767 is not set
CONFIG_AUFS_SBILIST=y
# CONFIG_AUFS_HNOTIFY is not set
CONFIG_AUFS_EXPORT=y
CONFIG_AUFS_INO_T_64=y
CONFIG_AUFS_XATTR=y
# CONFIG_AUFS_FHSM is not set
# CONFIG_AUFS_RDU is not set
CONFIG_AUFS_DIRREN=y
# CONFIG_AUFS_SHWH is not set
# CONFIG_AUFS_BR_RAMFS is not set
# CONFIG_AUFS_BR_FUSE is not set
CONFIG_AUFS_BR_HFSPLUS=y
CONFIG_AUFS_BDEV_LOOP=y
# CONFIG_AUFS_DEBUG is not set
modprobe aufs注:
aufs相关挂载选项可以查看帮助文档:http://manpages.ubuntu.com/manpages/xenial/en/man5/aufs.5.html
# mount -t aufs -o br=./Branch-0:./Branch-1:./Branch-2 none ./MountPoint-t aufs: 指定挂载类型为aufs-o br=./Branch-0:./Branch-1:./Branch-2: 表示将当前目录下的Branch-0,Branch-1,Branch-2三个文件夹联合到一起none:aufs不需要设备 , 只依赖于-o br指定的文件夹 , 所以这里填none即可./MountPoint: 表示将最后联合的结果挂载到当前的MountPoint目录下, 然后我们就可以往这个目录里面读写文件了如果有重复的文件名 , 在mount命令行上 , 越往前的就优先级越高。
假设Branch-0里面有文件001.txt、003.txt, Branch-1里面有文件001.txt、003.txt、004.txt, Branch-2里面有文件002.txt、003.txt。
/*001.txt(b0)表示Branch-0的001.txt文件, 其它的以此类推*/
+-------------+-------------+-------------+-------------+
MountPoint | 001.txt(b0) | 002.txt(b2) | 003.txt(b0) | 004.txt(b1) |
+-------------+-------------+-------------+-------------+
↑ ↑ ↑ ↑
| | | |
+-------------+-------------+-------------+-------------+
Branch-0 | 001.txt | | 003.txt | |
+-------------+-------------+-------------+-------------+
Branch-1 | 001.txt | | 003.txt | 004.txt |
+-------------+-------------+-------------+-------------+
Branch-2 | | 002.txt | 003.txt | |
+-------------+-------------+-------------+-------------+联合之后, 在MountPoint下将会看到四个文件 , 分别是Branch-0下的001.txt、003.txt, Branch-1下的004.txt , 以及Branch-2下的002.txt。
branch是aufs里面的概念 , 其实一个branch就是一个目录 , 所以上面的Branch-0,1,2就是三个目录branch是有index的 ,index越小的branch会放在最上面 , 如果多个branch里面有同样的文件 , 只有index最小的那个branch下的文件才会被访问到。MountPoint就是最后这三个目录联合后挂载到的位置 , 访问这个目录下的文件都会经过aufs文件系统 , 换句话说, 直接访问Branch-0,1,2这三个目录的话 ,aufs是不知道的
注意 : 并不是所有文件系统里的目录都能作为
aufs的branch, 目前aufs不支持的有 :btrfs、aufs、eCryptfs
我们来看一看被union的目录(分支)的相关权限 :
rw表示可写可读read-write。ro表示read-only, 如果你不指权限 , 那么除了第一个外ro是默认值 , 对于ro分支 , 其永远不会收到写操作 , 也不会收到查找whiteout的操作。rr表示real-read-only, 与read-only不同的是,rr标记的是天生就是只读的分支 , 这样 ,AUFS可以提高性能, 比如不再设置inotify来检查文件变动通知。
一般来说ro的分支都会有wh的属性 , 比如 [dir]=ro+wh。所谓whiteout的意思 , 如果在union中删除的某个文件 , 实际上是位于一个readonly的分支 ( 目录 ) 上 , 那么 , 在mount的union这个目录中你将看不到这个文件 , 但是read-only这个层上我们无法做任何的修改 , 所以 , 我们就需要对这个readonly目录里的文件作whiteout。AUFS的whiteout的实现是通过在上层的可写的目录下建立对应的whiteout隐藏文件来实现的。
2.1.2.1 只读挂载
挂载时 , 可以指定每个branch的读写权限 , 如果不指定的话 , 第一个目录将会是可写的 , 其它的目录是只读的 , 在实际使用时 , 最好是显示的指定每个branch的读写属性 , 这样大家都一眼就能看懂。这里先演示一下只读挂载 :
#准备相应的目录和文件
root@ubuntu1804:/data# echo dir0 > dir0/001.txt
root@ubuntu1804:/data# echo dir0 > dir0/002.txt
root@ubuntu1804:/data# echo dir1 > dir1/002.txt
root@ubuntu1804:/data# echo dir1 > dir1/003.txt
root@ubuntu1804:/data# tree
.
├── aufs
├── dir0
│ ├── 001.txt
│ └── 002.txt
└── dir1
├── 002.txt
└── 003.txt
3 directories, 4 files
#通过指定ro参数来让两个branch都为只读
root@ubuntu1804:/data# mount -t aufs -o br=./dir0=ro:./dir1=ro none ./aufs/
#联合后最终的root目录下将看到三个文件
root@ubuntu1804:/data# ls aufs/
001.txt 002.txt 003.txt
#其中002.txt的内容是dir0中的002.txt的内容, 说明dir0的index要比dir1的index小
root@ubuntu1804:/data# cat aufs/002.txt
dir0
#由于是只读挂载, 所以touch失败
root@ubuntu1804:/data# touch aufs/001.txt
touch: cannot touch 'aufs/001.txt': Read-only file system
root@ubuntu1804:/data# touch aufs/003.txt
touch: cannot touch 'aufs/003.txt': Read-only file system
#但是我们可以跳过root目录来修改001.txt和003.txt,
#因为跳过了root目录, 所以就不受aufs控制
root@ubuntu1804:/data# touch dir0/001.txt
root@ubuntu1804:/data# touch dir1/003.txt
#我们还能在下面的目录中创建新的文件
root@ubuntu1804:/data# touch dir1/004.txt
#新创建的文件能及时的反应到挂载点上去
root@ubuntu1804:/data# ls ./aufs/
001.txt 002.txt 003.txt 004.txt
#删除该文件, 以免影响后续的演示
root@ubuntu1804:/data# rm ./dir1/004.txt 从上面的演示可以看出 , 我们可以跳过挂载点直接读写底层的目录 , 这样就不受aufs的控制 ,但我们修改的内容(dir1里面创建的004.txt )还是能在挂载点下看到 , 这是因为aufs在访问文件时 , 默认的做法是如果最上层目录里面没这个文件 , 就一层一层的往下找 , 所以下层有变动的话 , aufs会自动发现。控制这种行为的参数为udba。帮助文档
udba的参数(全称 : User’s Direct Branch Access) , 这个参数有三个取值 :
udba=none : 设置上这个参数后 ,
AUFS会运转的更快 , 因为那些不在mount目录里发生的修改 ,aufs不会同步过来了, 所以会有数据出错的问题。udba=reval : 设置上这个参数后 ,
AUFS会去查文件有没有被更新 , 如果有的话 , 就会把修改拉到mount目录内。udba=notify : 这个参数会让
AUFS为所有的branch注册inotify, 这样可以让AUFS在更新文件修改的性能更高一些。
注:由于访问一个文件时需要一级一级往下找 , 所以如果联合的目录(层级)过多的话 , 会影响性能
2.1.2.2 读写挂载
如果联合的文件夹有写的权限 , 那么所有的修改都会写入可写的那个文件夹 , 如果可写的文件夹有多个 , 那么写入哪个文件夹就依赖于相应的策略 , 有round-robin、最多剩余空间等 , 详情请参考帮助文档中的create参数。
create=rr | round−robin 轮询。下面的示例可以看到, 新创建的文件轮流写到三个目录中
hchen$ sudo mount -t aufs -o dirs=./1=rw:./2=rw:./3=rw -o create=rr none ./mnt hchen$ touch ./mnt/a ./mnt/b ./mnt/c hchen$ tree . ├── 1 │ └── a ├── 2 │ └── c └── 3 └── bcreate=mfs[:second] | most−free−space[:second] : 选一个可用空间最好的分支。可以指定一个检查可用磁盘空间的时间。
create=mfsrr:low[:second] : 选一个空间大于
low的branch, 如果空间小于low了, 那么aufs会使用round-robin方式。
示例:
root@ubuntu1804:/data# umount aufs/
#dir0具有读写权限, dir1为只读权限
root@ubuntu1804:/data# mount -t aufs -o br=./dir0=rw:./dir1=ro none ./aufs/
root@ubuntu1804:/data# echo "aufs->write" >> ./aufs/001.txt
root@ubuntu1804:/data# echo "aufs->write" >> ./aufs/002.txt
root@ubuntu1804:/data# echo "aufs->write" >> ./aufs/003.txt
root@ubuntu1804:/data# echo "aufs->write" >> ./aufs/005.txt
#跟开始前相比, dir0目录下多了003.txt和005.txt, 其它的保持不变
root@ubuntu1804:/data# ll ./aufs/
total 16
drwxr-xr-x 4 root root 126 Jun 2 01:41 ./
drwxr-xr-x 5 root root 42 Jun 2 01:23 ../
-rw-r--r-- 1 root root 17 Jun 2 01:41 001.txt
-rw-r--r-- 1 root root 17 Jun 2 01:41 002.txt
-rw-r--r-- 1 root root 17 Jun 2 01:41 003.txt
-rw-r--r-- 1 root root 12 Jun 2 01:41 005.txt
root@ubuntu1804:/data# ls ./dir0/
001.txt 002.txt 003.txt 005.txt
root@ubuntu1804:/data# ls ./dir1/
002.txt 003.txt
#再来看看内容, dir1里面的内容保持不变
root@ubuntu1804:/data# cat ./dir1/002.txt
dir1
root@ubuntu1804:/data# cat ./dir1/003.txt
dir1
#dir0下的文件内容都变了
root@ubuntu1804:/data# cat ./dir0/001.txt
dir0
aufs->write
root@ubuntu1804:/data# cat ./dir0/002.txt
dir0
aufs->write
root@ubuntu1804:/data# cat ./dir0/003.txt
dir1
aufs->write
root@ubuntu1804:/data# cat ./dir0/005.txt
aufs->write当创建一个新文件的时候 , 新的文件会写入具有
rw权限的那个目录 , 如果有多个目录具有rw权限, 那么依赖于挂载时配置的的创建策略当修改一个具有
rw权限目录下的文件时 , 直接修改该文件当修改一个只有
ro权限目录下的文件时 ,aufs会先将该文件拷贝到一个rw权限的目录里面 , 然后在上面进行修改 , 这就是所谓的COW(copy on write) , 拷贝的速度依赖于底层branch所在的文件系统。
从上面可以看出 ,
COW对于大文件来说 , 性能还是很低的 , 同时也会占用很多的空间 , 但由于只需要在第一次修改的时候拷贝一次 , 所以很多情况下还是能接受。在示例中当dir0与dir1文件有相同的文件名时,以dir0中的文件为主。因此此时当dir0挂载时以只读方式挂载时,此时修改相同文件名的文件内容时,则会修改失败。
2.1.2.3 删除文件
删除文件时 , 如果该文件只在rw目录下有 , 那就直接删除rw目录下的该文件 ; 如果该文件在ro目录下有 ,那么aufs将会在rw目录里面创建一个.wh开头的文件 , 标识该文件已被删除。
root@ubuntu1804:/data# ls -a dir0/
. .. 001.txt 002.txt 003.txt 005.txt .wh..wh.aufs .wh..wh.orph .wh..wh.plnk
root@ubuntu1804:/data# ls -a dir1/
. .. 002.txt 003.txt
#通过aufs删除所有文件
root@ubuntu1804:/data# rm ./aufs/001.txt ./aufs/002.txt ./aufs/003.txt ./aufs/005.txt
#dir0下的文件全被删除了, 但dir1目录下的文件没动
root@ubuntu1804:/data# tree
.
├── aufs
├── dir0
└── dir1
├── 002.txt
└── 003.txt
3 directories, 2 files
#通过-a参数来看看dir0目录下的内容
#可以看到aufs为002.txt和003.txt新建了两个特殊的以.wh开头的文件,
#用来表示这两个文件已经被删掉了
#这里其他.wh开头的文件都是aufs用到的一些属性文件
root@ubuntu1804:/data# ls -a ./dir0/
. .. .wh.002.txt .wh.003.txt .wh..wh.aufs .wh..wh.orph .wh..wh.plnk
root@ubuntu1804:/data# ll -a ./dir0/
total 0
drwxr-xr-x 4 root root 104 Jun 2 01:53 ./
drwxr-xr-x 5 root root 42 Jun 2 01:23 ../
-r--r--r-- 3 root root 0 Jun 2 01:41 .wh.002.txt
-r--r--r-- 3 root root 0 Jun 2 01:41 .wh.003.txt
-r--r--r-- 3 root root 0 Jun 2 01:41 .wh..wh.aufs
drwx------ 2 root root 6 Jun 2 01:41 .wh..wh.orph/
drwx------ 2 root root 6 Jun 2 01:41 .wh..wh.plnk/2.1.2.4 docker中的aufs
AUFS 是一个联合文件系统, 这意味着它将单个 Linux 主机上的多个目录分层并将它们呈现为单个目录。这些目录在 AUFS 术语中称为branches(分支), 在 Docker 术语中称为layers(层)。
下图展示了一个基于ubuntu:latest镜像的 Docker 容器。

每一个image layer以及container layer均由docker主机中/var/lib/docker中的子目录实现 。其中的目录名称不直接对应层级本身的ID。
所有关于镜像层和容器层的信息都存储在/var/lib/docker/aufs中
root@ubuntu1804:~# ll /var/lib/docker/aufs/
total 20
drwx-----x 5 root root 4096 Jun 2 11:56 ./
drwx--x--x 14 root root 4096 Jun 2 11:58 ../
drwx-----x 7 root root 4096 Jun 2 12:01 diff/
drwx-----x 2 root root 4096 Jun 2 12:01 layers/
drwx-----x 7 root root 4096 Jun 2 12:01 mnt/当一个镜像未生成容器时 , AUFS 的存储结构如下 :
diff 文件夹 : 存储镜像内容 , 每一层都存储在以镜像层 ID 命名的子文件夹中。
layers 文件夹 : 存储镜像层关系的元数据 , 在
diff文件夹下的每个镜像层在这里都会有一个文件 , 文件的内容为该层镜像的父级镜像的ID。mnt 文件夹 : 联合挂载点目录 , 未生成容器时 , 该目录为空。
当一个镜像已经生成容器时 ,
AUFS存储结构会发生如下变化。diff 文件夹 : 当容器运行时 , 会在 diff 目录下生成容器层。
layers 文件夹 : 增加容器层相关的元数据。
mnt 文件夹 : 容器的联合挂载点 , 这和容器中看到的文件内容一致。
读取文件
文件在容器层中存在时 : 当文件存在于容器层时 , 直接从容器层读取。
当文件在容器层中不存在时 : 当容器运行时需要读取某个文件 , 如果容器层中不存在时 , 则从镜像层查找该文件 , 然后读取文件内容。
文件既存在于镜像层 , 又存在于容器层 : 当我们读取的文件既存在于镜像层 , 又存在于容器层时 , 将会从容器层读取该文件。
修改文件或目录
AUFS 对文件的修改采用的是写时复制的工作机制, 这种工作机制可以最大程度节省存储空间。具体的文件操作机制如下 :
第一次修改文件 : 当我们第一次在容器中修改某个文件时 , AUFS 会触发写时复制操作, AUFS 首先从镜像层复制文件到容器层, 然后再执行对应的修改操作。
AUFS写时复制的操作将会复制整个文件 , 如果文件过大 , 将会大大降低文件系统的性能, 因此当我们有大量文件需要被修改时, AUFS 可能会出现明显的延迟。好在, 写时复制操作只在第一次修改文件时触发, 对日常使用没有太大影响。删除文件或目录 : 当文件或目录被删除时, AUFS 并不会真正从镜像中删除它, 因为镜像层是只读的, AUFS 会创建一个特殊的文件或文件夹, 这种特殊的文件或文件夹会阻止容器的访问。

在docker执行起来后(比如 : docker run -it ubuntu /bin/bash ) , 你可以从/sys/fs/aufs/si_[id]目录下查看aufs的mount的情况 , 下面是个示例 :
root@ubuntu1804:~# ls /sys/fs/aufs/si_b0333064b7ee9f01/
br0 br1 br2 br3 br4 brid0 brid1 brid2 brid3 brid4 xi_path
root@ubuntu1804:~# cat /sys/fs/aufs/si_b0333065020fff01/*
/var/lib/docker/aufs/diff/ccc879f83b7fee90e5ed108a8a20c89bce6c8d08d6b48c9ebd56a166d13205ae=rw
/var/lib/docker/aufs/diff/ccc879f83b7fee90e5ed108a8a20c89bce6c8d08d6b48c9ebd56a166d13205ae-init=ro+wh
/var/lib/docker/aufs/diff/25aef43f0e9d6f84e81c41ac4247fd6588bea6c31fa8a79d5d9145b1d69c51f3=ro+wh
/var/lib/docker/aufs/diff/b989c7d1444f8dc983de28ab8637f81f83438a2a0577eeff07c87762dcdfea02=ro+wh
/var/lib/docker/aufs/diff/94faa43ea992ca14528b654066e0e37361e064e5277fbcc93c8f1fbbe47762a0=ro+wh
64
65
66
67
68
/dev/shm/aufs.xino可以看到只有最顶上的层(branch)是rw权限 , 其它的都是ro+wh权限只读的。
2.1.3 修改存储引擎
如果修改docker启动引擎,需要编辑文件/etc/docker/daemon.json
{
"storage-driver": "overlay2"
}按照要求,修改storage-driver中对应内容。
同样, 可以在启动选项中添加-s=overlay2选项。同样可以修改存储引擎。
2.2 服务进程管理
2.2.1 docker进程结构
[root@centos76 yum.repos.d]# pstree -p
systemd(1)─┬─NetworkManager(4253)─┬─dhclient(4531)
│ ├─{NetworkManager}(4280)
│ └─{NetworkManager}(4290)
├─auditd(4176)───{auditd}(4177)
├─containerd(4724)─┬─{containerd}(4899)
│ ├─{containerd}(4901)
│ ├─{containerd}(4902)
│ ├─{containerd}(4903)
│ ├─{containerd}(4904)
│ ├─{containerd}(5113)
│ ├─{containerd}(5114)
│ ├─{containerd}(5115)
│ ├─{containerd}(5116)
│ ├─{containerd}(5117)
│ ├─{containerd}(5118)
│ ├─{containerd}(5119)
│ ├─{containerd}(5120)
│ ├─{containerd}(5121)
│ ├─{containerd}(5123)
│ ├─{containerd}(5124)
│ ├─{containerd}(5125)
│ └─{containerd}(14893)
├─containerd-shim(14940)─┬─bash(14962)
│ ├─{containerd-shim}(14941)
│ ├─{containerd-shim}(14942)
│ ├─{containerd-shim}(14943)
│ ├─{containerd-shim}(14944)
│ ├─{containerd-shim}(14945)
│ ├─{containerd-shim}(14946)
│ ├─{containerd-shim}(14947)
│ ├─{containerd-shim}(14948)
│ ├─{containerd-shim}(14949)
│ ├─{containerd-shim}(14950)
│ ├─{containerd-shim}(14996)
│ ├─{containerd-shim}(14997)
│ └─{containerd-shim}(14998)
├─crond(4222)
├─dbus-daemon(4205)───{dbus-daemon}(4210)
├─dockerd(5126)─┬─{dockerd}(5153)
│ ├─{dockerd}(5154)
│ ├─{dockerd}(5155)
│ ├─{dockerd}(5156)
│ ├─{dockerd}(5158)
│ ├─{dockerd}(5169)
│ ├─{dockerd}(5205)
│ ├─{dockerd}(5206)
│ ├─{dockerd}(5207)
│ ├─{dockerd}(5208)
│ ├─{dockerd}(5219)
│ ├─{dockerd}(5220)
│ ├─{dockerd}(5221)
│ ├─{dockerd}(5222)
│ ├─{dockerd}(5223)
│ ├─{dockerd}(5224)
│ ├─{dockerd}(5225)
│ ├─{dockerd}(5226)
│ └─{dockerd}(5227)
├─firewalld(4249)───{firewalld}(4528)
├─irqbalance(4217)
├─login(4251)───bash(14794)───docker(14898)─┬─{docker}(14899)
│ ├─{docker}(14900)
│ ├─{docker}(14901)
│ ├─{docker}(14902)
│ ├─{docker}(14903)
│ ├─{docker}(14904)
│ ├─{docker}(14905)
│ ├─{docker}(14906)
│ ├─{docker}(14907)
│ ├─{docker}(14908)
│ ├─{docker}(14909)
│ ├─{docker}(14910)
│ ├─{docker}(15031)
│ ├─{docker}(15032)
│ ├─{docker}(15033)
│ ├─{docker}(15034)
│ ├─{docker}(15035)
│ └─{docker}(15198)
├─lvmetad(2286)
├─master(5085)─┬─pickup(5088)
│ └─qmgr(5089)
├─polkitd(4202)─┬─{polkitd}(4209)
│ ├─{polkitd}(4211)
│ ├─{polkitd}(4212)
│ ├─{polkitd}(4215)
│ ├─{polkitd}(4218)
│ └─{polkitd}(4219)
├─qemu-ga(4203)
├─rsyslogd(4722)─┬─{rsyslogd}(4786)
│ └─{rsyslogd}(4800)
├─sshd(4713)───sshd(15010)───bash(15014)───pstree(15225)
├─systemd-journal(2252)
├─systemd-logind(4214)
├─systemd-udevd(2292)
└─tuned(4714)─┬─{tuned}(5076)
├─{tuned}(5077)
├─{tuned}(5082)
└─{tuned}(5112)有四个进程 :
dockerd: 被client直接访问 , 其父进程为宿主机的systemd守护进程。docker-proxy: 每个进程docker-proxy实现对应一个需要网络通信的容器 , 管理宿主机和容器的之间端口映射 , 其父进程为dockerd, 如果容器不需要网络则无需启动containerd: 被dockerd进程调用以实现与runc交互containerd-shim: 真正运行容器的载体 , 每个容器对应一个containerd-shim进程 , 其父进程为containerd。
#containerd-shim命令使用
[root@ubuntu1804 ~]#containerd-shim -h
Usage of containerd-shim:
-address string
grpc address back to main containerd
-containerd-binary containerd publish
path to containerd binary (used for containerd publish) (default "containerd")
-criu string
path to criu binary
-debug
enable debug output in logs
-namespace string
namespace that owns the shim
-runtime-root string
root directory for the runtime (default "/run/containerd/runc")
-socket string
abstract socket path to serve
-systemd-cgroup
set runtime to use systemd-cgroup
-workdir string
path used to storge large temporary data
dockerd通过grpc和containerd模块通信 ,dockerd由libcontainerd负责和containerd进行交换 ,dockerd和containerd通信socket文件 :/run/containerd/containerd.sockcontainerd在dockerd启动时被启动 , 然后containerd启动grpc请求监听,containerd处理grpc请求 , 根据请求做相应动作若是
start或是exec容器 ,containerd拉起一个container-shim, 并进行相应的操作container-shim被拉起后 ,start/exec/create拉起runC进程 , 通过exit、control文件和containerd通信, 通过父子进程关系和SIGCHLD(信号)监控容器中进程状态在整个容器生命周期中 ,
containerd通过epoll监控容器文件, 监控容器事件
注 :
gRPC是
2.2.2 podman进程结构
podman没有dockerd服务进程。所以当无容器启动时 , 无需启动任何进程 , 而容器启动时 , 会做为conmon的子进程
[root@centos8 ~]# podman version
Version: 3.3.1
API Version: 3.3.1
Go Version: go1.16.7
Built: Wed Nov 10 05:23:56 2021
OS/Arch: linux/amd64
[root@centos8 ~]# podman run -d -p 80:80 docker.io/library/nginx
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 5fb9a81470f3 done
Copying blob 01d159b8db2f done
Copying blob 0f816efa513d done
Copying blob 4d3239651a63 done
Copying blob a803e7c4b030 done
Copying blob 8b625c47d697 done
Copying blob 9b1e1e7164db done
Copying config 61395b4c58 done
Writing manifest to image destination
Storing signatures
67eae7150e10d714dc876f3cfcef6d8302e39e4d9292e9c014e6ed4ba1a54351
[root@centos8 ~]# pstree -p
systemd(1)─┬─NetworkManager(888)─┬─{NetworkManager}(916)
│ └─{NetworkManager}(941)
├─VGAuthService(879)
├─atd(979)
├─auditd(855)─┬─sedispatch(857)
│ ├─{auditd}(856)
│ └─{auditd}(858)
├─conmon(25530)─┬─nginx(25541)─┬─nginx(25573)
│ │ └─nginx(25574)
│ └─{conmon}(25532)
├─crond(992)
├─dbus-daemon(883)
├─irqbalance(882)───{irqbalance}(891)
├─login(996)───bash(1482)
├─lsmd(881)
├─mcelog(884)
├─polkitd(889)─┬─{polkitd}(952)
│ ├─{polkitd}(953)
│ ├─{polkitd}(955)
│ ├─{polkitd}(956)
│ └─{polkitd}(967)
├─rsyslogd(966)─┬─{rsyslogd}(1462)
│ └─{rsyslogd}(1465)
├─smartd(886)
├─sshd(944)───sshd(1518)───sshd(1520)───bash(1521)───pstree(25576)
├─sssd(887)─┬─sssd_be(954)
│ └─sssd_nss(957)
├─systemd(1473)───(sd-pam)(1475)
├─systemd-journal(739)
├─systemd-logind(969)
├─systemd-udevd(778)
├─tuned(945)─┬─{tuned}(1450)
│ ├─{tuned}(1454)
│ ├─{tuned}(1455)
│ └─{tuned}(1456)
└─vmtoolsd(880)─┬─{vmtoolsd}(904)
└─{vmtoolsd}(908)
[root@centos8 ~]# ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("conmon",pid=25530,fd=5))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=944,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=944,fd=6))
[root@centos8 ~]# 2.3 镜像管理
镜像, 即创建容器的模版 , 含有启动容器所需要的文件系统及所需要的内容 , 因此镜像主要用于方便和快速的创建并启动容器 。
镜像含里面是一层层的文件系统 , 叫做Union FS( 联合文件系统) 。联合文件系统 : 可以将几层目录挂载到一起( 就像千层饼、洋葱头、俄罗斯套娃一样) , 形成一个虚拟文件系统 , 虚拟文件系统的目录结构就像普通 linux 的目录结构一样 , 镜像通过这些文件再加上宿主机的内核共同提供了一个 linux 的虚拟环境 , 每一层文件系统叫做一层layer , 联合文件系统可以对每一层文件系统设置三种权限 , 只读(readonly)、读写(readwrite)和写出(whiteout-able) , 但是镜像中每一层文件系统都是只读的,构建镜像的时候, 从一个最基本的操作系统开始, 每个构建提交的操作都相当于做一层的修改 , 增加了一层文件系统 , 一层层往上叠加 , 上层的修改会覆盖底层该位置的可见性 , 这也很容易理解 , 就像上层把底层遮住了一样 , 当使用镜像的时候 , 我们只会看到一个完全的整体 , 不知道里面有几层也不需要知道里面有几层 , 结构如下 :

一个典型的Linux文件系统由bootfs和rootfs两部分组成。bootfs(boot file system) 主要包含bootloader和kernel , bootloader主要用于引导加载kernel , 当 kernel 被加载到内存中后bootfs会被umount 掉 。rootfs(root file system) 包含的就是典型Linux 系统中的/dev , /proc , /bin , /etc 等标准目录和文件 , 下图就是镜像中最基础的两层结构 , 不同的 linux 发行版(如 ubuntu 和CentOS ) 在 rootfs 这一层会有所区别。
一般的镜像通常都比较小 , 官方提供的Ubuntu镜像只有60MB多点 , 而CentOS基础镜像也只有200MB左右 , 一些其他版本的镜像甚至只有几MB , 比如 : busybox 才1.22MB , alpine镜像也只有5M左右。镜像直接调用宿主机的内核 , 镜像中只提供rootfs , 也就是只需要包括最基本的命令、工具和程序库就可以了。
下图就是有两个不同的镜像在一个宿主机内核上实现不同的rootfs。

容器、镜像父镜像 :

范例 : 查看镜像的分层结构
[root@ubuntu1804 ~]#docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8ec398bc0356: Pull complete
a53c868fbde7: Pull complete
79daf9dd140d: Pull complete
Digest: sha256:70821e443be75ea38bdf52a974fd2271babd5875b2b1964f05025981c75a6717
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@ubuntu1804 ~]#docker save nginx -o nginx.tar.gz
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5ad3bd0e67a9 3 days ago 127MB
alpine 3.11.3 e7d92cdc71fe 7 days ago 5.59MB
centos centos8.1.1911 470671670cac 7 days ago 237MB
busybox latest 6d5fcfe5ff17 4 weeks ago 1.22MB
hello-world latest fce289e99eb9 12 months ago 1.84kB
[root@ubuntu1804 ~]#ll -h nginx.tar.gz
-rw------- 1 root root 125M Jan 25 20:44 nginx.tar.gz
[root@ubuntu1804 ~]#tar xvf nginx.tar.gz -C /data
09d204271b2674da08db25af2990d9dbc2dfb64bffd97368e36fbf11fa133234/
09d204271b2674da08db25af2990d9dbc2dfb64bffd97368e36fbf11fa133234/VERSION
09d204271b2674da08db25af2990d9dbc2dfb64bffd97368e36fbf11fa133234/json
09d204271b2674da08db25af2990d9dbc2dfb64bffd97368e36fbf11fa133234/layer.tar
5ad3bd0e67a9c542210a21a3c72f56ef6387cf9b7f4c2506d2398d55a2593ed0.json
bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc/
bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc/VERSION
bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc/json
bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc/layer.tar
c485148312456ba8bca62ab3ff47d4c43944edf5a2618340816c2db26902668b/
c485148312456ba8bca62ab3ff47d4c43944edf5a2618340816c2db26902668b/VERSION
c485148312456ba8bca62ab3ff47d4c43944edf5a2618340816c2db26902668b/json
c485148312456ba8bca62ab3ff47d4c43944edf5a2618340816c2db26902668b/layer.tar
manifest.json
repositories
[root@ubuntu1804 ~]#ll /data
total 36
drwxr-xr-x 5 root root 4096 Jan 25 20:45 ./
drwxr-xr-x 24 root root 4096 Dec 12 2018 ../
drwxr-xr-x 2 root root 4096 Jan 22 12:26 09d204271b2674da08db25af2990d9dbc2dfb64bffd97368e36fbf11fa133234/
-rw-r--r-- 1 root root 6669 Jan 22 12:26 5ad3bd0e67a9c542210a21a3c72f56ef6387cf9b7f4c2506d2398d55a2593ed0.json
drwxr-xr-x 2 root root 4096 Jan 22 12:26 bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc/
drwxr-xr-x 2 root root 4096 Jan 22 12:26 c485148312456ba8bca62ab3ff47d4c43944edf5a2618340816c2db26902668b/
-rw-r--r-- 1 root root 355 Jan 1 1970 manifest.json
-rw-r--r-- 1 root root 88 Jan 1 1970 repositories
[root@ubuntu1804 ~]#cat /data/manifest.json
[{"Config":"5ad3bd0e67a9c542210a21a3c72f56ef6387cf9b7f4c2506d2398d55a2593ed0.json","RepoTags":["nginx:latest"],"Layers":["bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc/layer.tar","c485148312456ba8bca62ab3ff47d4c43944edf5a2618340816c2db26902668b/layer.tar","09d204271b2674da08db25af2990d9dbc2dfb64bffd97368e36fbf11fa133234/layer.tar"]}]
[root@ubuntu1804 ~]#cd /data/bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc/
[root@ubuntu1804 bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc]#ls
json layer.tar VERSION
[root@ubuntu1804 bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc]#tar xf layer.tar
[root@ubuntu1804 bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc]#ls
bin boot dev etc home json layer.tar lib lib64 media mnt opt proc root run sbin srv sys tmp usr var VERSION
[root@ubuntu1804 ~]#cat /data/bc0c1f0bf5d3d116df7db18438f547181e0695612a45744f7964713c1126cebc/etc/issue
Debian GNU/Linux 10 \n \l
[root@ubuntu1804 ~]#docker image history centos:centos7.7.1908
IMAGE CREATED CREATED BY SIZE COMMENT
08d05d1d5859 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:3e2a127b44ed01afc… 204MB
2.3.1 下载镜像
从docker 仓库将镜像下载到本地 , 命令格式如下 :
docker pull 仓库服务器:端口/项目名称/镜像名称:tag(版本)号镜像下载保存的路径:
/var/lib/docker/overlay2/镜像ID注意 : 镜像下载完成后 , 会自动解压缩 , 比官网显示的可能会大很多 , 如 :
centos8.1.1911下载时只有70MB, 下载完后显示237MB
范例 : 从docker官网下载镜像
docker pull hello-world
docker pull alpine
docker pull busybox
docker pull nginx
docker pull centos
docker pull centos:centos7.7.1908
docker pull docker.io/library/mysql:5.7.29
docker pull mysql:5.6.47范例 : 下载镜像alpine
[root@ubuntu1804 ~]#ls /var/lib/docker/overlay2/
l
[root@ubuntu1804 ~]#du -sh /var/lib/docker/overlay2
8.0K /var/lib/docker/overlay2
[root@ubuntu1804 ~]#ls /var/lib/docker/overlay2/l
[root@ubuntu1804 ~]#docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
[root@ubuntu1804 ~]#docker pull alpine:3.11.3
3.11.3: Pulling from library/alpine
c9b1b535fdd9: Pull complete
Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Status: Downloaded newer image for alpine:3.11.3
docker.io/library/alpine:3.11.3
[root@ubuntu1804 ~]#docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
bdbbaa22dec6: Pull complete
Digest: sha256:6915be4043561d64e0ab0f8f098dc2ac48e077fe23f488ac24b665166898115a
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@ubuntu1804 ~]#docker pull centos:centos8.1.1911
centos8.1.1911: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:centos8.1.1911
docker.io/library/centos:centos8.1.1911
[root@ubuntu1804 ~]#du -sh /var/lib/docker/overlay2/*
5.9M /var/lib/docker/overlay2/1802616f4c8e0a0b52c839431b6faa8ac21f4bd831548dcbd46943d3f60061fa
16K /var/lib/docker/overlay2/5773b92e1351da5e589d0573d9f22d1ec3be1e0e98edbfcddba4b830f12c7be2
1.3M /var/lib/docker/overlay2/de31641b8d2207de7f08eabb5240474a1aaccfef08b6034dcee02b9623f8d9dc
252M /var/lib/docker/overlay2/f41df336075611f9e358e5eaf2ebd5089920a90ba68760cdec8da03edff362f7
20K /var/lib/docker/overlay2/l
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.11.3 e7d92cdc71fe 7 days ago 5.59MB
centos centos8.1.1911 470671670cac 7 days ago 237MB
busybox latest 6d5fcfe5ff17 4 weeks ago 1.22MB
hello-world latest fce289e99eb9 12 months ago 1.84kB
[root@ubuntu1804 ~]#ls -l /var/lib/docker/overlay2/l
total 16
lrwxrwxrwx 1 root root 72 Jan 25 19:51 C5ZTDYHYDTO7BQG6HX36MU6X5K -> ../de31641b8d2207de7f08eabb5240474a1aaccfef08b6034dcee02b9623f8d9dc/diff
lrwxrwxrwx 1 root root 72 Jan 25 19:57 DEXHVNUGFLFJCSJAKISOHQG7JY -> ../f41df336075611f9e358e5eaf2ebd5089920a90ba68760cdec8da03edff362f7/diff
lrwxrwxrwx 1 root root 72 Jan 25 19:51 KJ5IA5AUHFUEQXFKJA7UDUIA7A -> ../1802616f4c8e0a0b52c839431b6faa8ac21f4bd831548dcbd46943d3f60061fa/diff
lrwxrwxrwx 1 root root 72 Jan 25 19:51 ZM3U4WDNHGJJX5DXHA5M4ZWAIW -> ../5773b92e1351da5e589d0573d9f22d1ec3be1e0e98edbfcddba4b830f12c7be2/diff范例 :
[root@ubuntu1804 ~]#docker pull docker.io/library/mysql:5.7.29
5.7.29: Pulling from library/mysql
804555ee0376: Pull complete
c53bab458734: Pull complete
ca9d72777f90: Pull complete
2d7aad6cb96e: Pull complete
8d6ca35c7908: Pull complete
6ddae009e760: Pull complete
327ae67bbe7b: Pull complete
9e05241b7707: Pull complete
e822978df8f0: Pull complete
14ca71ed53be: Pull complete
026afe6fd35e: Pull complete
Digest: sha256:2ca675966612f34b4036bbcfa68cb049c03e34b561fba0f88954b03931823d29
Status: Downloaded newer image for mysql:5.7.29
docker.io/library/mysql:5.7.29
[root@ubuntu1804 ~]#docker pull mysql:5.6.472.3.2 镜像加速配置
docker 镜像官方的下载站点: https://hub.docker.com/
从国内下载官方的镜像站点有时候会很慢, 因此可以更改docker配置文件添加一个加速器, 可以通过加速器达到加速下载镜像的目的
国内有许多公司都提供了docker 加速镜像 , 比如 : 阿里云、腾讯云、网易云 , 以下以阿里云为例 :
阿里云获取加速地址
浏览器打开http://cr.console.aliyun.com , 注册或登录阿里云账号 , 点击左侧的镜像加速器 ,将会得到一个专属的加速地址 , 而且下面有使用配置说明:

docker镜像加速配置
1. 安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端, 参考文档 docker-ce 2. 配置镜像加速器 修改daemon配置文件/etc/docker/daemon.json来使用加速器 mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"] } EOF #网易云 : http://hub-mirror.c.163.com/ #腾讯云 : https://mirror.ccs.tencentyun.com systemctl daemon-reload systemctl restart docker范例
[root@ubuntu1804 ~]#docker info |tail WARNING: the overlay storage-driver is deprecated, and will be removed in a future release. ID: IZHJ:WPIN:BRMC:XQUI:VVVR:UVGK:NZBM:YQXT:JDWB:33RS:45V7:SQWJ Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false [root@ubuntu1804 ~]#vim /etc/docker/daemon.json [root@ubuntu1804 ~]#cat /etc/docker/daemon.json { "storage-driver": "overlay", "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"] } [root@ubuntu1804 ~]#systemctl daemon-reload [root@ubuntu1804 ~]#systemctl restart docker [root@ubuntu1804 ~]#docker info |tail WARNING: the overlay storage-driver is deprecated, and will be removed in a future release. Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://si7y70hh.mirror.aliyuncs.com/ Live Restore Enabled: false [root@ubuntu1804 ~]
2.3.3 本地镜像管理
企业使用镜像及常见操作 : 搜索、下载、导出、导入、删除
docker search centos
docker pull alpine
docker images #查看本地镜像
docker image ls
docker save nginx:1.16.1 > /opt/nginx-1.16.1.tar.gz #centos #导出镜像
docker save nginx -o /opt/nginx.tar.gz
docker load -i centos-latest.tar.xz #导入本地镜像
docker load < centos-latest.tar.xz
docker rmi 镜像ID/镜像名称 #删除指定ID的镜像, 此镜像对应容器正启动镜像不能被删除, 除非将容器全部关闭2.3.3.1 搜索镜像
在docker中可以通过官网(https://hub.docker.com)搜索需要的镜像。

除了通过网页之外,客户端可以通过命令行的方式查询需要的镜像
root@ubuntu1804:~# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output范例:
root@ubuntu1804:~# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6597 [OK]
ansible/centos7-ansible Ansible on Centos7 134 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC session… 129 [OK]
jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 118 [OK]
centos/systemd systemd enabled base container. 99 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 88
imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 58 [OK]
tutum/centos Simple CentOS docker image with SSH access 48
kinogmt/centos-ssh CentOS with SSH 29 [OK]
pivotaldata/centos-gpdb-dev CentOS image for GPDB development. Tag names… 13
centos/tools Docker image that has systems administration… 7 [OK]
drecom/centos-ruby centos ruby 6 [OK]
pivotaldata/centos Base centos, freshened up a little with a Do… 5
mamohr/centos-java Oracle Java 8 Docker image based on Centos 7 3 [OK]
darksheer/centos Base Centos Image -- Updated hourly 3 [OK]
pivotaldata/centos-gcc-toolchain CentOS with a toolchain, but unaffiliated wi… 3
pivotaldata/centos-mingw Using the mingw toolchain to cross-compile t… 3
indigo/centos-maven Vanilla CentOS 7 with Oracle Java Developmen… 2 [OK]
dokken/centos-7 CentOS 7 image for kitchen-dokken 2
mcnaughton/centos-base centos base image 1 [OK]
pivotaldata/centos6.8-dev CentosOS 6.8 image for GPDB development 1
blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK]
pivotaldata/centos7-dev CentosOS 7 image for GPDB development 0
smartentry/centos centos with smartentry 0 [OK]
starlabio/centos-native-build Our CentOS image for native builds 0 [OK]范例:选择性查找镜像
root@ubuntu1804:~# docker search --filter=stars=30 centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6597 [OK]
ansible/centos7-ansible Ansible on Centos7 134 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC session… 129 [OK]
jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 118 [OK]
centos/systemd systemd enabled base container. 99 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 88
imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 58 [OK]
tutum/centos Simple CentOS docker image with SSH access 48 2.3.3.2 查看本地镜像
docker images 、docker image ls 、docker image list可以查看下载至本地的镜像
OPTIONS-a: 显示所有镜像。(默认隐藏中间镜像)-f: 通过给出的条件筛选镜像-q: 仅显示镜像ID
执行结果的显示信息说明:
REPOSITORY : 镜像所属的仓库名称
TAG : 镜像版本号(标识符), 默认为latest 。
IMAGE ID : 镜像唯一ID标识
CREATED : 镜像创建时间
VIRTUAL SIZE : 镜像的大小
范例 :
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.11.3 e7d92cdc71fe 7 days ago 5.59MB
centos centos8.1.1911 470671670cac 7 days ago 237MB
busybox latest 6d5fcfe5ff17 4 weeks ago 1.22MB
hello-world latest fce289e99eb9 12 months ago 1.84kB
[root@ubuntu1804 ~]#docker images -q
e7d92cdc71fe
470671670cac
6d5fcfe5ff17
fce289e99eb9
#只查看指定REPOSITORY的镜像
[root@centos8 ~]#podman images localhost/alpine-base
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/alpine-base 3.11 69abbff7bed9 37 minutes ago 5.87 MB
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 470671670cac 7 days ago 237MB
mysql 5.6.47 742f7d5a4104 10 days ago 302MB
#表示后期导入或者制作定制镜像与之前已经存在的镜像REPOSITORY和TAG冲突,从而把之前的覆盖而导致的, 有很少的一部分镜像是从互联网下载之后就这样的2.3.3.3 镜像导出
利用docker save命令可以将从本地镜像导出为一个压缩文件 , 然后复制到其他服务器进行导入使用。
docker save 等效于docker image save
OPTIONS-o,--output string: 将输出写入到一个指定的压缩文件中
常见用法 :
docker save IMAGE -o /path/file.tar.gz
docker save IMAGE > /path/file.tar.gz范例 :
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5ad3bd0e67a9 3 days ago 127MB
alpine 3.11.3 e7d92cdc71fe 7 days ago 5.59MB
centos centos8.1.1911 470671670cac 7 days ago 237MB
centos latest 470671670cac 7 days ago 237MB
mysql 5.6.47 742f7d5a4104 10 days ago 302MB
mysql 5.7.29 b598110d0fff 10 days ago 435MB
busybox latest 6d5fcfe5ff17 4 weeks ago 1.22MB
hello-world latest fce289e99eb9 12 months ago 1.84kB
[root@ubuntu1804 ~]#docker save mysql:5.7.29 -o /data/mysql5.7.29.tar.gz
[root@ubuntu1804 ~]#docker save alpine:3.11.3 > /data/alpine.tar.gz
[root@ubuntu1804 ~]#scp /data/mysql5.7.29.tar.gz /data/alpine.tar.gz 10.0.0.7:/data
The authenticity of host '10.0.0.7 (10.0.0.7)' can't be established.
ECDSA key fingerprint is SHA256:5bc0+A46C5m0zxT3WKIBg/i+oVUq9avVRjO9dy9gz2k.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.7' (ECDSA) to the list of known hosts.
root@10.0.0.7's password:
mysql5.7.29.tar.gz 100% 420MB 32.2MB/s 00:13
alpine.tar.gz 100% 5728KB 39.1MB/s 00:00 2.3.3.4 镜像导入
利用docker load、docker image load 命令可以将镜像导出的压缩文件再导入。
OPTIONS-i,--input string: 将压缩文件中的镜像导入到系统中-q,--quiet: 静默导入, 不会将输出内容
范例 :
[root@centos7 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@centos7 ~]#docker load -i /data/alpine.tar.gz
5216338b40a7: Loading layer 5.857MB/5.857MB
Loaded image ID: sha256:e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a
[root@centos7 ~]#docker load < /data/mysql5.7.29.tar.gz
814c70fdae62: Loading layer 58.51MB/58.51MB
25575e327c84: Loading layer 338.4kB/338.4kB
61cb1c0dec27: Loading layer 10.44MB/10.44MB
955b4c88a6e8: Loading layer 4.472MB/4.472MB
fef9e518b701: Loading layer 1.536kB/1.536kB
cf6a13051478: Loading layer 46.15MB/46.15MB
2a60eb850753: Loading layer 34.3kB/34.3kB
265cbb07b679: Loading layer 3.584kB/3.584kB
5e2692f04e32: Loading layer 320MB/320MB
569004ea94bf: Loading layer 15.87kB/15.87kB
a5d0d78cfb76: Loading layer 1.536kB/1.536kB
Loaded image: mysql:5.7.29
[root@centos7 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.11.3 e7d92cdc71fe 7 days ago 5.59MB
mysql 5.7.29 b598110d0fff 10 days ago 435MB
[root@centos7 ~]#范例 : 一次导出多个镜像
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest e7d92cdc71fe 7 days ago 5.59MB
busybox latest 6d5fcfe5ff17 4 weeks ago 1.22MB
[root@ubuntu1804 ~]#docker save busybox alpine > /all.tar.gz
[root@ubuntu1804 ~]#ll -h /opt/all.tar.gz
-rw-r--r-- 1 root root 7.0M Jan 25 22:12 /opt/all.tar.gz
[root@ubuntu1804 ~]#docker rmi -f $(docker images -q)
Untagged: alpine:latest
Deleted: sha256:e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a
Deleted: sha256:5216338b40a7b96416b8b9858974bbe4acc3096ee60acbc4dfb1ee02aecceb10
Untagged: busybox:latest
Deleted: sha256:6d5fcfe5ff170471fcc3c8b47631d6d71202a1fd44cf3c147e50c8de21cf0648
Deleted: sha256:195be5f8be1df6709dafbba7ce48f2eee785ab7775b88e0c115d8205407265c5
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@ubuntu1804 ~]#docker load -i /opt/all.tar.gz
5216338b40a7: Loading layer [==================================================>] 5.857MB/5.857MB
Loaded image: alpine:latest
195be5f8be1d: Loading layer [==================================================>] 1.437MB/1.437MB
Loaded image: busybox:latest
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest e7d92cdc71fe 7 days ago 5.59MB
busybox latest 6d5fcfe5ff17 4 weeks ago 1.22MB2.3.3.5 删除镜像
docker image rm, docker image remove, docker rmi命令可以删除本地镜像
Options-f,--force: 强制删除镜像
范例 :
[root@centos7 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.11.3 e7d92cdc71fe 7 days ago 5.59MB
mysql 5.7.29 b598110d0fff 10 days ago 435MB
[root@centos7 ~]#docker rmi mysql
Error: No such image: mysql
[root@centos7 ~]#docker rmi b59811
Untagged: mysql:5.7.29
Deleted: sha256:b598110d0fffc42862269a25d8767dd95764d0740f318fd6c0a097f8a22de5bf
Deleted: sha256:908aaab4c4b8d0cbbc68c96a0e3820aa74fd1dee5499e2ca326bc8fd7312f689
Deleted: sha256:e2f2e83f295186b00e3c0d119ef3204b509d552972694e34cee7c1675d157b8a
Deleted: sha256:99b4e48b1be76f50741db02a38c783bf698b1b76808cc6bb5e3fdd65ee2897c6
Deleted: sha256:79c1efa7bde3ac754af64779452ca913fa1f281b44c9dbad25cc322a51ac69b1
Deleted: sha256:5f7c68324b959d2c806db18d02f153bc810f9842722415e077351bc834cc8578
Deleted: sha256:338fc0cd3fb4b87a2b83d274e8fbf475fbde19947c4ac5c5eb6e981a6fb0e8f0
Deleted: sha256:f7a4ccab931f1d1e861961eb951a7806d91ccb375e737fe1f84282f6bbafd2be
Deleted: sha256:f388e1092f8fb931a3cd07a7381bd9707d19526ff81f8b624e932f4919c27a3e
Deleted: sha256:e209b7a884b4d2e9d56bbac40ced48f2caa6a19e7ad6eb6dd20ff754f3af2c5d
Deleted: sha256:2401cf11c5455d505ef49657afcc709197ffcdfc9bd732508e9b62578a30b3a5
Deleted: sha256:814c70fdae62bc26c603bfae861f00fb1c77fc0b1ee8d565717846f4df24ae5d
[root@centos7 ~]#docker rmi alpine:3.11.3
Untagged: alpine:3.11.3
Deleted: sha256:e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a
Deleted: sha256:5216338b40a7b96416b8b9858974bbe4acc3096ee60acbc4dfb1ee02aecceb10
[root@centos7 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE范例 : 强制删除正在使用的镜像 , 也会删除对应的容器
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5a0d2e1e1d0 centos:centos8.1.1911 "bash" 41 minutes ago Up 41 minutes jolly_burnell
[root@ubuntu1804 ~]#docker rmi centos:centos8.1.1911
Error response from daemon: conflict: unable to remove repository reference "centos:centos8.1.1911" (must force) - container b5a0d2e1e1d0 is using its referenced image 470671670cac
[root@ubuntu1804 ~]#docker rmi -f centos:centos8.1.1911
Untagged: centos:centos8.1.1911
Untagged: centos@sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES范例 : 删除所有镜像
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 470671670cac 7 days ago 237MB
mysql 5.6.47 742f7d5a4104 10 days ago 302MB
#表示后期导入或者制作钉钉镜像与之前已经存在的镜像REPOSITORY和TAG冲突,从而把之前的覆盖而导致的, 有很少的一部分镜像是从互联网下载之后就这样的
[root@ubuntu1804 ~]#docker rmi -f $(docker images -q)
Deleted: sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee
Deleted: sha256:0683de2821778aa9546bf3d3e6944df779daba1582631b7ea3517bb36f9e4007
Untagged: mysql:5.6.47
Untagged: mysql@sha256:9527bae58991a173ad7d41c8309887a69cb8bd178234386acb28b51169d0b30e
Deleted: sha256:742f7d5a4104969fcac8054cf9201f5656096f0a58d10947a4a41a8e1d7d9f91
Deleted: sha256:62530ddc9fe5f85609da4397d9e0a88b422d15dbc42664d7477d1deccb51a0d9
Deleted: sha256:41309d62590858b6375bd3c4e9d07bd73e4ea5062343a81641453033424e7aba
Deleted: sha256:43cb5cbfcce71f7fdd80b121aa4d0c5eea9ed0bfcf4a2a0e55a8c5ddb78d4368
Deleted: sha256:56806995b55c0e80ee0daec20f32f8293a3d8ccf151895cd1767a1d27eab1977
Deleted: sha256:7dab204c1f667de5090d809019fab7d6e2323e371407b38e8d311ba458009234
Deleted: sha256:1a7c2d06fdee90c4b06a55793f9e45120a82ff476e0fea5618efd8a268f7d303
Deleted: sha256:f7a4ccab931f1d1e861961eb951a7806d91ccb375e737fe1f84282f6bbafd2be
Deleted: sha256:f388e1092f8fb931a3cd07a7381bd9707d19526ff81f8b624e932f4919c27a3e
Deleted: sha256:e209b7a884b4d2e9d56bbac40ced48f2caa6a19e7ad6eb6dd20ff754f3af2c5d
Deleted: sha256:2401cf11c5455d505ef49657afcc709197ffcdfc9bd732508e9b62578a30b3a5
Deleted: sha256:814c70fdae62bc26c603bfae861f00fb1c77fc0b1ee8d565717846f4df24ae5d
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE2.3.3.6 删除没有使用的镜像
从Docker中删除过期或不必要的镜像对于保持系统的整洁和有序至关重要。让我们来看看CLI如何针对某些镜像进行删除。
首先, 让我们用 docker image ls 命令来看看Docker环境中的镜像 :
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
my_image latest 2cbc27836df4 60 seconds ago 7.05MB
<none> <none> 85b412789704 2 days ago 7.05MB
demo latest 26d80cd96d69 15 months ago 28.5MB上面列出的镜像显示了名为my_image和demo的镜像, 都被标记为latest。第三个镜像没有名称或标签。在这种情况下, 它是一个 “dangling” 的镜像:一个目前没有被容器使用的镜像。这个悬空的镜像是由my_image的重建造成的(一种常见的情况)。先前版本的映像仍然在文件系统中, 但现在没有被使用。
为了安全地删除所有真正dangling(没有被标记)镜像, 你可以使用 docker image prune 命令
语法 :
docker image prune [OPTIONS]OPTIONS-a,--all: 删除所有没有使用的镜像。包括dangling镜像--filter filter: 提供筛选条件 (e.g. "until=<timestamp>")-f,--force: 强制删除所有停止的容器,不需要通过按y确定
范例 : 这个命令将删除所有过期时间超过24小时的镜像
docker image prune --filter "until=24h"可以用以下方式实现同样的功能:
没有标记的镜像仍然占据着宝贵的磁盘空间, 随着时间的推移, 会使你的系统越来越慢。
要消除Docker中所有未标记的镜像, 可以使用带有过滤器的 docker rmi 命令。你可以使用 -f 选项提供基于特定标准的过滤器(不要与 image rm 可用的 -f 标志相混淆, 以强制采取行动)。
过滤器 dangling=true 用于识别未标记的镜像
$ docker rmi $(docker images -f "dangling=true" -q)2.3.3.6 镜像打标签
docker image tag,docker tag可以给镜像打标签 , 类似于起别名
格式 : docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
TAG默认为latest。
完整镜像名称具有以下格式: [HOST[:PORT_NUMBER]/]PATH。其中PATH , [NAMESPACE/]REPOSITORY:第一个可选组件通常是用户或组织的名称空间。第二个必需的组件是存储库名称。当命名空间不存在时 , Docker使用library作为默认命名空间。
Tag : 标记必须是有效的ASCII , 并且可以包含小写和大写字母、数字、_、.和-。它不能以.或-开头
范例 :
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest e7d92cdc71fe 11 days ago 5.59MB
centos centos7.7.1908 08d05d1d5859 2 months ago 204MB
[root@ubuntu1804 ~]#docker tag alpine alpine:3.11
[root@ubuntu1804 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.11 e7d92cdc71fe 11 days ago 5.59MB
alpine latest e7d92cdc71fe 11 days ago 5.59MB
centos centos7.7.1908 08d05d1d5859 2 months ago 204MB2.3.3.7 查看镜像详细信息
docker image inspect 获取容器/镜像的元数据(JSON格式)。
语法 :
docker image inspect [OPTIONS] IMAGE [IMAGE...]
#查看指定镜像的信息
[root@centos7 ~]# docker image inspect ubuntu:test
[
{
"Id": "sha256:e34e831650c1bb0be9b6f61c6755749cb8ea2053ba91c6cda27fded9e089811f",
"RepoTags": [
"ubuntu:test"
],
"RepoDigests": [
"ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060a74"
],
"Parent": "",
"Comment": "",
"Created": "2024-01-11T17:08:11.824691008Z",
"Container": "29c870d899fb3e6422d54862573b14c525e791d80fe8a2a31c76b83f8d9892e2",
"ContainerConfig": {
"Hostname": "29c870d899fb",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"Image": "sha256:64eb624dad5b3ed5cc42087e682ea3543d9d041b5dfa7b0b8c34021e8482d597",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.opencontainers.image.ref.name": "ubuntu",
"org.opencontainers.image.version": "22.04"
}
},
"DockerVersion": "24.0.5",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "sha256:64eb624dad5b3ed5cc42087e682ea3543d9d041b5dfa7b0b8c34021e8482d597",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.opencontainers.image.ref.name": "ubuntu",
"org.opencontainers.image.version": "22.04"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 77854380,
"VirtualSize": 77854380,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/86c591d5a6e7dd579b16f0b727691b713c98bab5237a8eae8171def480e0ea46/merged",
"UpperDir": "/var/lib/docker/overlay2/86c591d5a6e7dd579b16f0b727691b713c98bab5237a8eae8171def480e0ea46/diff",
"WorkDir": "/var/lib/docker/overlay2/86c591d5a6e7dd579b16f0b727691b713c98bab5237a8eae8171def480e0ea46/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:8e87ff28f1b5ff2d5131999ccfa1e674cb252631c50683f5ee43fad59cbea8e1"
]
},
"Metadata": {
"LastTagTime": "2024-01-31T01:49:50.517810821+08:00"
}
}
]2.3.3.8 查看镜像历史
docker image history, docker history : 显示镜像的历史信息
语法 :
docker history [OPTIONS] IMAGEOPTIONS--format: 用于自定义输出的格式。-H, --human: 以人类可读的方式打印大小和时间。--no-trunc: 不截断输出。-q, --quiet: 只显示数字 ID
范例
[root@centos7 ~]# docker history nginx:v1
IMAGE CREATED CREATED BY SIZE COMMENT
b179311545c3 6 hours ago /bin/bash 157MB nginx image
5d0da3dc9764 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB 2.4 容器管理


2.4.1 容器生命周期管理
2.4.1.1 容器运行
docker run可以启动容器 , 进入到容器 , 并随机生成容器ID和名称。
语法 :
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
注 : 容器内的第一个进程必须一直处于运行的状态 , 否则这个容器 , 就会处于退出状态!
注 : 其实跟
docker create一样的语法格式 , 只不过可以运行容器甚至进入容器内部退出容器并停止容器:
exit退出容器且容器不停止, 同时按三个键 :
ctrl+p+q选项
-a stdin: 指定标准输入输出内容类型 , 可选STDIN/STDOUT/STDERR三项;-i,--interactive: 以交互模式运行容器, 通常和-t一起使用-t,--tty: 为容器重新分配一个伪输入终端 , 通常和-i一起使用-d,--detach: 后台运行容器,并返回容器ID,(默认前台运行)--name string: 为容器指定一个名称-h "mars": 指定容器的hostname;--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主机一致;--cpuset="0-2" or --cpuset="0,1,2":绑定容器到指定的CPU运行-m,--memory: 设置容器使用内存最大值--network="bridge": 指定容器的网络连接类型 或者自定义网络名称, 支持bridge/host/none/container四种类型--ip: 设置为指定的IP地址--rm: 当容器退出时,删除该容器。-p,--publish list: 指定端口映射, 格式为: 主机(宿主)端口:容器端口 。-p <container port>-p <hostport>:<container port>-p <hostip>:<hostport>:<container port>/<protocol>
-P,--publish-all: 随机端口映射, 容器内容端口随机映射到主机的端口。--entrypoint string: 覆盖镜像默认的ENTRYPOINT--restart policy: 设置重启策略。涉及到的容器策略如下:no: 默认为no, 退出时不要自动重启容器on-failure[:max-retries]: 仅在容器以非零退出状态退出时才能重新启动,同样可以限制Docker守护程序尝试重新启动的次数。always: 不管退出状态如何,始终重新启动容器。当选项指定为always,Docker守护进程将尝试无限期地重启容器。无论容器的当前状态如何, 容器也将始终在守护进程启动时启动。unless-stopped: 无论退出状态如何, 始终重新启动容器, 但如果容器之前已处于停止状态, 则不要在守护进程启动时启动它。
--privileged: 为容器提供扩展权限。大约在
0.6版 ,--privileged选项被引入docker。使用该参数 ,container内的root拥有真正的root权限。否则 ,container内的root只是外部的一个普通用户权限。privileged启动的容器 , 可以看到很多host上的设备 , 并且可以执行mount。甚至允许你在docker容器中启动docker容器。
在debian容器中需要运行apt install iputils-ping procps net-tools实现网络测试的功能 ping之类
范例 : 创建一个容器 , 并且随机生成容器的名称和ID
[root@centos7 ~]# docker run -it -d centos
07033df01870614442470884804ced490f6f965c0877fa7a0070750d42d10cb0
[root@centos7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07033df01870 centos "/bin/bash" 10 minutes ago Up 10 minutes romantic_montalcini范例 : privileged 权限使用说明
[root@382ab09932a7 /]#cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@382ab09932a7 /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
|-sda1 8:1 0 1G 0 part
|-sda2 8:2 0 100G 0 part
|-sda3 8:3 0 50G 0 part
|-sda4 8:4 0 1K 0 part
`-sda5 8:5 0 2G 0 part [SWAP]
sr0 11:0 1 7G 0 rom
[root@382ab09932a7 /]# mount /dev/sda3 /mnt
mount: /mnt: permission denied.
[root@382ab09932a7 /]# exit
exit
#利用--privileged 选项运行容器
[root@centos8 ~]#podman run -it --privileged centos
#可以看到宿主机的设备
[root@a6391a8f82e3 /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
|-sda1 8:1 0 1G 0 part
|-sda2 8:2 0 100G 0 part
|-sda3 8:3 0 50G 0 part
|-sda4 8:4 0 1K 0 part
`-sda5 8:5 0 2G 0 part [SWAP]
sr0 11:0 1 7G 0 rom
[root@a6391a8f82e3 /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
overlay 104806400 2754832 102051568 3% /
tmpfs 65536 0 65536 0% /dev
tmpfs 408092 5892 402200 2% /etc/hosts
shm 64000 0 64000 0% /dev/shm
tmpfs 408092 0 408092 0% /sys/fs/cgroup
[root@a6391a8f82e3 /]# mount /dev/sda5 /mnt
mount: /mnt: unknown filesystem type 'swap'.
[root@a6391a8f82e3 /]# mount /dev/sda3 /mnt
[root@a6391a8f82e3 /]# df
Filesystem 1K-blocks Used Available Use% Mounted on
overlay 104806400 2754632 102051768 3% /
tmpfs 65536 0 65536 0% /dev
tmpfs 408092 5892 402200 2% /etc/hosts
shm 64000 0 64000 0% /dev/shm
tmpfs 408092 0 408092 0% /sys/fs/cgroup
/dev/sda3 52403200 619068 51784132 2% /mnt
[root@a6391a8f82e3 /]# touch /mnt/containter.txt
[root@a6391a8f82e3 /]# echo container data > /mnt/containter.txt
[root@a6391a8f82e3 /]# cat /mnt/containter.txt
container data
[root@a6391a8f82e3 /]#
#在宿主机查看是否生成文件
[root@centos8 ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 100G 0 part /
├─sda3 8:3 0 50G 0 part /data
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 2G 0 part [SWAP]
sr0 11:0 1 7G 0 rom
[root@centos8 ~]#ll /data/containter.txt
-rw-r--r-- 1 root root 25 Feb 29 12:26 /data/containter.txt
[root@centos8 ~]#cat /data/containter.txt
container data
[root@centos8 ~]#echo host data >> /data/containter.txt
[root@centos8 ~]#cat /data/containter.txt
container data
host data
#在容器内可看文件是否发生变化
[root@a6391a8f82e3 /]# cat /mnt/containter.txt
container data
host data范例 : 运行docker的hello world
root@ubuntu1804:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
root@ubuntu1804:~# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
root@ubuntu1804:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 3 months ago 13.3kB
root@ubuntu1804:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3756c597bfcd hello-world "/hello" 24 seconds ago Exited (0) 21 seconds ago epic_mahavira范例 :
#启动的容器在执行完shell命令就退出, 用于测试
root@ubuntu1804:~# docker run busybox /bin/echo "hello world"
hello world
root@ubuntu1804:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dbec650b51b busybox "/bin/echo 'hello wo…" 21 seconds ago Exited (0) 18 seconds ago agitated_kare范例 :
#启动容器, 自动随机字符作为容器名
[root@ubuntu1804 ~]#docker run alpine
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95967eaefd6a alpine "/bin/sh" 8 seconds ago Exited (0) 6 seconds ago confident_elion
#指定容器名称, 注意每个容器的名称要唯一
[root@ubuntu1804 ~]#docker run --name alpine1 alpine
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edd2ac2690e6 alpine "/bin/sh" 9 seconds ago Exited (0) 8 seconds ago alpine1
#创建容器后直接进入, 执行exit退出后容器关闭
[root@ubuntu1804 ~]#docker run -it --name alpine2 alpine
/ # cat /etc/issue
Welcome to Alpine Linux 3.11
Kernel \r on an \m (\l)
/ # exit
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d64f47a83e6 alpine "/bin/sh" 13 seconds ago Exited (0) 6 seconds ago alpine2
edd2ac2690e6 alpine "/bin/sh" 52 seconds ago Exited (0) 51 seconds ago alpine1
[root@ubuntu1804 ~]#docker run -it --name alpine3 alpine
/ # [root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df428caf7128 alpine "/bin/sh" 8 seconds ago Up 7 seconds alpine3
6d64f47a83e6 alpine "/bin/sh" 26 seconds ago Exited (0) 20 seconds ago alpine2
edd2ac2690e6 alpine "/bin/sh" About a minute ago Exited (0) About a minute ago alpine1
#后台启动容器
[root@ubuntu1804 ~]#docker run -d --name alpine4 alpine
3a05bbf66dac8a6ac9829c876bdb5fcb70832bf4a2898d68f6979cd8e8c517cb
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a05bbf66dac alpine "/bin/sh" 3 seconds ago Exited (0) 2 seconds ago alpine4
df428caf7128 alpine "/bin/sh" 30 seconds ago Up 28 seconds alpine3
6d64f47a83e6 alpine "/bin/sh" 48 seconds ago Exited (0) 41 seconds ago alpine2
edd2ac2690e6 alpine "/bin/sh" About a minute ago Exited (0) About a minute ago alpine1
[root@ubuntu1804 ~]#docker run -td --name alpine5 alpine
868b33da850cfcc7db8b84150fb9c7686b577889f10425bb4c5e17f28cf68a29
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
868b33da850c alpine "/bin/sh" 2 seconds ago Up 1 second alpine5
3a05bbf66dac alpine "/bin/sh" 23 seconds ago Exited (0) 23 seconds ago alpine4
df428caf7128 alpine "/bin/sh" 50 seconds ago Up 49 seconds alpine3
6d64f47a83e6 alpine "/bin/sh" About a minute ago Exited (0) About a minute ago alpine2
edd2ac2690e6 alpine "/bin/sh" About a minute ago Exited (0) About a minute ago alpine1
[root@ubuntu1804 ~]#范例 :一次性运行容器, 退出后立即删除, 用于测试
[root@ubuntu1804 ~]#docker run -it --rm alpine cat /etc/issue
Welcome to Alpine Linux 3.11
Kernel \r on an \m (\l)
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES范例 :开机自动运行容器
#默认容器不会自动启动
[root@ubuntu1804 ~]#docker run -d --name nginx -p 80:80 nginx
bce473b8b1d2f728847cdc32b664cca1bd7578bf7bdac850b501e2e5557a718a
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bce473b8b1d2 nginx "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp
[root@ubuntu1804 ~]#reboot
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#设置容器总是运行
[root@ubuntu1804 ~]#docker run -d --name nginx --restart=always -p 80:80 nginx
[root@ubuntu1804 ~]#reboot
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbdba90076e1 nginx"nginx -g 'daemon of…" About a minute agoUp 49 seconds0.0.0.0:80->80/tcp nginx2.4.1.2 容器的启动与关闭
启动容器 :
startdocker container start,docker start:启动一个或多个容器[root@centos7 ~]# docker start 1ca1eefe8f9f 1ca1eefe8f9f关闭容器:
stopdocker container stop,docker stop: 关闭一个或多个容器[root@centos7 ~]# docker stop 1ca1eefe8f9f 1ca1eefe8f9f批量关闭正在运行的容器
[root@centos7 ~]# docker stop `docker ps -a -q ` 5ff74cb3d0a6 1ca1eefe8f9f e3c8295395d5 5837851ecda2重启容器:
restartdocker container restart,docker restart: 重启一个或多个容器[root@centos7 ~]# docker restart 1ca1eefe8f9f 1ca1eefe8f9f
2.4.1.3 强制关闭正在运行的容器
docker container kill, docker kill杀死一个或多个正在运行的容器
语法 :
docker kill [OPTIONS] CONTAINER [CONTAINER...]OPTIONS-s: 发送什么信号到容器 , 默认KILL
重点
docker kill子命令可杀死一个或多个容器向容器内部的主进程发送
SIGKILL信号 ( 默认 ) , 或使用--signal选项指定的信号
范例
根据容器名字杀掉容器
docker kill tomcat7根据容器ID杀掉容器
docker kill 65d4a94f7a39批量强制关闭所有正在运行的容器
docker kill `docker ps -a -q`2.4.1.4 暂停/取消暂停容器
docker container pause, docker pause : 暂停一个或多个容器中的进程
docker container unpause, docker unpause : 取消暂停一个或多个容器中的所有进程
语法 :
docker pause CONTAINER [CONTAINER...]语法 :
docker unpause CONTAINER [CONTAINER...]
范例
暂停tomcat容器的服务
docker pause tomcat7 恢复tomcat容器的服务
docker unpause tomcat72.4.1.5 删除容器
docker rm 、docker container rm,docker container remove可以删除容器 , 即使容器正在运行当中, 也可以被强制删除掉
语法 :
docker rm [OPTIONS] CONTAINER [CONTAINER...]Options-f,--force: 强制移除正在运行的容器-l,--link: 删除指定链接-v,--volumes: 删除与容器关联的匿名卷
范例 :
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
868b33da850c alpine "/bin/sh" 2 minutes ago Up 2 minutes alpine5
3a05bbf66dac alpine "/bin/sh" 3 minutes ago Exited (0) 3 minutes ago alpine4
df428caf7128 alpine "/bin/sh" 3 minutes ago Up 3 minutes alpine3
6d64f47a83e6 alpine "/bin/sh" 3 minutes ago Exited (0) 3 minutes ago alpine2
edd2ac2690e6 alpine "/bin/sh" 4 minutes ago Exited (0) 4 minutes ago alpine1
[root@ubuntu1804 ~]#docker rm 3a05bbf66dac
3a05bbf66dac
[root@ubuntu1804 ~]#docker rm alpine5
Error response from daemon: You cannot remove a running container 868b33da850cfcc7db8b84150fb9c7686b577889f10425bb4c5e17f28cf68a29. Stop the container before attempting removal or force remove
[root@ubuntu1804 ~]#docker rm -f alpine5
alpine5范例 : 删除所有容器
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df428caf7128 alpine "/bin/sh" 4 minutes ago Up 4 minutes alpine3
6d64f47a83e6 alpine "/bin/sh" 4 minutes ago Exited (0) 4 minutes ago alpine2
edd2ac2690e6 alpine "/bin/sh" 5 minutes ago Exited (0) 5 minutes ago alpine1
[root@ubuntu1804 ~]#docker rm -f $(docker ps -a -q)
df428caf7128
6d64f47a83e6
edd2ac2690e6
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES范例 :删除指定状态容器
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd002f947cbe nginx "nginx -g 'daemon of…" 22 minutes ago Exited (137) 14 minutes ago nginx2
1f3f82995e05 nginx "nginx -g 'daemon of…" 22 minutes ago Up 4 minutes 80/tcp nginx1
[root@ubuntu1804 ~]#docker rm `docker ps -qf status=exited`
dd002f947cbe
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f3f82995e05 nginx "nginx -g 'daemon of…" 22 minutes ago Up 4 minutes 80/tcp nginx1
[root@ubuntu1804 ~]#2.4.1.6 删除所有停止容器
语法 :
docker container prune [OPTIONS]OPTIONS:--filter filter: 提供筛选条件 (e.g. "until=<timestamp>")-f,--force: 强制删除所有停止的容器
2.4.1.7 创建容器
docker container create, docker create 创建一个新的容器, 用法基本和docker run 命令一样, 只是不会像docker run一样进入到容器中
2.4.2 docker 端口映射
随机映射端口
[root@centos7 ~]# docker run -P nginx:1.16.1 #前台启动并且随机映射本地端口到容器的80端口前台启动的会话窗口无法进行其他操作, 除非退出 , 但是退出之后容器也会退出
随机映射端口, 其实默认从32768开始。之后直接访问物理机IP:映射端口即可
另外可以使用以下命令可以实现同样随机映射端口的功能
[root@centos7 ~]# docker run -it -p 192.168.194.130::80 nginx:1.16.1指定端口映射
#将服务器的80端口映射到容器中的80端口 [root@centos7 ~]# docker run -it -p 192.168.194.130:80:80 nginx:1.16.1 #将服务器的8080端口映射到容器中的80端口 [root@centos7 ~]# docker run -it -p 192.168.194.130:8080:80 nginx:1.16.1 #指定三个端口的映射 docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp -name CentOS7_test CentOS7定义多个端口映射
[root@centos7 ~]# docker run -d -it -p 80:80/tcp -p 443:443 nginx:1.16.1 a7f812e0269b83bb7efeeb75e56ba4a01b8213f10e7dcdf9301f8b31f1c8d3eb查看容器已经映射的端口
[root@centos7 ~]# docker port a7f812e0269b 80/tcp -> 0.0.0.0:80 80/tcp -> [::]:80 443/tcp -> 0.0.0.0:443 443/tcp -> [::]:443
2.4.3 进入容器方法
2.4.3.1 使用attach命令
使用方法为docker attach容器名, attach类似于VNC ,操作会在各个容器界面显示, 所有使用此方式进入容器的操作都是同步显示的且exit后容器将被关闭,且使用exit退出后容器关闭, 不推荐使用, 需要进入到有shell环境的容器, 比如CentOS为例
[root@centos7 ~]# docker run -it centos bash
[root@1ca1eefe8f9f /]#
#另外一个窗口使用attach命令
[root@centos7 ~]# docker attach 1ca1eefe8f9f
[root@1ca1eefe8f9f /]#2.4.3.2 使用exec命令
执行单次命令与进入容器, 不是很推荐此方式, 虽然exit退出容器还在运行。docker container exec 、docker exec具有同样功能。
语法 :
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]OPTIONS-d: 在后台运行命令-i: 即使没有附加也保持STDIN打开, 和-t配合-t: 进入容器的CLI模式-e: 设置环境变量--env-file: 读入环境变量文件-w: 需要执行命令的目录-u: 指定访问容器的用户名
范例
[root@centos-7 ~]# docker ps -a # 查询此时的ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a9e5785999d nginx "bash" 10 minutes ago Up 9 minutes 0.0.0.0:8111->80/tcp web442
f79459ede1da nginx "nginx -g 'daemon of…" 10 minutes ago Exited (0) 10 minutes ago web22
6b1593b435c7 nginx "bash" 14 minutes ago Up 14 minutes 0.0.0.0:88->80/tcp web1
[root@centos-7 ~]# docker exec -it 9a9e5785999d bash # 通过exec命令进入正在运行的容器
root@9a9e5785999d:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var2.4.3.3 使用nsenter命令
推荐使用此方式。nsenter 命令需要通过PID 进入到容器内部, 不过可以使用docker inspect 获取到容器的PID
nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令 , 它位于util-linux包中。此外 , nsenter也可以进入mnt, uts,ipc, pid,user命令空间 , 以及指定根目录和工作目录。
Linux的每个进程都具有命名空间 , 可以在/proc/PID/ns目录中看到命名空间的文件描述符。
语法 :
nsenter [options] <program> [<argument>...]OPTIONS-a,--all: 按照默认的/proc/[pid]/ns/*命名空间路径进入目标进程的所有命名空间。-t,--target pid: 指定被进入命名空间的目标进程的pid-m,--mount[=file]: 进入mount命令空间。如果指定了file, 则进入file的命令空间-u,--uts[=file]: 进入uts命令空间。如果指定了file, 则进入file的命令空间-i,--ipc[=file]: 进入ipc命令空间。如果指定了file, 则进入file的命令空间-n,--net[=file]: 进入net命令空间。如果指定了file, 则进入file的命令空间-p,--pid[=file]: 进入pid命令空间。如果指定了file, 则进入file的命令空间-U,--user[=file]: 进入user命令空间。如果指定了file, 则进入file的命令空间-G,--setgid gid: 设置运行程序的gid-S,--setuid uid: 设置运行程序的uid-r,--root[=directory]: 设置根目录-w,--wd[=directory]: 设置工作目录-F,--no-fork: 执行 <程序> 前不fork-Z,--follow-context: 根据--target PID设置SELinux环境-h,--help: 显示帮助信息-V,--version: 显示版本信息
如果没有给出program , 则默认执行 $SHELL。最常用的参数组合是:
# 有的版本不一定有 -a 这个参数
$ nsenter -a -t <pid> <command>
$ nsenter -m -u -i -n -p -t <pid> <command>使用nsenter进入docker容器的namespace是非常简单的 , 通常你只需要以下两步 :
# 获取相应的 Dokcer 容器的 PID
$ PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
# 使用相应参数进入程序所在的不同 NameSpace
$ nsenter -m -u -i -n -p -t $PID <command>其中可以用以下方式搜索对应容器的名称空间文件位置。其中容器空间的文件 : /var/run/docker/netns/d7b43a7db8df
[root@centos7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ff74cb3d0a6 nginx:1.16.1 "nginx -g 'daemon of…" 18 hours ago Up 37 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp pedantic_meninsky
[root@centos7 ~]# docker inspect 5ff74cb3d0a6 | grep -i sandbox
"SandboxID": "d7b43a7db8df44703a6f13bdbaa5b5b878f4c1a9ad4419d7c7c78a70a444c72f",
"SandboxKey": "/var/run/docker/netns/d7b43a7db8df",
[root@centos7 ~]# nsenter --net=/var/run/docker/netns/d7b43a7db8df sh
sh-4.2# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
示例
如果需要使用docker中的容器, 首先需要使用docker inspect命令查看容器的PID。使用nsenter命令进入该容器的网络命令空间 :
[root@centos7 ~]# docker inspect -f {{.State.Pid}} 5ff74cb3d0a6
2000
[root@centos7 ~]# nsenter -n -t2000
[root@centos7 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@centos7 ~]# exit
logout范例 : 进入指定程序所在的所有命名空间
$ docker run --rm --name test -d busybox sleep 10000
8115009baccc53a2a5f6dfff642e0d8ab1dfb95dde473d14fb9a06ce4e89364c
$ docker ps |grep busybox
8115009baccc busybox "sleep 10000" 9 seconds ago Up 8 seconds test
$ PID=$(docker inspect --format {{.State.Pid}} 8115009baccc)
$ nsenter -m -u -i -n -p -t $PID ps aux
PID USER TIME COMMAND
1 root 0:00 sleep 10000
7 root 0:00 ps aux
$ nsenter -m -u -i -n -p -t $PID hostname
8115009baccc范例 : 通过PID进入到容器中
[root@centos-7 ~]# docker inspect -f "{{.State.Pid}}" 9a9e5785999d #需要先查询PID号
8000
[root@centos-7 ~]# nsenter -t 8000 -m -u -i -n -p # 根据查询的PID号进入到容器中
root@9a9e5785999d:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var创建一个脚本直接进入到容器中 , k8s中比较常用
脚本docker_in.sh如下:
#!/bin/bash
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
nsenter -t ${PID} -m -u -i -n -p
}
docker_in $1执行脚本
[root@centos-7 ~]# docker ps -a #查看容器ID号
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14fa729e9d46 centos "centos -g 'daemon of…" 6 seconds ago Up 5 seconds 80/tcp admiring_ritchie
[root@centos-7 ~]# bash docker_in.sh 14fa729e9d46 #根据容器ID号进入到容器中
root@14fa729e9d46:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var2.4.4 容器内管理
2.4.4.1 自定义容器名称
创建时指定容器名字, 主要是涉及
--name参数[root@centos7 ~]# docker run -d -it --name nginx_test nginx:1.16.1 d64bae6588f83ab6febf1f352686bb7b4e347c13d272ce1656b220e7037a1240 [root@centos7 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d64bae6588f8 nginx:1.16.1 "nginx -g 'daemon of…" 22 seconds ago Up 21 seconds 80/tcp nginx_test a812330e3c67 centos "bash" 4 hours ago Up 4 hours cranky_galois 07033df01870 centos "/bin/bash" 4 hours ago Up 4 hours romantic_montalcini 733574fba5d6 ubuntu "/bin/bash" 4 hours ago Up 4 hours unruffled_rhodes修改创建成功之后容器的名字 , 使用命令
docker container rename,docker rename语法 :
docker rename CONTAINER NEW_NAME
2.4.4.2 创建并进入容器
[root@centos7 ~]# docker run -it centos:latest /bin/bash
[root@eb7ff44d935e /]# 进去之后可以测试容器的环境变量是否正确 , 然后按exit退出。 如果希望保留该容器,可以直接按Ctrl+p+q
2.4.4.3 单次运行容器
容器退出之后自动删除该容器
[root@centos7 ~]# docker run -it --rm --name centos-test centos
[root@546f31719cbc /]# 2.4.4.4 指定容器的DNS
涉及到的参数为--dns=
[root@centos7 ~]# docker run -it -d --dns 114.114.114.114 centos /bin/bash
5837851ecda267b161857bc512a62c25fe6c5092f10f19cf52b20754ada24995
[root@centos7 ~]# docker exec -it 58 bash
[root@5837851ecda2 /]# cat /etc/resolv.conf
search localdomain
nameserver 114.114.114.1142.4.4.5 传递运行命令
容器里面是默认不能使用systemd作为pid为1的守护进程, 因为容器里面没有kernel。
在容器里卖弄必须有一个进程可以一直运行下去, 这个进程就会被封装为PID为1的守护进程。可以使用ngnix的master进程。apache的主进程或者shell命令 , 如tail命令
容器需要有一个前台运行的进程才能保持容器的运行, 通过传递运行参数是一种方式, 另外也可以在构建镜像的时候指定容器启动时运行的前台命令。
传递参数运行的优先级要高于指定容器启动时运行的前台命令
[root@centos7 ~]# docker run -d centos /usr/bin/tail -f '/etc/hosts'
e3c8295395d5aee7511985b5f4fedcd684b3e671ce85bdcc8c6f822afcefd3ab
[root@centos7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3c8295395d5 centos "/usr/bin/tail -f /e…" 11 seconds ago Up 10 seconds wizardly_tesla2.4.5 容器操作
2.4.5.1 查看容器日志
docker container logs, docker logs获取容器的日志
语法 :
docker logs [OPTIONS] CONTAINEROPTIONS-f,--follow: 跟踪日志输出--since: 显示某个开始时间的所有日志-t,--timestamps: 显示时间戳-n,--tail: 仅列出最新 N 条容器日志--details: 显示提供给日志的其他详细信息
[root@centos-7 ~]# curl 192.168.7.100 # 在应一台主机进行测试
[root@centos-7 ~]# docker ps -a # 查看容器的ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6094b472014e centos "/bin/bash" 5 minutes ago Exited (127) 5 minutes ago web1
6acc34edcc9e nginx "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp xenodochial_turing
[root@centos-7 ~]# docker logs 6acc34edcc9e #针对容器的ID进行分析log日志
192.168.7.101 - - [14/Jan/2020:01:35:44 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"范例 : 给日志加时间戳
docker logs -t tomcat7
范例 : 打印最新5条日志
docker logs --tail 5 tomcat7
范例 : 跟踪打印日志 , 日志刷新时, 就能实时看到最新的日志了
docker logs -f tomcat72.4.5.2 查看容器
使用命令docker ps , docker container ls, docker container list, docker container ps可以查看所有容器
语法
docker ps [OPTIONS]
选项
-a: 显示所有的容器(默认只会显示正在运行的容器)-f: 根据条件过滤显示的内容。--format: 指定返回值的模板文件。-l: 显示最近创建的容器。-n: 列出最近创建的n个容器。--no-trunc: 不截断输出。-q: 静默模式 , 只显示容器编号。-s: 显示总的文件大小。
范例 :
#显示运行的容器
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d7ece7f62532 centos "/bin/bash" 23 seconds ago Up 22 seconds ecstatic_franklin
#显示全部容器, 包括退出状态的容器
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d7ece7f62532 centos "/bin/bash" 27 seconds ago Up 26 seconds ecstatic_franklin
dcdf71d17177 busybox "/bin/echo 'hello wo…" 8 minutes ago Exited (0) 8 minutes ago cool_jepsen
#只显示容器ID
[root@ubuntu1804 ~]#docker ps -a -q
d7ece7f62532
dcdf71d17177
#显示容器大小
[root@ubuntu1804 ~]#docker ps -a -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
d7ece7f62532 centos "/bin/bash" 51 seconds ago Up 50 seconds ecstatic_franklin 0B (virtual 237MB)
dcdf71d17177 busybox "/bin/echo 'hello wo…" 8 minutes ago Exited (0) 8 minutes ago cool_jepsen 0B (virtual 1.22MB)
[root@ubuntu1804 ~] 范例 : 显示指定的容器
[root@ubuntu1804 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd002f947cbe nginx "nginx -g 'daemon of…" 19 minutes ago Exited (137) 11 minutes ago nginx2
1f3f82995e05 nginx "nginx -g 'daemon of…" 19 minutes ago Up 2 minutes 80/tcp nginx1
[root@ubuntu1804 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f3f82995e05 nginx "nginx -g 'daemon of…" 19 minutes ago Up 2 minutes 80/tcp nginx1
[root@ubuntu1804 ~]#docker ps -f 'status=exited'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd002f947cbe nginx "nginx -g 'daemon of…" 19 minutes ago Exited (137) 11 minutes ago nginx22.4.5.3 查看容器详细信息
使用docker inspect 查看容器详细信息
OPTIONS-f,--format string: 指定容器的输出格式。json: 按照json格式打印TEMPLATE: 使用给定的Go模板打印输出。
-s,--size: 如果类型为容器 , 则显示总文件大小
范例 :
root@ubuntu1804:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46b2d0781eeb busybox "sh" About an hour ago Up About an hour busy_mestorf
root@ubuntu1804:~# docker inspect 46b2d0781eeb
[
{
"Id": "46b2d0781eeb9a384c208fd0dd76e94ec393d1e5e62f19b9c8a424fd4919b29a",
"Created": "2021-06-21T14:38:02.410452125Z",
"Path": "sh",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3122,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-06-21T14:38:04.809987921Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:69593048aa3acfee0f75f20b77acb549de2472063053f6730c4091b53f2dfb02",
"ResolvConfPath": "/var/lib/docker/containers/46b2d0781eeb9a384c208fd0dd76e94ec393d1e5e62f19b9c8a424fd4919b29a/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/46b2d0781eeb9a384c208fd0dd76e94ec393d1e5e62f19b9c8a424fd4919b29a/hostname",
"HostsPath": "/var/lib/docker/containers/46b2d0781eeb9a384c208fd0dd76e94ec393d1e5e62f19b9c8a424fd4919b29a/hosts",
"LogPath": "/var/lib/docker/containers/46b2d0781eeb9a384c208fd0dd76e94ec393d1e5e62f19b9c8a424fd4919b29a/46b2d0781eeb9a384c208fd0dd76e94ec393d1e5e62f19b9c8a424fd4919b29a-json.log",
"Name": "/busy_mestorf",
"RestartCount": 0,
"Driver": "aufs",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": null,
"Name": "aufs"
},
"Mounts": [],
"Config": {
"Hostname": "46b2d0781eeb",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh"
],
"Image": "docker.io/busybox",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "a0e0af54f874249087a44ceb79be3e4676a0e5b2b33e30eb41cd56f108a4331f",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/a0e0af54f874",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "ca669089d57822dc6adfc2cd0c6fbdea6463397860b5d13daa49adbe961c0e6b",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "515cecccacf06e5c1dd568c4bc5c8671f7575256b2ed1eb88e144e3f701ace7a",
"EndpointID": "ca669089d57822dc6adfc2cd0c6fbdea6463397860b5d13daa49adbe961c0e6b",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]范例 : 查看容器的IP地址
[root@centos7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a812330e3c67 centos "bash" 25 minutes ago Up 25 minutes cranky_galois
[root@centos7 ~]# docker inspect -f {{.NetworkSettings.IPAddress}} a812330e3c67
172.17.0.4范例 : 获取容器的IP地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER_ID
[root@centos7 ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' a812330e3c67
172.17.0.4范例 : 获取容器MAC地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $CONTAINER_ID
[root@centos7 ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' a812330e3c67
02:42:ac:11:00:04范例 : 获取容器日志地址
docker inspect --format='{{.LogPath}}' $CONTAINER_ID
[root@centos7 ~]# docker inspect --format='{{.LogPath}}' a812330e3c67
/var/lib/docker/containers/a812330e3c67579aa24218c1e4072f2a4b301176c389ff8ca494cbae01bd8559/a812330e3c67579aa24218c1e4072f2a4b301176c389ff8ca494cbae01bd8559-json.log范例 :获取容器镜像名
[root@centos7 ~]# docker inspect -f "{{.Config.Image}}" a812330e3c67
centos2.4.5.4 更新容器配置
docker update 、 docker container update用于更新一个或多个容器的配置, 动态更新容器配置。您可以使用此命令来防止容器消耗 Docker 主机的过多资源。使用单个命令 , 您可以对单个容器或多个容器进行限制。要指定多个容器 , 请提供以空格分隔的容器名称或 ID 列表。
语法 :
docker update [OPTIONS] CONTAINER [CONTAINER...]OPTIONS--blkio-weight: 块IO( 相对权重 ) , 介于10到1000之间 , 或0禁用 ( 默认0)--cpu-period: 限制CPU CFS( 完全公平调度程序 ) 周期--cpu-quota: 限制CPU CFS ( 完全公平调度程序 ) 配额--cpu-rt-period: 限制CPU实时周期 ( 以微秒为单位 )--cpu-rt-runtime: 将CPU实时运行时间限制在微秒级--cpu-shares,-c:CPU份额 ( 相对权重 )--cpus:CPU数量--cpuset-cpus: 允许绑定的CPU(0-3, 0,1)--cpuset-mems: 允许执行的 MEM (0-3, 0,1)--memory,-m: 内存限制--memory-reservation: 内存软限制--memory-swap: 交换限制等于内存加交换 :-1启用无限制交换--pids-limit: API 1.40+ 调整容器 pid 限制 ( 设置 -1 表示无限制 )--restart: 容器退出时应用的重新启动策略
范例 : 更新容器的cpu-shares (–cpu-shares)
要将容器的cpu份额限制为512 , 请首先确定容器名称或ID。您可以使用docker ps来查找这些值。您还可以使用从命令返回的 ID docker run。然后 , 执行以下操作 :
$ docker update --cpu-shares 512 abebf7571666范例 : 使用cpu-shares和内存更新容器 (-m, --memory)
要更新多个容器的多个资源配置 :
$ docker update --cpu-shares 512 -m 300M abebf7571666 hopeful_morse范例 : 更新容器的内核内存约束(–kernel-memory)
您可以使用该选项更新容器的内核内存限制--kernel-memory 。在早于 4.6 的内核版本上 , 仅当容器以--kernel-memory. 如果容器已启动 , --kernel-memory则需要在更新内核内存之前停止容器。
例如 , 如果您使用以下命令启动了一个容器:
$ docker run -dit --name test --kernel-memory 50M ubuntu bash您可以在容器运行时更新内核内存 :
$ docker update --kernel-memory 80M test如果您启动了一个没有初始化内核内存的容器 :
$ docker run -dit --name test2 --memory 300M ubuntu bash更新正在运行的容器的内核内存test2将失败。您需要在更新设置之前停止容器--kernel-memory。下次启动时 , 容器将使用新值。
比 ( 含 ) 4.6更新的内核版本没有此限制 , 您可以使用--kernel-memory与其他选项相同的方式。
范例 : 更新容器的重启策略(–restart)
您可以更改正在运行的容器的容器重启策略。docker update新的重启策略在容器上运行后立即生效。
要更新一个或多个容器的重启策略 :
$ docker update --restart=on-failure:3 abebf7571666 hopeful_morse请注意 , 如果容器使用“–rm”标志启动 , 则无法更新其重启策略。对于容器来说 和 是互斥的AutoRemove。RestartPolicy
2.4.5.5 查看容器中运行的进程
docker container top, docker top : 查看容器中所有运行的进程。其中用法中的ps OPTIONS 表示使用ps的命令参数
语法 :
ocker top CONTAINER [ps OPTIONS]
范例
[root@centos7 ~]# docker top d9
UID PID PPID C STIME TTY TIME CMD
root 6594 6573 0 06:43 pts/0 00:00:00 /bin/bash
[root@centos7 ~]# docker top d9 aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 6594 0.0 0.1 12036 2148 pts/0 Ss+ 06:43 0:00 /bin/bash
[root@centos7 ~]# docker top d9 -ef
UID PID PPID C STIME TTY TIME CMD
root 6594 6573 0 06:43 pts/0 00:00:00 /bin/bash2.4.5.6 通过容器导入导出镜像
docker image import , docker import : 从 tar 归档文件中创建镜像
语法 :
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]OPTIONS-m: 提交时的说明文字-c: 将Dockerfile指令应用于创建的映像
范例 :
docker import test.tar poloyy/tomcat
docker container export, docker export : 将容器的文件系统导出为 tar 文件
语法 :
docker export [OPTIONS] CONTAINER-o: 将输入内容写到文件
范例 :
docker export -o test.tar jenkins1
2.4.5.7 阻塞容器
docker wait、docker container wait 是Docker的一个命令 , 主要用于阻塞一个或多个Docker容器 , 直到容器停止 , 然后打印退出代码
语法 :
docker wait [OPTIONS] CONTAINER [CONTAINER...]
示例
阻塞运行的docker容器并等待退出
docker wait 800d运行后 , 终端被阻塞 , 终端信息如下 :
[root@centos79 ~]# docker wait 800d
docker stop 800d在另一个终端执行docker stop命令
[root@centos79 ~]# docker stop 800d
800d
[root@centos79 ~]# 同时 , 刚才被docker wait命令阻塞的终端输出了docker容器的退出码 , 终端信息如下 :
[root@centos79 ~]# docker wait 800d
137
[root@centos79 ~]# docker wait命令等待一个正在运行的docker容器时 , docker wait命令会一直阻塞 , 等容器退出时 , docker wait命令会输出对应的退出码
阻塞并未运行的docker容器
[root@centos79 ~]# docker ps -a | grep 1579
15792fdb6bdc hello-world "/hello" 20 hours ago Exited (0) 20 hours ago distracted_panini
[root@centos79 ~]# docker wait 1579
0docker wait命令等待一个未运行的docker容器时 , docker wait命令不会阻塞 , 而是直接输出0
2.4.5.8 查看容器映射端口
docker container port, docker port列出容器的端口映射或特定映射
语法 :
docker port CONTAINER [PRIVATE_PORT[/PROTO]]PRIVATE_PORT: 指定查询的端口PROTO: 协议类型 (tcp、udp)
范例 : 列出容器所有端口的映射
docker port gitlab
范例 : 列出容器指定端口的映射
docker port gitlab 80
范例 : 列出容器指定端口和协议的映射
docker port gitlab 80/tcp
2.4.5.9 容器与本地间的文件复制
Docker的docker cp命令主要用于在本地文件系统和Docker容器之间复制文件或文件夹
使用-作为源从stdin读取tar存档, 并将其提取到容器中的目录目标。
使用-作为目标, 将容器源的tar存档流式传输到stdout。
语法
从容器复制到宿主机 :
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH从宿主机复制到容器 :
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
OPTIONS-a, --archive: 归档模式(复制所有UID/GID信息)-L, --follow-link: 总是跟在源地址符号链接-p: 保留源文件或目录的时间戳-R或-r: 递归复制整个目录
其中, CONTAINER可以是容器ID, 或者是容器名;SRC_PATH表示源文件或目录在容器内的路径;DEST_PATH表示目标文件或文件夹路径
2.4.5.11 查看容器实时统计信息
docker container stats, docker stats : 显示容器资源使用情况实时统计信息 , 包括 CPU、内存、网络和磁盘使用情况
语法 :
docker stats [OPTIONS] [CONTAINER...]OPTIONS:-a: 显示所有容器的实时信息
参考链接
segmentfault:public0821:Linux文件系统之aufs
https://zhangchenchen.github.io/2018/03/09/record-for-docker-storage-driver/
COOLSHELL- 陈皓-DOCKER基础技术 : AUFS
CSDN:Max_Cong : docker 存储驱动 ( 一 ) ---- overlay2
Docker ( 35 ) - docker inspect 命令详解 - 小菠萝测试笔记 - 博客园 (cnblogs.com)
Linux nsenter 命令简介及 切换宿主机网络为docker容器网络实践 - 尘世风 - 博客园 (cnblogs.com)
巧用 Nsenter 调取宿主机工具调试容器内程序-腾讯云开发者社区-腾讯云 (tencent.com)
Docker之一----基础介绍和命令详解 - 一叶知秋~~ - 博客园 (cnblogs.com)
Docker ( 15 ) - docker logs 命令详解 - 小菠萝测试笔记 - 博客园 (cnblogs.com)
Docker(28)- docker port 命令详解 - 小菠萝测试笔记 - 博客园 (cnblogs.com)
删除Docker镜像、卷和容器实用命令行 - 闪电博 (wbolt.com)