目录
一、Docker的安装方式
1、实验环境准备
1.1 关闭防火墙
1.2 可以访问网络
1.3 配置yum源
2、yum安装docker
2.1 安装docker服务
2.2 配置镜像加速
2.3 启动docker服务
3、二进制安装docker
3.1 下载或上传安装包并解压
3.2 配置使用systemctl管理
3.3 配置镜像加速
3.4 启动并开机自启动
二、Docker的相关目录
三、Docker的相关操作
1、Docker基础操作
1.1 查看docker的详细信息
1.2 查看docker的版本信息
1.3 查看docker的帮助信息
2、Docker镜像操作
2.1 搜索镜像
2.2 获取镜像
2.3 查看镜像
2.3.1 查看本地镜像信息
2.3.2 查看镜像文件信息
2.3.3 获取指定镜像的详细信息
2.3.4 查看镜像的构建历史
2.4 导出镜像
2.5 添加标签
2.6 删除镜像
2.7 导入镜像
2.7.1 本地服务器镜像导入
2.7.2 远程服务器镜像导入
2.8 上传镜像
2.8.1 阿里云容器镜像服务平台
2.8.2 将本地镜像推送或拉取阿里云平台仓库
3、Docker容器操作
3.1 创建与运行与查看容器
3.1.1 创建新的容器
3.1.2 查看容器的状态
3.1.3 运行与关闭容器
3.1.4 查看容器的信息
3.2 创建并运行新的容器
3.2.1 创建并启动容器一次性运行
3.2.2 创建并启动容器持续性运行
3.2.3 创建容器时指定容器名称并持续运行容器
3.3 容器的生命周期
3.4 容器的进入操作
3.4.1 进入已存在的容器
3.4.2 进入新的容器
3.5 宿主机与容器之间的文件复制
3.5.1 将宿主机中的文件复制到容器内
3.5.2 将容器中的文件复制到宿主机中
3.6 容器的导出与导入
3.6.1 将容器导出成压缩包
3.6.2 导入容器镜像
3.7 容器的删除操作
3.7.1 删除指定的容器
3.7.2 批量删除多个容器
3.7.3 批量清理后台停止的容器
3.8 查看容器占用系统资源信息
3.9 查看容器进程状态
3.10 更新容器的配置
3.10.1 未更新配置之前的容器
3.10.2 已更新配置之后的容器
4、Docker仓库操作
4.1 镜像推送和拉取流程
4.1.1 镜像推送(Push)流程
4.1.2 镜像拉取(Pull)流程
4.2 部署本地的私有仓库环境
4.2.1 运行registry容器
4.2.2 修改daemon.json文件
4.3 镜像推送(Push)流程
4.3.1 标记镜像(Tagging)
4.3.2 推送镜像(Pushing)
4.3.3 验证推送(Optional)
4.4 镜像拉取(Pull)流程
4.4.1 拉取镜像(Pulling)
4.4.2 验证拉取(Optional)
四、Docker的操作总结
1、镜像管理命令
2、容器管理命令
一、Docker的安装方式
1、实验环境准备
情况说明:Docker支持在主流的操作系统平台上使用,包括Windows系统、Linux系统及MacOS系统等。目前最新的RedHat、CentOS、Ubuntu等操作系统官方软件源中都已经默认自带了Docker包,可以直接安装使用,但是比较旧,不推荐使用。可以用Docker官方的YUM源进行配置,进行安装较新的版本。
Docker发行版本:Docker-EE 企业版和Docker-CE 社区版
角色 | 操作系统 | IP地址 | 安装方式 |
服务端/客户端 | CentOS 7.8 | 10.4.7.11 | yum安装 |
服务端/客户端 | CentOS 7.8 | 10.4.7.12 | 二进制安装 |
1.1 关闭防火墙
命令示例:关闭所有设备防火墙和临时防护
systemctl disable --now firewalld
setenforce 0
输出结果:
[root@MineGi ~]# systemctl disable --now firewalld
[root@MineGi ~]# setenforce 0
setenforce: SELinux is disabled
[root@MineGi ~]#
1.2 可以访问网络
命令示例:
ping -c4 www.baidu.com
输出结果:
[root@MineGi ~]# ping -c4 www.baidu.com
PING www.a.shifen.com (220.181.38.149) 56(84) bytes of data.
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=1 ttl=128 time=58.0 ms
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=2 ttl=128 time=220 ms
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=3 ttl=128 time=35.8 ms
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=4 ttl=128 time=72.0 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 35.806/96.655/220.715/72.781 ms
[root@MineGi ~]#
1.3 配置yum源
情况说明:注意实验使用的Linux版本
命令示例:
cat /etc/redhat-release
curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
tail -1 /etc/yum.repos.d/CentOS-Base.repo
输出结果:
[root@MineGi ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[root@MineGi ~]# curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@MineGi ~]# tail -1 /etc/yum.repos.d/CentOS-Base.repo
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[root@MineGi ~]#
2、yum安装docker
2.1 安装docker服务
#移除之前的版本
yum remove docker-ce* -y
#安装方式1:脚本一键安装
curl -fsSL https://get.docker.com |bash -s docker --mirror Aliyun
#安装方式2:默认最新版本
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
#安装方式3:安装指定版本
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce.x86_64 --showduplicates | sort -r
yum install -y docker-ce-19.03.1 docker-ce-cli-19.03.1 containerd.io
#安装方式4:默认最新版本
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
#查看安装的RPM包
rpm -qa docker-ce*
命令示例:
rpm -qa docker-ce*
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
ll /etc/yum.repos.d/docker-ce.repo
yum install -y docker-ce
rpm -qa docker-ce*
输出结果:
[root@MineGi ~]# rpm -qa docker-ce*
[root@MineGi ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
--2024-12-11 18:41:57-- https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 220.181.165.67, 182.40.67.225, 182.40.67.223, ...
正在连接 mirrors.aliyun.com (mirrors.aliyun.com)|220.181.165.67|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2081 (2.0K) [application/octet-stream]
正在保存至: “/etc/yum.repos.d/docker-ce.repo”
100%[==========================================================>] 2,081 --.-K/s 用时 0s
2024-12-11 18:41:58 (244 MB/s) - 已保存 “/etc/yum.repos.d/docker-ce.repo” [2081/2081])
[root@MineGi ~]# ll /etc/yum.repos.d/docker-ce.repo
-rw-r--r-- 1 root root 2081 12月 11 18:40 /etc/yum.repos.d/docker-ce.repo
[root@MineGi ~]# yum install -y -q docker-ce
警告:/var/cache/yum/x86_64/7/docker-ce-stable/packages/docker-buildx-plugin-0.14.1-1.el7.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 621e9f35: NOKEY
导入 GPG key 0x621E9F35:
用户ID : "Docker Release (CE rpm) <docker@docker.com>"
指纹 : 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35
来自 : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
setsebool: SELinux is disabled.
[root@MineGi ~]# rpm -qa docker-ce*
docker-ce-cli-26.1.4-1.el7.x86_64
docker-ce-26.1.4-1.el7.x86_64
docker-ce-rootless-extras-26.1.4-1.el7.x86_64
[root@MineGi ~]#
2.2 配置镜像加速
#获取镜像加速器配置,需要登录
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://41q9iv61.mirror.aliyuncs.com"] #使用自己的加速器
}
EOF
systemctl daemon-reload
systemctl restart docker
命令示例:
cat >/etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://41q9iv61.mirror.aliyuncs.com",
"https://docker.cloudmessage.top",
"https://registry.docker-cn.com",
"https://docker.nju.edu.cn",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com",
"http://hub-mirror.c.163.com",
"http://f1361db2.m.daocloud.io"
]
}
EOF
输出结果:
[root@MineGi ~]# cat >/etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": [
> "https://41q9iv61.mirror.aliyuncs.com",
> "https://docker.cloudmessage.top",
> "https://registry.docker-cn.com",
> "https://docker.nju.edu.cn",
> "https://registry.cn-hangzhou.aliyuncs.com",
> "https://mirror.ccs.tencentyun.com",
> "https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com",
> "http://hub-mirror.c.163.com",
> "http://f1361db2.m.daocloud.io"
> ]
> }
> EOF
[root@MineGi ~]#
2.3 启动docker服务
命令示例:
systemctl daemon-reload
systemctl status docker
systemctl enable --now docker
systemctl status docker
输出结果:
[root@MineGi ~]# systemctl daemon-reload
[root@MineGi ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: https://docs.docker.com
[root@MineGi ~]# systemctl enable --now docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@MineGi ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 三 2024-12-11 18:45:24 CST; 2s ago
Docs: https://docs.docker.com
Main PID: 1348 (dockerd)
Tasks: 8
Memory: 29.4M
CGroup: /system.slice/docker.service
└─1348 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
12月 11 18:45:23 MineGi systemd[1]: Starting Docker Application Container Engine...
12月 11 18:45:24 MineGi dockerd[1348]: time="2024-12-11T18:45:24.012039020+08:00" level=info ...up"
12月 11 18:45:24 MineGi dockerd[1348]: time="2024-12-11T18:45:24.063092432+08:00" level=info ...t."
12月 11 18:45:24 MineGi dockerd[1348]: time="2024-12-11T18:45:24.390534501+08:00" level=info ...e."
12月 11 18:45:24 MineGi dockerd[1348]: time="2024-12-11T18:45:24.412697315+08:00" level=info ...1.4
12月 11 18:45:24 MineGi dockerd[1348]: time="2024-12-11T18:45:24.412831167+08:00" level=info ...on"
12月 11 18:45:24 MineGi dockerd[1348]: time="2024-12-11T18:45:24.492107541+08:00" level=info ...ck"
12月 11 18:45:24 MineGi systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
[root@MineGi ~]#
注意事项:
- 安装好的Docker系统有两个程序,Docker服务端和Docker客户端
- 其中Docker服务端是一个服务进程,负责管理所有容器
- Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程
- 大部分情况下Docker服务端和客户端运行在一台机器上
3、二进制安装docker
安装包下载地址:https://download.docker.com/linux/static/stable
#下载安装包并解压
wget https://download.docker.com/linux/static/stable/x86_64/docker-26.1.0.tgz
tar xzvf docker-26.1.0.tgz
----------------------------------------------------------------------------------------
#将二进制文件移动到可执行路径上的目录,例如/usr/bin/
cp docker/* /usr/bin/
----------------------------------------------------------------------------------------
#启动
dockerd &
#此命令下载测试映像并在容器中运行它
docker run hello-world
----------------------------------------------------------------------------------------
#使用 systemctl 管理
vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
#重新加载systemctl服务,并开启Docker,设置为开机自启动
systemctl daemon-reload
systemctl enable --now docker.service
3.1 下载或上传安装包并解压
【docker:百度网盘】
命令示例:
wget https://download.docker.com/linux/static/stable/x86_64/docker-26.1.0.tgz
ll docker-26.1.0.tgz
tar xf docker-26.1.0.tgz
ls
ls docker
cp docker/* /usr/bin/
输出结果:
[root@MineGi ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-26.1.0.tgz
--2024-12-11 18:49:18-- https://download.docker.com/linux/static/stable/x86_64/docker-26.1.0.tgz
正在解析主机 download.docker.com (download.docker.com)... 99.86.4.51, 99.86.4.74, 99.86.4.35, ...
正在连接 download.docker.com (download.docker.com)|99.86.4.51|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:73723712 (70M) [application/x-tar]
正在保存至: “docker-26.1.0.tgz”
100%[==========================================================>] 73,723,712 1.58MB/s 用时 43s
2024-12-11 18:50:06 (1.65 MB/s) - 已保存 “docker-26.1.0.tgz” [73723712/73723712])
[root@MineGi ~]# ll docker-26.1.0.tgz
-rw-r--r-- 1 root root 73723712 4月 23 2024 docker-26.1.0.tgz
[root@MineGi ~]# tar xf docker-26.1.0.tgz
[root@MineGi ~]# ls
docker docker-26.1.0.tgz
[root@MineGi ~]# ls docker
containerd containerd-shim-runc-v2 ctr docker dockerd docker-init docker-proxy runc
[root@MineGi ~]# cp docker/* /usr/bin/
[root@MineGi ~]#
3.2 配置使用systemctl管理
命令示例:
cat >/usr/lib/systemd/system/docker.service <<'eof'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
eof
输出结果:
[root@MineGi ~]# cat >/usr/lib/systemd/system/docker.service <<'eof'
> [Unit]
> Description=Docker Application Container Engine
> Documentation=https://docs.docker.com
> After=network-online.target firewalld.service
> Wants=network-online.target
>
> [Service]
> Type=notify
> ExecStart=/usr/bin/dockerd
> ExecReload=/bin/kill -s HUP $MAINPID
> LimitNOFILE=infinity
> LimitNPROC=infinity
> TimeoutStartSec=0
> Delegate=yes
> KillMode=process
> Restart=on-failure
> StartLimitBurst=3
> StartLimitInterval=60s
>
> [Install]
> WantedBy=multi-user.target
> eof
[root@MineGi ~]#
3.3 配置镜像加速
#获取镜像加速器配置,需要登录
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://41q9iv61.mirror.aliyuncs.com"] #使用自己的加速器
}
EOF
systemctl daemon-reload
systemctl restart docker
命令示例:
cat >/etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://41q9iv61.mirror.aliyuncs.com",
"https://docker.cloudmessage.top",
"https://registry.docker-cn.com",
"https://docker.nju.edu.cn",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com",
"http://hub-mirror.c.163.com",
"http://f1361db2.m.daocloud.io"
],
}
EOF
输出结果:
[root@MineGi ~]# cat >/etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": [
> "https://41q9iv61.mirror.aliyuncs.com",
> "https://docker.cloudmessage.top",
> "https://registry.docker-cn.com",
> "https://docker.nju.edu.cn",
> "https://registry.cn-hangzhou.aliyuncs.com",
> "https://mirror.ccs.tencentyun.com",
> "https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com",
> "http://hub-mirror.c.163.com",
> "http://f1361db2.m.daocloud.io"
> ],
> }
> EOF
-bash: /etc/docker/daemon.json: 没有那个文件或目录
[root@MineGi ~]# mkdir /etc/docker
[root@MineGi ~]# cat >/etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": [
> "https://41q9iv61.mirror.aliyuncs.com",
> "https://docker.cloudmessage.top",
> "https://registry.docker-cn.com",
> "https://docker.nju.edu.cn",
> "https://registry.cn-hangzhou.aliyuncs.com",
> "https://mirror.ccs.tencentyun.com",
> "https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com",
> "http://hub-mirror.c.163.com",
> "http://f1361db2.m.daocloud.io"
> ],
> }
> EOF
[root@MineGi ~]#
3.4 启动并开机自启动
命令示例:
systemctl status docker
systemctl daemon-reload
systemctl enable --now docker.service
systemctl status docker
输出结果:
[root@MineGi ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: https://docs.docker.com
[root@MineGi ~]# systemctl daemon-reload
[root@MineGi ~]# systemctl enable --now docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@MineGi ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 三 2024-12-11 18:56:33 CST; 4s ago
Docs: https://docs.docker.com
Main PID: 1204 (dockerd)
Tasks: 17
Memory: 146.6M
CGroup: /system.slice/docker.service
├─1204 /usr/bin/dockerd
└─1211 containerd --config /var/run/docker/containerd/containerd.toml
12月 11 18:56:32 MineGi dockerd[1204]: time="2024-12-11T18:56:32.065680243+08:00" level=info ...ock
12月 11 18:56:32 MineGi dockerd[1204]: time="2024-12-11T18:56:32.065706331+08:00" level=info ...9s"
12月 11 18:56:32 MineGi dockerd[1204]: time="2024-12-11T18:56:32.953032290+08:00" level=info ...y2"
12月 11 18:56:32 MineGi dockerd[1204]: time="2024-12-11T18:56:32.954024953+08:00" level=info ...t."
12月 11 18:56:33 MineGi dockerd[1204]: time="2024-12-11T18:56:33.244374318+08:00" level=info ...ss"
12月 11 18:56:33 MineGi dockerd[1204]: time="2024-12-11T18:56:33.321299138+08:00" level=info ...e."
12月 11 18:56:33 MineGi dockerd[1204]: time="2024-12-11T18:56:33.354083838+08:00" level=info ...1.0
12月 11 18:56:33 MineGi dockerd[1204]: time="2024-12-11T18:56:33.354382808+08:00" level=info ...on"
12月 11 18:56:33 MineGi dockerd[1204]: time="2024-12-11T18:56:33.393616674+08:00" level=info ...ck"
12月 11 18:56:33 MineGi systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
[root@MineGi ~]#
二、Docker的相关目录
情况说明:/var/lib/docker 是 Docker 引擎默认的工作目录,用于存储 Docker 运行时的各种数据
注意事项:二进制安装的docker多了一个containerd目录
命令示例:
ll /var/lib/docker
输出结果:
[root@MineGi ~]# ll /var/lib/docker
总用量 4
drwx--x--x 4 root root 138 12月 11 18:45 buildkit
drwx--x--- 2 root root 6 12月 11 18:45 containers
-rw------- 1 root root 36 12月 11 18:45 engine-id
drwx------ 3 root root 22 12月 11 18:45 image
drwxr-x--- 3 root root 19 12月 11 18:45 network
drwx--x--- 3 root root 40 12月 11 18:45 overlay2
drwx------ 4 root root 32 12月 11 18:45 plugins
drwx------ 2 root root 6 12月 11 18:45 runtimes
drwx------ 2 root root 6 12月 11 18:45 swarm
drwx------ 2 root root 6 12月 11 18:45 tmp
drwx-----x 2 root root 50 12月 11 18:45 volumes
[root@MineGi ~]#
目录/文件 | 说明 |
buildkit | 这是用于构建镜像的工具 BuildKit 的工作目录,包含构建镜像时使用的临时文件和缓存 |
containers | 存放 Docker 容器的相关信息,每个容器都有一个对应的目录,包括容器的元数据、日志、进程信息等 |
engine-id | 存放 Docker 引擎的唯一标识符,用于标识不同的 Docker 引擎实例 |
image | 存放 Docker 镜像的文件,每个镜像都有一个对应的目录,包括镜像的各个层和元数据信息 |
network | 存放 Docker 网络的相关信息,包括网络配置、状态等 |
overlay2 | 存放 Docker 使用的存储驱动 Overlay2 的数据,包括镜像层、容器文件系统等 |
plugins | 存放 Docker 插件的相关信息,包括插件的执行文件、配置等 |
runtimes | 存放 Docker 运行时的相关信息,包括不同的运行时的配置、状态等 |
swarm | 存放 Docker Swarm 集群的相关信息,包括集群配置、状态等 |
tmp | 用于存放临时文件的目录,Docker 在运行过程中会在这里创建临时文件 |
volumes | 存放 Docker 卷的数据,包括卷的内容、元数据信息等 |
注意事项:这些目录中的数据对于 Docker 引擎的正常运行非常重要,因此在管理 Docker 环境时需要谨慎处理这些目录中的数据,避免意外删除或修改导致系统故障或数据丢失
三、Docker的相关操作
1、Docker基础操作
1.1 查看docker的详细信息
命令示例:
docker info
输出结果:
[root@MineGi ~]# docker info |head
Client: Docker Engine - Community
Version: 26.1.4
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.14.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.27.1
[root@MineGi ~]#
1.2 查看docker的版本信息
命令示例:
docker version
docker --version
输出结果:
[root@MineGi ~]# docker version |head -18
Client: Docker Engine - Community
Version: 26.1.4
API version: 1.45
Go version: go1.21.11
Git commit: 5650f9b
Built: Wed Jun 5 11:32:04 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.4
API version: 1.45 (minimum version 1.24)
Go version: go1.21.11
Git commit: de5c9cf
Built: Wed Jun 5 11:31:02 2024
OS/Arch: linux/amd64
Experimental: false
[root@MineGi ~]# docker --version
Docker version 26.1.4, build 5650f9b
[root@MineGi ~]#
1.3 查看docker的帮助信息
命令示例:
# docker --help
docker help
docker image --help
输出结果:
[
[root@MineGi ~]# docker help |head
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Common Commands:
run Create and run a new container from an image
exec Execute a command in a running container
ps List containers
build Build an image from a Dockerfile
[root@MineGi ~]# docker image --help |tail -5
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
Run 'docker image COMMAND --help' for more information on a command.
[root@MineGi ~]#
2、Docker镜像操作
2.1 搜索镜像
情况说明:Docker创建容器前需要本地存在对应的镜像,如果本地加载不到相关镜像,Docker默认就会尝试从官方镜像仓库 https://hub.docker.com下载。使用docker search命令只能査找镜像,镜像的标签无法査找,因此如果需要査找docker标签,需要从网页上访问镜像仓库https://hub.docker.com进行查找。目前无法search到镜像列表,此操作可以略过。
命令格式:docker search 关键字
docker search nginx #搜索nginx镜像
docker search centos #搜索centos镜像
2.2 获取镜像
情况说明:搜索到符合需求的镜像,可以使用docker pull命令从网络下载镜像到本地使用。
命令格式:docker pull 仓库(镜像)名称[:标签]
情况说明:对于Docker镜像来说,如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest,也可以通过指定的标签来下载特定版本的某一镜像。这里标签就是用来区分镜像版本的。
docker pull nginx #获取nginx镜像,选择默认标签为latest
docker pull nginx:1.19.5 #获取nginx镜像,选择指定标签为1.19.5
命令示例:
docker pull nginx
docker pull nginx:1.19.5
输出结果:从整个下载的过程可以看出,镜像文件是由若干层(Layer)组成,我们称为AUFS(联合文件系统),是实现增量保存于更新的基础,下载过程中会输出镜像的各层信息。镜像下载到本地之后就可以随时使用该镜像了。
[root@MineGi ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
bc0965b23a04: Pull complete
650ee30bbe5e: Pull complete
8cc1569e58f5: Pull complete
362f35df001b: Pull complete
13e320bf29cd: Pull complete
7b50399908e1: Pull complete
57b64962dd94: Pull complete
Digest: sha256:fb197595ebe76b9c0c14ab68159fd3c08bd067ec62300583543f0ebda353b5be
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@MineGi ~]# docker pull nginx:1.19.5
1.19.5: Pulling from library/nginx
6ec7b7d162b2: Pull complete
bbce32568f49: Pull complete
5928664fb2b3: Pull complete
a85e904c7548: Pull complete
ac39958ca6b1: Pull complete
Digest: sha256:31de7d2fd0e751685e57339d2b4a4aa175aea922e592d36a7078d72db0a45639
Status: Downloaded newer image for nginx:1.19.5
docker.io/library/nginx:1.19.5
[root@MineGi ~]#
2.3 查看镜像
2.3.1 查看本地镜像信息
情况说明:使用 docker images 命令查看下载到本地的所有镜像。
命令格式:docker images 仓库名称[:标签]
docker images #查看所有的镜像
docker image -aq #只显示所有的镜像ID
docker images nginx #查看nginx的所有的镜像
docker images nginx:1.19.5 #查看nginx的指定版本的镜像
#-a:列出所有镜像
#-q:只显示镜像的ID
命令示例:
docker images
docker image -aq
docker images nginx
docker images nginx:1.19.5
输出结果:
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker images -aq
66f8bdd3810c
7baf28ea91eb
[root@MineGi ~]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker images nginx:1.19.5
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
信息 | 说明 |
REPOSITORY | 镜像属于的仓库 |
TAG | 镜像的标签信息,标记同一个仓库中的不同镜像 |
IMAGE ID | 镜像的唯一ID 号,唯一标识一个镜像 |
CREATED | 镜像创建时间 |
VIRTUAL SIZE | 镜像大小 |
完整的镜像名称:docker.io/library/ginx:1.19.5
docker.io:镜像的访问域名
library:项目名称
nginx:1.19.5:镜像名称:标签(版本)
2.3.2 查看镜像文件信息
情况说明:查看下载的镜像文件信息
命令示例:
ls /var/lib/docker/image/overlay2/
cat /var/lib/docker/image/overlay2/repositories.json
输出结果:
[root@MineGi ~]# ls /var/lib/docker/image/overlay2/
distribution imagedb layerdb repositories.json
[root@MineGi ~]# cat /var/lib/docker/image/overlay2/repositories.json
{"Repositories":{"nginx":{"nginx:1.19.5":"sha256:7baf28ea91eb59a68b3b3a82873d413dc9f1b6e0b89d5ad627ad80154f546be5","nginx:latest":"sha256:66f8bdd3810c96dc5c28aec39583af731b34a2cd99471530f53c8794ed5b423e","nginx@sha256:31de7d2fd0e751685e57339d2b4a4aa175aea922e592d36a7078d72db0a45639":"sha256:7baf28ea91eb59a68b3b3a82873d413dc9f1b6e0b89d5ad627ad80154f546be5","nginx@sha256:fb197595ebe76b9c0c14ab68159fd3c08bd067ec62300583543f0ebda353b5be":"sha256:66f8bdd3810c96dc5c28aec39583af731b34a2cd99471530f53c8794ed5b423e"}}}[root@MineGi ~]#
2.3.3 获取指定镜像的详细信息
情况说明:根据镜像的名称或唯一标识 ID 号,获取镜像详细信息
命令格式:docker inspect 镜像名称或镜像ID号
命令示例:
docker inspect nginx
docker inspect nginx:1.19.5
docker images
docker inspect 7baf28ea91eb
输出结果:镜像的详细信息中包括创建时间、系统版本、主机名、域名、用户、卷、标签、操作系统、设备ID等各种信息。
[root@MineGi ~]# docker inspect nginx |head
[
{
"Id": "sha256:66f8bdd3810c96dc5c28aec39583af731b34a2cd99471530f53c8794ed5b423e",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:fb197595ebe76b9c0c14ab68159fd3c08bd067ec62300583543f0ebda353b5be"
],
"Parent": "",
[root@MineGi ~]# docker inspect nginx:1.19.5 |head -5
[
{
"Id": "sha256:7baf28ea91eb59a68b3b3a82873d413dc9f1b6e0b89d5ad627ad80154f546be5",
"RepoTags": [
"nginx:1.19.5"
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker inspect 7baf28ea91eb |head -5
[
{
"Id": "sha256:7baf28ea91eb59a68b3b3a82873d413dc9f1b6e0b89d5ad627ad80154f546be5",
"RepoTags": [
"nginx:1.19.5"
[root@MineGi ~]#
2.3.4 查看镜像的构建历史
命令示例:
docker history nginx
输出结果:
[root@MineGi ~]# docker history nginx
IMAGE CREATED CREATED BY SIZE COMMENT
66f8bdd3810c 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago STOPSIGNAL SIGQUIT 0B buildkit.dockerfile.v0
<missing> 2 weeks ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENTRYPOINT ["/docker-entrypoint.sh"] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 30-tune-worker-processes.sh /docker-ent… 4.62kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 20-envsubst-on-templates.sh /docker-ent… 3.02kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 15-local-resolvers.envsh /docker-entryp… 389B buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 10-listen-on-ipv6-by-default.sh /docker… 2.12kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY docker-entrypoint.sh / # buildkit 1.62kB buildkit.dockerfile.v0
<missing> 2 weeks ago RUN /bin/sh -c set -x && groupadd --syst… 117MB buildkit.dockerfile.v0
<missing> 2 weeks ago ENV DYNPKG_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV PKG_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NJS_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NJS_VERSION=0.8.7 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NGINX_VERSION=1.27.3 0B buildkit.dockerfile.v0
<missing> 2 weeks ago LABEL maintainer=NGINX Docker Maintainers <d… 0B buildkit.dockerfile.v0
<missing> 2 weeks ago # debian.sh --arch 'amd64' out/ 'bookworm' '… 74.8MB debuerreotype 0.15
[root@MineGi ~]#
2.4 导出镜像
情况说明:当需要把一台机器上的镜像迁移到另一台机器上的时候,可以将镜像保存成本地文件,这一个过程叫做存出(导出)镜像,可以使用docker save命令进行存出操作。之后就可以复制该文件到其他机器
命令格式:docker save -o 存储的文件名 被存储的镜像名
命令示例:如果导出镜像的时候不指定标签,默认为导出该镜像的所有标签
ls
docker save -o nginx-all.tar nginx
docker save -o nginx-latest.tar nginx:latest
docker save -o nginx-1.19.5.tar nginx:1.19.5
ll
ls -lh
docker images
输出结果:
[root@MineGi ~]# ls
[root@MineGi ~]# docker save -o nginx-all.tar nginx
[root@MineGi ~]# docker save -o nginx-latest.tar nginx:latest
[root@MineGi ~]# docker save -o nginx-1.19.5.tar nginx:1.19.5
[root@MineGi ~]# ll
总用量 650420
-rw------- 1 root root 137089024 12月 11 19:31 nginx-1.19.5.tar
-rw------- 1 root root 333010432 12月 11 19:31 nginx-all.tar
-rw------- 1 root root 195927040 12月 11 19:31 nginx-latest.tar
[root@MineGi ~]# ls -lh
总用量 636M
-rw------- 1 root root 131M 12月 11 19:31 nginx-1.19.5.tar
-rw------- 1 root root 318M 12月 11 19:31 nginx-all.tar
-rw------- 1 root root 187M 12月 11 19:31 nginx-latest.tar
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
2.5 添加标签
情况说明:为本地的镜像添加新的标签
命令格式:docker tag 镜像名:[原标签] 镜像名:[新标签]
docker tag nginx test-tag-nginx #为本地的nginx镜像添加新标签,没有指定新标签,使用默认的latest标签
docker tag nginx test-tag-nginx:web01 #两个都修改了,这里的镜像名和标签可以自定义
docker tag nginx:1.19.5 test-tage-nginx #没有指定新标签,使用默认的latest标签,如果之前有latest标签,会被替换
docker tag nginx:1.19.5 test-tage-nginx:web02 #两个都修改了,标签不是复制镜像本身,只是一个别名
命令示例:
docker images
docker tag nginx test-tag-nginx
docker tag nginx test-tag-nginx:web01
docker images
docker tag nginx:1.19.5 test-tag-nginx
docker tag nginx:1.19.5 test-tag-nginx:web02
docker images
输出结果:如果没指定标签,会替换之前的latest
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker tag nginx test-tag-nginx
[root@MineGi ~]# docker tag nginx test-tag-nginx:web01
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
test-tag-nginx latest 66f8bdd3810c 2 weeks ago 192MB
test-tag-nginx web01 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker tag nginx:1.19.5 test-tag-nginx
[root@MineGi ~]# docker tag nginx:1.19.5 test-tag-nginx:web02
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
test-tag-nginx web01 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
test-tag-nginx latest 7baf28ea91eb 4 years ago 133MB
test-tag-nginx web02 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
2.6 删除镜像
情况说明:使用docker rmi命令可以删除多余的镜像。删除镜像的操作有两种方法:使用镜像的标签或者使用镜像的ID删除镜像。
命令格式:
docker rmi 镜像名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签,如果没指定标签,默认会删除latest
docker rmi 镜像ID号 #会彻底删除该ID号的镜像,如果镜像ID重复时,不让删除,可以使用-f强制删除
docker images #查看镜像信息
docker rmi nginx #删除nginx的镜像,不指定标签,默认为latest
docker rmi 7baf28ea91eb #使用重复的镜像ID号,会提示Error
docker images -aq #只列出所有镜像ID号
docker rmi `docker images -aq` #批量删除,重复的镜像ID还是无法删除
docker images #查看镜像信息
docker rmi `docker images -aq` -f #使用-f选项强制删除
docker images #查看镜像信息
命令示例:
docker images
docker rmi nginx
docker rmi 7baf28ea91eb
docker images -aq
docker rmi `docker images -aq`
docker images
docker rmi `docker images -aq` -f
docker images
输出结果:
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
test-tag-nginx web01 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
test-tag-nginx latest 7baf28ea91eb 4 years ago 133MB
test-tag-nginx web02 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker rmi nginx
Untagged: nginx:latest
[root@MineGi ~]# docker rmi nginx
Error response from daemon: No such image: nginx:latest
[root@MineGi ~]# docker rmi 7baf28ea91eb
Error response from daemon: conflict: unable to delete 7baf28ea91eb (must be forced) - image is referenced in multiple repositories
[root@MineGi ~]# docker images -aq
66f8bdd3810c
7baf28ea91eb
7baf28ea91eb
7baf28ea91eb
[root@MineGi ~]# docker rmi `docker images -aq`
Untagged: test-tag-nginx:web01
Deleted: sha256:66f8bdd3810c96dc5c28aec39583af731b34a2cd99471530f53c8794ed5b423e
Deleted: sha256:861885804cea72da66a857f56e2d08ef29d8db273745d46e9f192553362b943d
Deleted: sha256:bced374ce582002f98d19b5a73a4acd9945fed7ed80222c4a3f9ecd6debdfbea
Deleted: sha256:b3057aca5d4f2d9f34b63f2fa532d7164c42daf3c6741ab3baef4afee5310579
Deleted: sha256:721c11eb2640980a3d5de69cb15c3f86484cf9070ef623720a54d03f699656dc
Deleted: sha256:f141f959fda67ad077ac28920ad56ca36ef7cb54fe437559a18d62075afc2cd6
Deleted: sha256:d0edcb20c85bbe98d67cb15ed1ec313958d9fff0834e5cf8aa64cb30e48790c7
Deleted: sha256:c0f1022b22a9b36851b358f44e5475e39d166e71a8073cf53c894a299239b1c5
Error response from daemon: conflict: unable to delete 7baf28ea91eb (must be forced) - image is referenced in multiple repositories
Error response from daemon: conflict: unable to delete 7baf28ea91eb (must be forced) - image is referenced in multiple repositories
Error response from daemon: conflict: unable to delete 7baf28ea91eb (must be forced) - image is referenced in multiple repositories
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
test-tag-nginx latest 7baf28ea91eb 4 years ago 133MB
test-tag-nginx web02 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker rmi `docker images -aq` -f
Untagged: nginx:1.19.5
Untagged: test-tag-nginx:latest
Untagged: test-tag-nginx:web02
Deleted: sha256:7baf28ea91eb59a68b3b3a82873d413dc9f1b6e0b89d5ad627ad80154f546be5
Deleted: sha256:76568a8765bf6788bab06a4c283b5ca6669def93eba5c1f0fc887b159f6e1dc1
Deleted: sha256:ef3c14608491697162ea3cc095a1c0c27cd6d4053aa3ea09f91c756379ebc8d1
Deleted: sha256:b538d73544a75eec8322716997990d289f2581169a82b763a0e1037c669f167d
Deleted: sha256:89942a8c1027ff865a14b0a807142453493474831ebc47c312f05ec640b16254
Deleted: sha256:87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9
Error response from daemon: No such image: 7baf28ea91eb:latest
Error response from daemon: No such image: 7baf28ea91eb:latest
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@MineGi ~]#
情况说明:
- 当一个镜像有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件,相当于只是删除了镜像的一个别名而己,但该镜像只剩下一个标签的时候就要小心了,再使用删除命令就会彻底删除该镜像。
- 当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉所有指向该镜像的标签,然后除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去除镜像。
2.7 导入镜像
情况说明:将之前存出的镜像或从其它方法获取的镜像文件存入到本地镜像列表中,这一过程叫做载入(导入)镜像
命令格式:
docker load < 存出的文件
docker load -i 存出的文件
docker load --input 存出的文件
2.7.1 本地服务器镜像导入
命令示例:
ll
docker images
docker load < nginx-latest.tar
docker load -i nginx-1.19.5.tar
docker images
输出结果:
[root@MineGi ~]# ll
总用量 650420
-rw------- 1 root root 137089024 12月 11 19:31 nginx-1.19.5.tar
-rw------- 1 root root 333010432 12月 11 19:31 nginx-all.tar
-rw------- 1 root root 195927040 12月 11 19:31 nginx-latest.tar
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@MineGi ~]# docker load < nginx-latest.tar
c0f1022b22a9: Loading layer 77.89MB/77.89MB
fc00b055de35: Loading layer 118MB/118MB
2c3a053d7b67: Loading layer 3.584kB/3.584kB
b060cc3bd13c: Loading layer 4.608kB/4.608kB
8aa4787aa17a: Loading layer 2.56kB/2.56kB
c28e0f7d0cc5: Loading layer 5.12kB/5.12kB
d32d820bcf1c: Loading layer 7.168kB/7.168kB
Loaded image: nginx:latest
[root@MineGi ~]# docker load -i nginx-1.19.5.tar
87c8a1d8f54f: Loading layer 72.5MB/72.5MB
2111bafa5ce4: Loading layer 64.55MB/64.55MB
f3ee98cb305c: Loading layer 3.072kB/3.072kB
997bdb5b26cc: Loading layer 4.096kB/4.096kB
ea6033164031: Loading layer 3.584kB/3.584kB
Loaded image: nginx:1.19.5
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
2.7.2 远程服务器镜像导入
命令示例:
hostname -I
ls
scp 10.4.7.11:/root/nginx-all.tar ./
ls
docker images
docker load --input nginx-all.tar
docker images
输出结果:
[root@MineGi ~]# hostname -I
10.4.7.12 172.17.0.1
[root@MineGi ~]# ls
docker docker-26.1.0.tgz
[root@MineGi ~]# scp 10.4.7.11:/root/nginx-all.tar ./
The authenticity of host '10.4.7.11 (10.4.7.11)' can't be established.
ECDSA key fingerprint is SHA256:gWbFfV9d3KPbh3aZzedG04X6pxEhITj+O0bESQoL98w.
ECDSA key fingerprint is MD5:15:28:ac:c6:98:7f:65:87:2d:7a:45:54:e1:d4:57:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.4.7.11' (ECDSA) to the list of known hosts.
root@10.4.7.11's password:
nginx-all.tar 100% 318MB 36.6MB/s 00:08
[root@MineGi ~]# ls
docker docker-26.1.0.tgz nginx-all.tar
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@MineGi ~]# docker load --input nginx-all.tar
87c8a1d8f54f: Loading layer 72.5MB/72.5MB
2111bafa5ce4: Loading layer 64.55MB/64.55MB
f3ee98cb305c: Loading layer 3.072kB/3.072kB
997bdb5b26cc: Loading layer 4.096kB/4.096kB
ea6033164031: Loading layer 3.584kB/3.584kB
Loaded image: nginx:1.19.5
c0f1022b22a9: Loading layer 77.89MB/77.89MB
fc00b055de35: Loading layer 118MB/118MB
2c3a053d7b67: Loading layer 3.584kB/3.584kB
b060cc3bd13c: Loading layer 4.608kB/4.608kB
8aa4787aa17a: Loading layer 2.56kB/2.56kB
c28e0f7d0cc5: Loading layer 5.12kB/5.12kB
d32d820bcf1c: Loading layer 7.168kB/7.168kB
Loaded image: nginx:latest
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
2.8 上传镜像
情况说明:本地存储的镜像越来越多,就需要指定一个专门存放这些镜像的地方也就是仓库了。目前比较方便的就是公共仓库,默认上传到Docker Hub官方仓库,需要注册使用公共仓库的账号,可以使用docker login命令来输入用户名、密码和邮箱来完成注册和登录。在上传镜像之前,需要对本地镜像添加新的标签,然后再使用docker push命令进行上传。由于Docker Hub官方仓库无法登录,我们可以使用国内的镜像仓库,比如阿里云的,可以免费使用个人仓库。后期也可以搭建个人镜像仓库。
命令格式:docker push 仓名称:标签
阿里云容器镜像服务:https://cr.console.aliyun.com/
2.8.1 阿里云容器镜像服务平台
(1)登录阿里云容器镜像服务平台
情况说明:注册并登录阿里云容器镜像服务平台,点击个人实例。
(2)命名空间
情况说明:根据个人需求,创建命名空间
(3)镜像仓库
情况说明:创建镜像仓库(可选)
(4)操作指南
1. 登录阿里云Docker Registry
$ docker login --username=mineg registry.cn-beijing.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-beijing.aliyuncs.com/mg-docker/nginx:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=mineg registry.cn-beijing.aliyuncs.com
$ docker tag [ImageId] registry.cn-beijing.aliyuncs.com/mg-docker/nginx:[镜像版本号]
$ docker push registry.cn-beijing.aliyuncs.com/mg-docker/nginx:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-beijing.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-beijing.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-beijing.aliyuncs.com/acs/agent:0.7-dfb6816
(5)设置固定密码
情况说明:可以设置登录密码,用于服务器登录
2.8.2 将本地镜像推送或拉取阿里云平台仓库
(1)登录阿里云Docker Registry
$ docker login --username=mineg registry.cn-beijing.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
命令示例:
docker login --username=mineg registry.cn-beijing.aliyuncs.com
输出结果:
[root@MineGi ~]# docker login --username=mineg registry.cn-beijing.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@MineGi ~]#
(2)将镜像推送到Registry
$ docker tag [ImageId] registry.cn-beijing.aliyuncs.com/mg-docker/nginx:[镜像版本号]
$ docker push registry.cn-beijing.aliyuncs.com/mg-docker/nginx:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
命令示例:
docker images
docker tag nginx:1.19.5 registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
docker images
docker push registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
输出结果:
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker tag nginx:1.19.5 registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
registry.cn-beijing.aliyuncs.com/mg-docker/nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker push registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
The push refers to repository [registry.cn-beijing.aliyuncs.com/mg-docker/nginx]
ea6033164031: Pushed
997bdb5b26cc: Pushed
f3ee98cb305c: Pushed
2111bafa5ce4: Pushed
87c8a1d8f54f: Pushed
1.19.5: digest: sha256:e0f65235cc7bca84baf18bb5146faa7413225bfd1013b7c72f0b85b153deccb6 size: 1362
[root@MineGi ~]#
(3)从Registry中拉取镜像
$ docker pull registry.cn-beijing.aliyuncs.com/mg-docker/nginx:[镜像版本号]
命令示例:
docker rmi -f `docker images -aq`
docker images
docker pull registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
docker images
输出结果:
[root@MineGi ~]# docker rmi -f `docker images -aq`
Untagged: nginx:latest
Deleted: sha256:66f8bdd3810c96dc5c28aec39583af731b34a2cd99471530f53c8794ed5b423e
Deleted: sha256:861885804cea72da66a857f56e2d08ef29d8db273745d46e9f192553362b943d
Deleted: sha256:bced374ce582002f98d19b5a73a4acd9945fed7ed80222c4a3f9ecd6debdfbea
Deleted: sha256:b3057aca5d4f2d9f34b63f2fa532d7164c42daf3c6741ab3baef4afee5310579
Deleted: sha256:721c11eb2640980a3d5de69cb15c3f86484cf9070ef623720a54d03f699656dc
Deleted: sha256:f141f959fda67ad077ac28920ad56ca36ef7cb54fe437559a18d62075afc2cd6
Deleted: sha256:d0edcb20c85bbe98d67cb15ed1ec313958d9fff0834e5cf8aa64cb30e48790c7
Deleted: sha256:c0f1022b22a9b36851b358f44e5475e39d166e71a8073cf53c894a299239b1c5
Untagged: nginx:1.19.5
Untagged: registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
Untagged: registry.cn-beijing.aliyuncs.com/mg-docker/nginx@sha256:e0f65235cc7bca84baf18bb5146faa7413225bfd1013b7c72f0b85b153deccb6
Deleted: sha256:7baf28ea91eb59a68b3b3a82873d413dc9f1b6e0b89d5ad627ad80154f546be5
Deleted: sha256:76568a8765bf6788bab06a4c283b5ca6669def93eba5c1f0fc887b159f6e1dc1
Deleted: sha256:ef3c14608491697162ea3cc095a1c0c27cd6d4053aa3ea09f91c756379ebc8d1
Deleted: sha256:b538d73544a75eec8322716997990d289f2581169a82b763a0e1037c669f167d
Deleted: sha256:89942a8c1027ff865a14b0a807142453493474831ebc47c312f05ec640b16254
Deleted: sha256:87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9
Error response from daemon: No such image: 7baf28ea91eb:latest
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@MineGi ~]# docker pull registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
1.19.5: Pulling from mg-docker/nginx
6ec7b7d162b2: Pull complete
bbce32568f49: Pull complete
5928664fb2b3: Pull complete
a85e904c7548: Pull complete
ac39958ca6b1: Pull complete
Digest: sha256:e0f65235cc7bca84baf18bb5146faa7413225bfd1013b7c72f0b85b153deccb6
Status: Downloaded newer image for registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
registry.cn-beijing.aliyuncs.com/mg-docker/nginx:1.19.5
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-beijing.aliyuncs.com/mg-docker/nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
3、Docker容器操作
情况说明:容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell 环境等。镜像是只读模板,而容器会给这个只读模板一个额外的可写层。
3.1 创建与运行与查看容器
3.1.1 创建新的容器
情况说明:使用docker create创建的新容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器,需要注意的是:如果创建的新容器所使用的镜像本地没有的话,会自动从指定的仓库中拉取镜像。
命令格式:docker create [选项]... 镜像名称 镜像运行的程序
常用选项:
-i:让容器的输入保持打开
-t:让 Docker 分配一个伪终端 tty
-d:守护进程形式运行
-it:合起来实现和容器交互的作用,运行一个交互式会话 shell
#创建的nginx容器,默认处于停止状态,不运行任何程序
docker create -it nginx:latest /bin/bash
命令示例:使用docker create命令创建新容器后会返回一个唯一的ID
docker images
docker create -it alpine:latest /bin/sh
docker create -it busybox /bin/sh
docker images
输出结果:
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-beijing.aliyuncs.com/mg-docker/nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker create -it alpine:latest /bin/sh
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
38a8310d387e: Pull complete
Digest: sha256:21dc6063fd678b478f57c0e13f47560d0ea4eeba26dfc947b2a4f81f686b9f45
Status: Downloaded newer image for alpine:latest
17383977b9ecf4d9bac1c17893fe077bf80fb6a28281bfd7b92d65035f4b416a
[root@MineGi ~]# docker create -it busybox /bin/sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
9c0abc9c5bd3: Pull complete
Digest: sha256:2919d0172f7524b2d8df9e50066a682669e6d170ac0f6a49676d54358fe970b5
Status: Downloaded newer image for busybox:latest
3939281048a0b0a352aedab55c12798722bd44062fe771fd88be0295f57229ac
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 4048db5d3672 6 days ago 7.84MB
busybox latest af4709625109 2 months ago 4.27MB
registry.cn-beijing.aliyuncs.com/mg-docker/nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
3.1.2 查看容器的状态
情况说明:可以使用docker ps命令来查看所有运行中的容器的运行状态。添加-a选项可以列出系统中所有的容器的状态。
#查看容器状态
docker ps #不加-a选项,只能查看正在运行状态的容器
docker ps -a #加-a选项,查看当前所有容器
docker ps -l #-l只显示最近一次运行的容器
命令示例:
docker ps
docker ps -a
输出结果:
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939281048a0 busybox "/bin/sh" 32 seconds ago Created nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 52 seconds ago Created beautiful_merkle
[root@MineGi ~]#
情况说明:输出信息显示容器的ID号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射。其中状态一栏为空表示当前的容器处于停止状态。
标识 | 说明 |
CONTAINER ID | 容器的ID号 |
IMAGE | 加载的镜像 |
COMMAND | 运行的程序 |
CREATED | 创建时间 |
STATUS | 当前的状态 |
PORTS | 端口映射 |
NAMES | 名称 |
3.1.3 运行与关闭容器
情况说明:开启(运行)、重启和关闭容器
命令格式:docker start|restart|stop 容器的ID/名称
#使用docker create 创建新容器,需要 docker start 再启动该容器
docker start 1a82cb80f1b4 #启动指定ID的容器
docker restart 容器名称 #重启指定名称的容器
docker stop 容器名称 #关闭指定名称的容器
命令示例:
docker ps -a
docker start 3939281048a0
docker start beautiful_merkle
docker ps
docker ps -a
输出结果:容器启动后,可以看到容器状态一栏已经变为UP,表示容器已经处于启动状态。
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939281048a0 busybox "/bin/sh" 32 seconds ago Created nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 52 seconds ago Created beautiful_merkle
[root@MineGi ~]# docker start 3939281048a0
3939281048a0
[root@MineGi ~]# docker start beautiful_merkle
beautiful_merkle
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939281048a0 busybox "/bin/sh" 2 minutes ago Up 16 seconds nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 2 minutes ago Up 6 seconds beautiful_merkle
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939281048a0 busybox "/bin/sh" 2 minutes ago Up 20 seconds nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 2 minutes ago Up 11 seconds beautiful_merkle
[root@MineGi ~]#
3.1.4 查看容器的信息
情况说明:根据容器的唯一标识 ID 号,获取容器详细信息
命令格式:docker inspect 容器ID号
命令示例:
docker ps
docker inspect 3939281048a0
输出结果:
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939281048a0 busybox "/bin/sh" 3 minutes ago Up About a minute nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 3 minutes ago Up About a minute beautiful_merkle
[root@MineGi ~]# docker inspect 3939281048a0 |head
[
{
"Id": "3939281048a0b0a352aedab55c12798722bd44062fe771fd88be0295f57229ac",
"Created": "2024-12-12T02:26:30.170696152Z",
"Path": "/bin/sh",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
[root@MineGi ~]#
3.2 创建并运行新的容器
情况说明:执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令
命令格式:docker run [选项]... 镜像名称 镜像运行的程序
# docker run -it centos /bin/bash
docker:将docker后面的命令交给docker client进行处理
run:创建并运行:create+start
-it:分配交互式终端,并保证终端输入打开
centos:容器启动的镜像
/bin/bash:解释器或者容器启动后运行的命令
注意事项:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出
当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
- 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
- 利用镜像创建并启动一个容器;
- 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
- 分配一个地址池中的 IP 地址给容器;
- 执行用户指定的应用程序,执行完毕后容器被终止运行
3.2.1 创建并启动容器一次性运行
情况说明:docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。例如:启动一个名为centos:7的Docker容器中运行/usr/bin/bash命令,并且在bash命令中执行ls /mnt命令。具体来说,它会列出/mnt目录下的内容
#创建并启动容器
docker run centos:7 /usr/bin/bash -c "ls -ld /mnt"
#此时会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了
docker ps -a
命令示例:创建并启动容器,只运行cat /etc/issue命令后,容器就停止运行了
docker ps -a
docker run alpine /bin/sh -c "cat /etc/issue"
docker ps -a
输出结果:
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939281048a0 busybox "/bin/sh" 11 minutes ago Up 9 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 11 minutes ago Up 9 minutes beautiful_merkle
[root@MineGi ~]# docker run alpine /bin/sh -c "cat /etc/issue"
Welcome to Alpine Linux 3.21
Kernel \r on an \m (\l)
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab9144c652cd alpine "/bin/sh -c 'cat /et…" 7 seconds ago Exited (0) 6 seconds ago hungry_engelbart
3939281048a0 busybox "/bin/sh" 11 minutes ago Up 10 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 12 minutes ago Up 9 minutes beautiful_merkle
[root@MineGi ~]#
3.2.2 创建并启动容器持续性运行
情况说明:如果想要创建在后台持续运行的容器,需要在docker run命令之后添加 -d 选项让Docker容器以守护形式在后台运行。并且容器所运行的程序不能结束。
#运行执行一个死循环的程序的容器
docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
#可以看出容器始终处于 UP,运行状态
docker ps -a
命令示例:创建并启动容器,能在后台持续运行该容器
docker ps
docker run -d alpine /bin/sh -c "while true;do echo hello;done"
docker ps
输出结果:
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939281048a0 busybox "/bin/sh" 12 minutes ago Up 11 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 13 minutes ago Up 11 minutes beautiful_merkle
[root@MineGi ~]# docker run -d alpine /bin/sh -c "while true;do echo hello;done"
a298d9302938e72ff3c35f4ebc8c5f16659f69726e0c26fafef62ff0b044573f
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a298d9302938 alpine "/bin/sh -c 'while t…" 6 seconds ago Up 6 seconds adoring_tesla
3939281048a0 busybox "/bin/sh" 13 minutes ago Up 11 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 13 minutes ago Up 11 minutes beautiful_merkle
[root@MineGi ~]#
情况说明:此时的CPU利用率过高,可能会导致卡顿等问题
命令示例:
# top
top -b -n 1 > top_output.txt
head top_output.txt
docker ps
docker stop a298d9302938
输出结果:
[root@MineGi ~]# top -b -n 1 > top_output.txt
[root@MineGi ~]# head top_output.txt
top - 10:40:45 up 2:50, 2 users, load average: 3.44, 1.04, 0.40
Tasks: 116 total, 2 running, 114 sleeping, 0 stopped, 0 zombie
%Cpu(s): 53.1 us, 40.6 sy, 0.0 ni, 6.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2027900 total, 71280 free, 282448 used, 1674172 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1567536 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
942 root 20 0 1776908 80908 24860 S 93.8 4.0 2:10.23 dockerd
3547 root 20 0 1624 104 56 R 81.2 0.0 0:54.43 sh
3527 root 20 0 1236192 8836 4088 S 12.5 0.4 0:07.78 containerd-shim
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a298d9302938 alpine "/bin/sh -c 'while t…" About a minute ago Up About a minute adoring_tesla
3939281048a0 busybox "/bin/sh" 14 minutes ago Up 12 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 14 minutes ago Up 12 minutes beautiful_merkle
[root@MineGi ~]# docker stop a298d9302938
a298d9302938
[root@MineGi ~]#
3.2.3 创建容器时指定容器名称并持续运行容器
# 创建容器时指定容器名称,并持续运行容器
docker run -itd --name centos7 centos:7 /bin/bash
命令示例:
docker ps
docker run -itd --name alpine-test alpine /bin/sh
docker ps
输出结果:
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3939281048a0 busybox "/bin/sh" 15 minutes ago Up 14 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 16 minutes ago Up 13 minutes beautiful_merkle
[root@MineGi ~]# docker run -itd --name alpine-test alpine /bin/sh
64a901fb68b9661850f72464210ffa8c20dcf5b1d7a3ae421ba45eb9725e9e04
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64a901fb68b9 alpine "/bin/sh" 2 seconds ago Up 1 second alpine-test
3939281048a0 busybox "/bin/sh" 17 minutes ago Up 15 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 17 minutes ago Up 15 minutes beautiful_merkle
[root@MineGi ~]#
3.3 容器的生命周期
状态 | 说明 |
Created(已创建) | 当你使用docker create命令创建一个容器时,容器就处于这个状态。在这个阶段,容器已经被创建,但还没有被启动 |
Running(运行中) | 当你使用docker start命令启动一个容器时,容器进入运行状态。容器中的进程正在运行并且可以与之交互 |
Paused(已暂停) | 在某些情况下,你可以暂停一个正在运行的容器,这样容器中的所有进程会被暂停。容器处于暂停状态时,它的状态被冻结,但资源仍然被保留 |
Restarting(重启中) | 当你使用docker restart命令重启一个容器时,容器会进入重启状态。在这个阶段,容器的进程会被停止然后重新启动 |
Exited(已退出) | 当容器中的主要进程结束或者容器被手动停止时,容器会进入已退出状态。在这个阶段,容器不再运行任何进程 |
Dead(已终止) | 当Docker检测到容器中的主要进程异常退出时,容器会被标记为已终止状态。这通常发生在容器内部发生严重错误或者主进程意外终止的情况下 |
Removed(已移除) | 当你使用docker rm命令删除一个容器时,容器会被标记为已移除状态。在这个阶段,容器的所有数据和元数据都被删除,不再存在于系统中 |
3.4 容器的进入操作
情况说明:需要进入容器进行相应操作时,可以使用docker exec命令或者docker attach(不推荐)命令进入运行着的容器。
3.4.1 进入已存在的容器
命令格式:docker exec -it 容器ID/名称 /bin/bash
-i:表示让容器的输入保持打开
-t:表示让 Docker 分配一个伪终端
(1)进入指定ID的容器
docker ps -a #进入容器前,必须保证该容器正在运行
docker exec -it 已退出的容器ID /bin/bash #指定ID的容器没有运行,进入该容器,会有提示
docker exec -it 已运行的容器ID /bin/bash #指定ID的容器容器正在运行,可以直接进入
命令示例:
docker ps -a
docker exec -it a298d9302938 /bin/sh
docker exec -it 64a901fb68b9 /bin/sh
输出结果:
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64a901fb68b9 alpine "/bin/sh" About a minute ago Up About a minute alpine-test
a298d9302938 alpine "/bin/sh -c 'while t…" 5 minutes ago Exited (137) 3 minutes ago adoring_tesla
ab9144c652cd alpine "/bin/sh -c 'cat /et…" 6 minutes ago Exited (0) 6 minutes ago hungry_engelbart
3939281048a0 busybox "/bin/sh" 18 minutes ago Up 16 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 18 minutes ago Up 16 minutes beautiful_merkle
[root@MineGi ~]# docker exec -it a298d9302938 /bin/sh
Error response from daemon: container a298d9302938e72ff3c35f4ebc8c5f16659f69726e0c26fafef62ff0b044573f is not running
[root@MineGi ~]# docker exec -it 64a901fb68b9 /bin/sh
/ #
(2)进入容器后,可对当前容器进行操作
命令示例:
ls
hostname
ip r g 1
cat /etc/issue
输出结果:
/ # ls
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
/ # hostname
64a901fb68b9
/ # ip r g 1
1.0.0.0 via 172.17.0.1 dev eth0 src 172.17.0.4
/ # cat /etc/issue
Welcome to Alpine Linux 3.21
Kernel \r on an \m (\l)
/ #
(3)退出容器后,该容器仍在运行状态中
命令示例:用户可以通过所创建的终端来输入命令,通过exit命令退出容器,也可以使用Ctrl + D快捷键退出
exit
docker ps
输出结果:
/ # exit
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64a901fb68b9 alpine "/bin/sh" 6 minutes ago Up 6 minutes alpine-test
3939281048a0 busybox "/bin/sh" 23 minutes ago Up 21 minutes nostalgic_feistel
17383977b9ec alpine:latest "/bin/sh" 23 minutes ago Up 21 minutes beautiful_merkle
[root@MineGi ~]#
3.4.2 进入新的容器
#不加 -d 选项会创建容器后直接进入容器,但是退出容器,容器也会停止
docker run -it centos:7 bash
命令示例:
docker rm -f $(docker ps -qa)
docker ps -a
docker run -it busybox /bin/sh
hostname
exit
docker ps
docker ps -a
输出结果:
[root@MineGi ~]# docker rm -f $(docker ps -qa)
51805bdd89a6
64a901fb68b9
a298d9302938
ab9144c652cd
3939281048a0
17383977b9ec
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MineGi ~]# docker run -it busybox /bin/sh
/ # hostname
fdb0d193b203
/ # exit
[root@MineGi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdb0d193b203 busybox "/bin/sh" 21 seconds ago Exited (0) 13 seconds ago zealous_galileo
[root@MineGi ~]#
3.5 宿主机与容器之间的文件复制
3.5.1 将宿主机中的文件复制到容器内
情况说明:怎么把宿主机的文件传入到容器内部?可以使用docker cp命令
命令格式:docker cp 宿主机的文件 容器id:容器目标路径
#把宿主机的当前目录的文件file.txt传入到指定ID的容器内部
docker cp file.txt a7760aac1e76:/mnt/
命令示例:
echo "Hello, This is a `hostname` host file" |tee file.txt
docker ps -a
docker cp file.txt fdb0d193b203:/
docker start fdb0d193b203
docker exec -it fdb0d193b203 /bin/sh
ls /
cat /file.txt
输出结果:
[root@MineGi ~]# echo "Hello, This is a `hostname` host file" |tee file.txt
Hello, This is a MineGi host file
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdb0d193b203 busybox "/bin/sh" 4 minutes ago Exited (0) 4 minutes ago zealous_galileo
[root@MineGi ~]# docker cp file.txt fdb0d193b203:/
Successfully copied 2.05kB to fdb0d193b203:/
[root@MineGi ~]# docker start fdb0d193b203
fdb0d193b203
[root@MineGi ~]# docker exec -it fdb0d193b203 /bin/sh
/ # ls /
bin etc home lib64 root tmp var
dev file.txt lib proc sys usr
/ # cat file.txt
Hello, This is a MineGi host file
/ #
3.5.2 将容器中的文件复制到宿主机中
命令格式:docker cp 容器id:容器中的指定文件 宿主机的目标路径
#把指定ID容器内部的文件下载到宿主机的/opt/目录中
docker cp a7760aac1e76:/file.txt /opt/
命令示例:
echo "Hello, This is a `hostname` host file" |tee file.txt
ls
cat file.txt
exit
docker cp fdb0d193b203:/file.txt /opt/
ls /opt/
cat /opt/file.txt
输出结果:
/ # echo "Hello, This is a `hostname` host file" |tee file.txt
Hello, This is a fdb0d193b203 host file
/ # ls
bin etc home lib64 root tmp var
dev file.txt lib proc sys usr
/ # cat file.txt
Hello, This is a fdb0d193b203 host file
/ # exit
[root@MineGi ~]# docker cp fdb0d193b203:/file.txt /opt/
Successfully copied 2.05kB to /opt/
[root@MineGi ~]# ls /opt/
containerd file.txt
[root@MineGi ~]# cat /opt/file.txt
Hello, This is a fdb0d193b203 host file
[root@MineGi ~]#
3.6 容器的导出与导入
情况说明:用户可以将任何一个Docker 容器从一台机器迁移到另一台机器。在迁移过程中,首先需要将已经创建好的容器导出为文件,可以使用docker export命令实现,无论这个容器是处于运行状态还是停止状态均可导出。导出之后可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。但是这种方式不推荐使用,因为使用这种方法导出的镜像没有完整的构建历史。
3.6.1 将容器导出成压缩包
命令格式:docker export 容器ID/名称 > 压缩包名
docker export 7b16ecf90301 > centos7.tar #将指定ID的容器导出成压缩包
命令示例:
docker ps -a
docker export fdb0d193b203 > busybox.tar
ls -lh busybox.tar
输出结果:
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdb0d193b203 busybox "/bin/sh" 9 minutes ago Up 4 minutes zealous_galileo
[root@MineGi ~]# docker export fdb0d193b203 > busybox.tar
[root@MineGi ~]# ls -lh busybox.tar
-rw-r--r-- 1 root root 4.3M 12月 12 13:11 busybox.tar
[root@MineGi ~]#
3.6.2 导入容器镜像
情况说明:导出的文件从A机器拷贝到B机器,之后使用docker import 命令导入,导入后会生成镜像,但不会创建容器。
命令格式:cat 压缩包名 | docker import – 镜像名称:标签
cat centos7.tar | docker import - centos7:test #导入后会生成镜像,但不会创建容器
命令示例:
docker rm -f $(docker ps -qa)
docker ps -a
docker images
cat busybox.tar |docker import - busybox:test01
docker images
docker ps -a
输出结果:
[root@MineGi ~]# docker rm -f $(docker ps -qa)
fdb0d193b203
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 4048db5d3672 6 days ago 7.84MB
busybox latest af4709625109 2 months ago 4.27MB
registry.cn-beijing.aliyuncs.com/mg-docker/nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# cat busybox.tar |docker import - busybox:test01
sha256:202622f0cb02c8703c0681a5a3028b1c6692b5a6259cc1437c9fcd7bbe467198
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox test01 202622f0cb02 9 seconds ago 4.27MB
alpine latest 4048db5d3672 6 days ago 7.84MB
busybox latest af4709625109 2 months ago 4.27MB
registry.cn-beijing.aliyuncs.com/mg-docker/nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MineGi ~]#
3.7 容器的删除操作
情况说明:
- 如果删除一个正在运行的容器,可以添加-f选项强制删除,但是建议先将容器停止再做删除操作。这样可以防止误删除正在运行的容器
- Docker默认的存储目录为/var/lib/docker,Docker的镜像、容器、日志等内容全部都存储在此,可以单独使用大容量的分区来存储这些内容,并且一般选择建立LVM逻辑卷。从而避免Docker运行过程中存储目录容量不足
3.7.1 删除指定的容器
格式:docker rm [-f] 容器ID/名称
docker rm e6cd1271b9a8 #删除已经终止状态的容器
docker rm 7bcc640be688 #删除正在运行的容器
docker rm -f 7bcc640be688 #强制删除正在运行的容器
命令示例:
docker run -it busybox /bin/sh -c "date"
docker run -itd alpine /bin/sh
docker ps -a
docker rm c8fc8c4efa63
docker rm 580a867fb0de
docker rm -f 580a867fb0de
docker ps -a
输出结果:
[root@MineGi ~]# docker run -it busybox /bin/sh -c "date"
Thu Dec 12 05:18:32 UTC 2024
[root@MineGi ~]# docker run -itd alpine /bin/sh
580a867fb0dee93ba24c42102ead166c88a02b8328f3a3f7a737bbb9d8d89434
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
580a867fb0de alpine "/bin/sh" 4 seconds ago Up 3 seconds jovial_dirac
c8fc8c4efa63 busybox "/bin/sh -c date" 24 seconds ago Exited (0) 23 seconds ago youthful_volhard
[root@MineGi ~]# docker rm c8fc8c4efa63
c8fc8c4efa63
[root@MineGi ~]# docker rm 580a867fb0de
Error response from daemon: cannot remove container "/jovial_dirac": container is running: stop the container before removing or force remove
[root@MineGi ~]# docker rm 580a867fb0de -f
580a867fb0de
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@MineGi ~]#
3.7.2 批量删除多个容器
#批量停止所有的容器
方法一:docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
方法二:docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
方法三:docker stop `docker ps -aq`
#-a:列出所有容器
#-q:只显示容器的ID
#批量删除所有容器
方法一:docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
方法二:docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
方法三:docker rm `docker ps -aq`
#批量强制删除所有的容器,无论是否处在运行状态
方法一:docker ps -a | awk 'NR>=2{print "docker rm -f "$1}' | bash
方法二:docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm -f
方法三:docker rm -f `docker ps -aq`
#批量强制删除第二行后的容器,无论是否处在运行状态
方法一:docker ps -a | awk 'NR>3{print "docker rm -f "$1}' | bash
方法二:docker ps -a | awk 'NR>3{print $1}'| xargs docker rm -f
#批量强制删除第三行后(且包括第三行)的容器,无论是否处在运行状态
法一:docker ps -a | awk 'NR>=4{print "docker rm -f "$1}' | bash
法二:docker ps -a | awk 'NR>=4{print $1}'| xargs docker rm -f
命令示例:
docker ps -aq
for i in `seq 3`;do docker run -it busybox /bin/sh -c "sleep 1";done
docker ps -aq
docker ps -a | awk 'NR>=2{print $1}'
docker ps -a | awk 'NR>=2{print "docker rm "$1}'
docker ps -a | awk 'NR>=2{print "docker rm "$1}' |bash
docker ps -aq
输出结果:
[root@MineGi ~]# docker ps -aq
[root@MineGi ~]# for i in `seq 3`;do docker run -it busybox /bin/sh -c "sleep 1";done
[root@MineGi ~]# docker ps -aq
edb9daa034d9
273ca793da78
bbdb9ce93df8
[root@MineGi ~]# docker ps -a | awk 'NR>=2{print $1}'
edb9daa034d9
273ca793da78
bbdb9ce93df8
[root@MineGi ~]# docker ps -a | awk 'NR>=2{print "docker rm "$1}'
docker rm edb9daa034d9
docker rm 273ca793da78
docker rm bbdb9ce93df8
[root@MineGi ~]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' |bash
edb9daa034d9
273ca793da78
bbdb9ce93df8
[root@MineGi ~]# docker ps -aq
[root@MineGi ~]#
3.7.3 批量清理后台停止的容器
docker rm $(docker ps -a -q) #批量清理后台停止的容器
命令示例:
docker ps -aq
for i in `seq 3`;do docker run -it busybox /bin/sh -c "sleep 1";done
docker rm $(docker ps -aq)
docker ps -aq
输出结果:
[root@MineGi ~]# docker ps -aq
[root@MineGi ~]# for i in `seq 3`;do docker run -it busybox /bin/sh -c "sleep 1";done
[root@MineGi ~]# docker rm $(docker ps -aq)
865d8d2b5dec
68e0be0f966a
4582cc746a1c
[root@MineGi ~]# docker ps -aq
[root@MineGi ~]#
3.8 查看容器占用系统资源信息
命令格式:docker stats [容器ID/NAME]
命令示例:
docker run -itd alpine /bin/sh
docker stats
docker stats wonderful_bohr
输出结果:使用Ctrl + C 退出
[root@MineGi ~]# docker run -itd alpine /bin/sh
0ad8fce604e500928abd4d45d8e3c7d502f699679ff150fb3eba692ac454f77e
[root@MineGi ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
0ad8fce604e5 wonderful_bohr 0.00% 200KiB / 1.934GiB 0.01% 656B / 0B 0B / 0B 1
^C
[root@MineGi ~]# docker stats wonderful_bohr
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
0ad8fce604e5 wonderful_bohr 0.00% 200KiB / 1.934GiB 0.01% 656B / 0B 0B / 0B 1
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
0ad8fce604e5 wonderful_bohr 0.00% 200KiB / 1.934GiB 0.01% 656B / 0B 0B / 0B 1
^C
[root@MineGi ~]#
3.9 查看容器进程状态
命令格式:docker top 容器ID/NAME
命令示例:
docker ps -a
docker top 0ad8fce604e5
输出结果:
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ad8fce604e5 alpine "/bin/sh" 4 minutes ago Up 4 minutes wonderful_bohr
[root@MineGi ~]# docker top 0ad8fce604e5
UID PID PPID C STIME TTY TIME CMD
root 7467 7446 0 13:33 pts/0 00:00:00 /bin/sh
[root@MineGi ~]#
3.10 更新容器的配置
命令格式:docker update 选项 容器ID/NAME
--restart=always|on - failure|unless - stopped|no
[root@MineGi ~]# docker run --help |grep -A1 restart
--restart string Restart policy to apply when a container exits
(default "no")
[root@MineGi ~]#
功能概述
- --restart是 Docker 用于控制容器重启行为的一个重要选项。它允许用户根据不同的策略来决定容器在退出或出现故障后是否重新启动,以此来确保容器所提供服务的可用性和稳定性。
具体策略
- always
- 含义:容器总是会自动重启,不管容器是因为何种原因退出。这包括正常退出(例如容器内的应用程序正常完成任务后退出)和异常退出(如程序崩溃、资源不足等原因导致退出)。
- 应用场景:适用于那些需要始终保持运行状态的关键服务容器,比如生产环境中的 Web 服务器容器、数据库容器等。例如,对于一个对外提供网站服务的 Nginx 容器,使用--restart=always可以确保即使因为某些突发情况(如服务器的短暂网络波动、容器内 Nginx 进程意外终止等)导致容器停止,它也能立即重新启动,最大程度地减少服务中断时间。
- on - failure[:max - retries]
- 含义:只有当容器以非零退出码退出(即容器因为错误而退出)时才会重新启动。并且可以通过max - retries参数指定容器尝试重新启动的最大次数。如果不指定max - retries,默认会无限次重新启动,直到容器成功启动并保持运行状态。
- 应用场景:用于那些在出现错误后可能通过重新启动来恢复正常运行的容器。例如,一个运行自定义数据处理应用程序的容器,偶尔可能会因为数据格式异常等可恢复的错误而退出。使用--restart=on - failure可以让容器在出现这种可恢复错误后自动重启,同时如果设置了合理的max - retries,还可以避免容器因为频繁重启而进入无限循环,在达到最大重启次数后可以方便运维人员介入检查问题。
- unless - stopped
- 含义:容器会在除了被手动停止(通过docker stop命令)之外的任何情况下自动重启。这意味着如果容器是因为内部程序错误、主机重启、资源耗尽等非手动停止的原因导致停止运行,Docker 会自动重新启动容器。
- 应用场景:这种策略比较灵活,适用于大多数需要保持运行状态的服务容器,尤其是在需要频繁对容器进行维护操作(如更新、升级等)的场景。例如,一个运行后端微服务的容器,在正常运行过程中希望它能够自动重启以应对各种意外情况,但当运维人员需要手动停止容器进行软件更新时,又不希望容器自动重启干扰更新操作,--restart=unless - stopped就能很好地满足这种需求。
- no(等同于旧版本中的never)
- 含义:容器在退出后不会自动重新启动。这适用于那些执行一次性任务的容器,或者在测试场景下不希望容器自动重启而掩盖问题的情况。
- 应用场景:例如,一个用于运行数据迁移脚本的容器,脚本执行完毕后容器正常退出,就不需要再重新启动,此时可以使用--restart=no。或者在测试一个新的容器化应用程序时,为了方便观察和分析程序在退出后的状态,也可以将容器设置为--restart=no。
3.10.1 未更新配置之前的容器
命令示例:
docker ps -a
systemctl restart docker
docker ps -a
输出结果:
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ad8fce604e5 alpine "/bin/sh" 33 minutes ago Up 33 minutes wonderful_bohr
[root@MineGi ~]# systemctl restart docker
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ad8fce604e5 alpine "/bin/sh" 35 minutes ago Exited (137) About a minute ago wonderful_bohr
[root@MineGi ~]#
3.10.2 已更新配置之后的容器
命令示例:
docker ps -a
docker update --restart=always 0ad8fce604e5
docker ps -a
docker inspect 0ad8fce604e5 |grep -C1 always
systemctl restart docker
docker ps -a
输出结果:
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ad8fce604e5 alpine "/bin/sh" 37 minutes ago Exited (137) 4 minutes ago wonderful_bohr
[root@MineGi ~]# docker update --restart=always 0ad8fce604e5
0ad8fce604e5
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ad8fce604e5 alpine "/bin/sh" 39 minutes ago Exited (137) 5 minutes ago wonderful_bohr
[root@MineGi ~]# docker inspect 0ad8fce604e5 |grep -C1 always
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
[root@MineGi ~]# systemctl restart docker
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ad8fce604e5 alpine "/bin/sh" 43 minutes ago Up 2 seconds wonderful_bohr
[root@MineGi ~]#
4、Docker仓库操作
仓库(Repository)是集中存放镜像的地方。
仓库注册服务器才是存放仓库具体的服务器(Registry),每个服务器上都可以放置多个仓库,而每个仓库下可以放置多个镜像,每个镜像上可以运行多个容器,每个容器上可以跑一个应用或应用组。
仓库自身可以分为:公共仓库和私有仓库
- 官方仓库:http://hub.docker.com
- 国内仓库:dockerpool.com
4.1 镜像推送和拉取流程
4.1.1 镜像推送(Push)流程
- 本地准备:
- 开发者首先在本地构建好 Docker 镜像。这个镜像包含了应用程序及其运行所需的环境,如操作系统、库文件等。例如,一个简单的 Python 应用镜像可能包含了 Python 解释器、应用代码和相关的依赖库。
- 然后对镜像进行标记(tagging),标记通常包含镜像仓库地址、镜像名称和标签版本。例如,docker tag my - app - image:latest my - registry - address/my - app - image:v1,这里my - registry - address是镜像仓库地址,my - app - image是镜像名称,v1是标签版本。
- 认证阶段:
- 若镜像仓库(Registry)需要认证(如私有仓库),开发者需要提供认证信息(如用户名和密码或者令牌)给 Docker 客户端。这一过程确保只有授权的用户能够将镜像推送到仓库中。
- Docker 客户端会使用提供的认证信息向镜像仓库服务器发送认证请求,仓库服务器验证通过后,允许客户端进行后续的推送操作。
- 推送镜像层(Layers):
- Docker 镜像由多个只读的层(layers)组成。在推送过程中,客户端会将镜像的各个层依次发送给镜像仓库服务器。
- 对于每个层,仓库服务器会检查是否已经存在相同的层。如果已经存在,就不需要重复存储,这是基于内容哈希(content - hash)来判断的。例如,如果多个镜像共享相同的基础层(如基于相同的 Linux 发行版构建),仓库可以有效地利用存储空间。
- 更新镜像索引(Index):
- 当所有的镜像层都推送完成后,客户端会向仓库服务器发送镜像索引信息。镜像索引包含了镜像的名称、标签以及各个层的哈希值等内容。
- 仓库服务器更新其索引,记录下新推送的镜像的相关信息,此时镜像就成功存储在仓库中,可以供其他用户拉取使用。
4.1.2 镜像拉取(Pull)流程
- 查询镜像信息:
- 用户(可以是开发者、运维人员等)通过 Docker 客户端发出拉取特定镜像的请求。首先,客户端会向镜像仓库服务器查询目标镜像的信息,包括镜像的名称、标签、层信息等。
- 仓库服务器根据请求的镜像名称和标签,查找对应的镜像索引,然后将镜像索引信息返回给客户端。
- 认证阶段(如有需要):
- 与推送流程类似,如果是私有仓库,客户端需要提供认证信息来获取拉取镜像的权限。仓库服务器验证通过后,允许客户端进行后续的拉取操作。
- 拉取镜像层:
- 根据镜像索引中的层信息,客户端开始从仓库服务器拉取镜像的各个层。客户端会根据层的哈希值来确保拉取的层的准确性。
- 同样,对于已经存在于本地的相同层,客户端会自动识别,不会重复拉取,从而提高拉取效率并节省存储空间。
- 构建本地镜像:
- 当所有需要的镜像层都拉取完成后,客户端会根据镜像索引信息将这些层组合起来,构建出完整的本地镜像。
- 构建完成后,用户就可以在本地使用这个镜像来创建和运行 Docker 容器,例如通过docker run命令来启动一个基于拉取的镜像的容器,以运行相应的应用程序。
4.2 部署本地的私有仓库环境
4.2.1 运行registry容器
情况说明:安装docker后,可以通过官方提供的registry镜像部署一套本地的私有仓库环境
命令示例:
docker rm -f $(docker ps -qa)
mkdir -p /opt/data/registry
docker run -d --restart=always -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
docker ps -a
iptables -nvL -t nat |tail -1
输出结果:
[root@MineGi ~]# docker rm -f $(docker ps -qa)
0ad8fce604e5
[root@MineGi ~]# mkdir -p /opt/data/registry
[root@MineGi ~]# docker run -d --restart=always -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
dc0decf4841d: Pull complete
6cb0aa443e23: Pull complete
813676e291ef: Pull complete
dc2fb7dcec61: Pull complete
916205650bfe: Pull complete
Digest: sha256:543dade69668e02e5768d7ea2b0aa4fae6aa7384c9a5a8dbecc2be5136079ddb
Status: Downloaded newer image for registry:latest
09af0b42dd3f5c072565359ab3731b727ff91e92dc551ff9ef0b9510e5303624
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09af0b42dd3f registry "/entrypoint.sh /etc…" 23 seconds ago Up 21 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp amazing_galileo
[root@MineGi ~]# iptables -nvL -t nat |tail -1
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5000 to:172.17.0.2:5000
[root@MineGi ~]#
4.2.2 修改daemon.json文件
"insecure-registries": ["10.4.7.11:5000"]
情况说明:
- 在 Docker 的配置文件(通常是daemon.json)中,"insecure - registries": ["IP地址:端口号"]这一配置用于指定允许访问的不安全镜像仓库。
- 这里的10.4.7.11:5000是一个示例的镜像仓库地址,它被标记为 “不安全” 是因为这个仓库可能没有使用有效的 SSL/TLS 证书(例如自签名证书)或者没有进行适当的安全认证机制。
命令示例:
ip r g 1
cat >/etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://41q9iv61.mirror.aliyuncs.com",
"https://docker.cloudmessage.top",
"https://registry.docker-cn.com",
"https://docker.nju.edu.cn",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com",
"http://hub-mirror.c.163.com",
"http://f1361db2.m.daocloud.io"
],
"insecure-registries": ["10.4.7.11:5000"]
}
EOF
systemctl restart docker
输出结果:
[root@MineGi ~]# ip r g 1
1.0.0.0 via 10.4.7.254 dev eth0 src 10.4.7.11
cache
[root@MineGi ~]# cat >/etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": [
> "https://41q9iv61.mirror.aliyuncs.com",
> "https://docker.cloudmessage.top",
> "https://registry.docker-cn.com",
> "https://docker.nju.edu.cn",
> "https://registry.cn-hangzhou.aliyuncs.com",
> "https://mirror.ccs.tencentyun.com",
> "https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com",
> "http://hub-mirror.c.163.com",
> "http://f1361db2.m.daocloud.io"
> ],
> "insecure-registries": ["10.4.7.11:5000"]
> }
> EOF
[root@MineGi ~]# systemctl restart docker
[root@MineGi ~]#
4.3 镜像推送(Push)流程
4.3.1 标记镜像(Tagging)
情况说明:首先要确保镜像有正确的标记,标记格式通常是[仓库地址]/[镜像名称]:[标签]。假设你的镜像名称是my-app-image,想要推送到10.4.7.11:5000这个配置为不安全的仓库,并且标签是v1,可以使用以下命令进行标记:
docker tag my-app-image:v1 10.4.7.11:5000/my-app-image:v1
情况说明:这一步操作是告诉 Docker 将本地的my-app-image镜像与目标仓库地址、名称和标签关联起来,以便后续推送操作能够准确地将镜像发送到指定位置。
命令示例:
docker images
docker tag alpine:latest 10.4.7.11:5000/alpine:latest
docker images
输出结果:
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox test01 202622f0cb02 2 hours ago 4.27MB
alpine latest 4048db5d3672 6 days ago 7.84MB
busybox latest af4709625109 2 months ago 4.27MB
registry latest c18a86d35e98 14 months ago 25.4MB
registry.cn-beijing.aliyuncs.com/mg-docker/nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker tag alpine:latest 10.4.7.11:5000/alpine:latest
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox test01 202622f0cb02 2 hours ago 4.27MB
alpine latest 4048db5d3672 6 days ago 7.84MB
10.4.7.11:5000/alpine latest 4048db5d3672 6 days ago 7.84MB
busybox latest af4709625109 2 months ago 4.27MB
registry latest c18a86d35e98 14 months ago 25.4MB
registry.cn-beijing.aliyuncs.com/mg-docker/nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
4.3.2 推送镜像(Pushing)
情况说明:完成标记后,使用docker push命令来推送镜像。对于上面标记好的镜像,推送命令如下:
docker push 10.4.7.11:5000/my-app-image:v1
情况说明:Docker客户端会根据配置(已经将10.4.7.11:5000设置为不安全仓库),跳过安全证书验证等步骤,然后将镜像的各个层发送到指定的仓库地址。仓库会检查是否已经存在相同的层(通过内容哈希来判断),如果没有,则存储这些层,最后更新镜像索引,完成镜像的推送。
命令示例:
docker push 10.4.7.11:5000/alpine:latest
输出结果:
[root@MineGi ~]# docker push 10.4.7.11:5000/alpine:latest
The push refers to repository [10.4.7.11:5000/alpine]
3e01818d79cd: Pushed
latest: digest: sha256:fa7042902b0e812e73bbee26a6918a6138ccf6d7ecf1746e1488c0bd76cf1f34 size: 527
[root@MineGi ~]#
4.3.3 验证推送(Optional)
情况说明:
- 可以通过查看仓库的管理界面(如果仓库有相应的管理界面)或者使用仓库相关的命令行工具(如果支持)来验证镜像是否成功推送。这里没有对应的管理界面,所以此步骤省略。
- 另外,在推送过程中,Docker 客户端也会输出一些信息,如推送的进度、每个层的状态等。如果推送过程中出现错误,客户端会显示相应的错误信息,例如权限问题(如果仓库需要认证但未提供正确的认证信息)、网络问题或者镜像格式问题等,可以根据这些错误信息来排查并解决问题。
4.4 镜像拉取(Pull)流程
确认镜像标记和仓库地址
- 确保你知道要拉取镜像的完整标记(格式为[仓库地址]/[镜像名称]:[标签])。例如,之前推送到10.4.7.11:5000仓库的镜像标记为10.4.7.11:5000/my-app-image:v1。
拉取镜像操作
- 由于已经在Docker配置中将10.4.7.11:5000设置为不安全的仓库,在拉取镜像时,Docker客户端会跳过安全证书验证等步骤。使用docker pull命令来拉取镜像,如下所示:
docker pull 10.4.7.11:5000/my - app - image:v1
- Docker客户端会先向10.4.7.11:5000仓库发送请求,查询镜像的索引信息(包括镜像的名称、标签和各层的哈希值等)。然后根据索引信息,从仓库拉取镜像的各个层。如果本地已经存在相同的层(通过层的哈希值判断),则不会重复拉取。
构建本地镜像
- 当拉取完所有需要的镜像层后,Docker客户端会根据镜像索引信息将这些层组合起来,构建出完整的本地镜像。构建完成后,就可以使用这个镜像来创建和运行Docker容器,例如通过docker run命令启动一个基于拉取的镜像的容器来运行相应的应用程序。
验证拉取(Optional)
- 拉取完成后,可以使用docker images命令来查看本地是否已经成功拉取了镜像。该命令会列出本地所有的Docker镜像,包括镜像的仓库地址、名称、标签、大小等信息。如果看到刚刚拉取的镜像出现在列表中,就说明拉取成功。
- 也可以尝试使用拉取的镜像创建一个容器来验证其可用性,例如:
docker run -it 10.4.7.11:5000/my-app-image:v1 /bin/sh
- 这会以交互模式(-it)启动一个基于拉取的镜像的容器,并进入容器内部的/bin/sh命令行环境,通过这种方式可以进一步检查镜像是否完整且能正常运行。
4.4.1 拉取镜像(Pulling)
命令示例:
ip r g 1
grep insecure-registries /etc/docker/daemon.json
docker images
docker pull 10.4.7.11:5000/alpine:latest
docker images
输出结果:
[root@MineGi ~]# ip r g 1
1.0.0.0 via 10.4.7.254 dev eth0 src 10.4.7.12
cache
[root@MineGi ~]# grep insecure-registries /etc/docker/daemon.json
"insecure-registries": ["10.4.7.11:5000"]
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]# docker pull 10.4.7.11:5000/alpine:latest
latest: Pulling from alpine
38a8310d387e: Pull complete
Digest: sha256:fa7042902b0e812e73bbee26a6918a6138ccf6d7ecf1746e1488c0bd76cf1f34
Status: Downloaded newer image for 10.4.7.11:5000/alpine:latest
10.4.7.11:5000/alpine:latest
[root@MineGi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.4.7.11:5000/alpine latest 4048db5d3672 6 days ago 7.84MB
nginx latest 66f8bdd3810c 2 weeks ago 192MB
nginx 1.19.5 7baf28ea91eb 4 years ago 133MB
[root@MineGi ~]#
4.4.2 验证拉取(Optional)
命令示例:
docker run -it 10.4.7.11:5000/alpine:latest /bin/sh
ls
hostname
cat /etc/issue
exit
docker ps -a
输出结果:
[root@MineGi ~]# docker run -it 10.4.7.11:5000/alpine:latest /bin/sh
/ # ls
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
/ # hostname
b842a9a4123c
/ # cat /etc/issue
Welcome to Alpine Linux 3.21
Kernel \r on an \m (\l)
/ # exit
[root@MineGi ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b842a9a4123c 10.4.7.11:5000/alpine:latest "/bin/sh" About a minute ago Exited (0) 6 seconds ago zealous_robinson
[root@MineGi ~]#
四、Docker的操作总结
1、镜像管理命令
指令 | 描述 |
images | 列出镜像 |
build | 构建镜像来自Dockerfile |
history | 查看历史镜像 |
inspect | 显示一个或多个镜像的详细信息 |
pull | 从镜像仓库拉取镜像 |
push | 推送一个镜像到仓库 |
rmi | 移除一个或多个镜像 |
prune | 一处未使用的的镜像,没有被标记或被任何容器引用的 |
tag | 创建一个引用源镜像标记目标镜像 |
save | 保存一个或多个镜像到本地的镜像文件 |
load | 加载本地的镜像文件到docker镜像库中来自tar归档或标准输入 |
#查询 docker 版本和信息
docker version
docker info
#搜索镜像(可以自己制作镜像上传本地或官网仓库 dockerfile)
docker search 镜像名
#下载镜像
docker pull 镜像名
#查看镜像列表
docker images
#查看镜像详细信息
docker inspect 镜像ID
#给镜像打标签
docker tag 镜像名:[原标签] 镜像名:[新标签]
#docker tag nginx:latest nginx:web
#删除镜像
docker rmi 镜像名:标签
docker rmi 镜像ID
docker rmi `docker images -aq` #删除所有镜像
docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash
docker images | awk 'NR>=2{print $3}'| xargs docker rmi
#镜像导出
docker save -o 导出的文件名 镜像名
#docker save -o nginx nginx:latest
#镜像导入
docker load < 镜像文件
#docker load < nginx
2、容器管理命令
指令 | 描述 |
ps | 列出容器,-a选项:显示所有的容器 |
inspect | 显示一个或多个容器详细信息 |
attach | 附加本地标准输入,输出和错误到一个运行的容器 |
exec | 进入到指定容器中,可执行命令 |
commit | 构建一个新镜像来自一个容器 |
cp | 拷贝文件(夹)到一个容器 |
logs | 获取一个容器日志 |
port | 列出或指定容器端口映射 |
stats | 显示一容器资源使用统计 |
top | 显示一个或多个容器运行的进程 |
update | 更新一个或多个容器配置 |
stop/start | 停止/启动一个或多个容器 |
rm | 删除一个或多个容器 |
export | 导出容器文件系统到本地的tar归档文件 |
import | 导入本地的tar容器归档文件后生成镜像 |
#查询容器
docker ps #查看正在运行状态中的容器
docker ps -a #查看所有容器
#创建容器,默认处于停止状态
docker create -it nginx:latest /bin/bash
#常用参数说明
# -i 让容器的标准输入保持打开
# -t 分配一个伪终端
# -d 以后台守护进程的方式运行
#开启/停止/重启 容器
docker start 容器ID
docker stop 容器ID
docker restart 容器ID
#查看指定容器详细信息
docker inspect 容器名
docker inspect 容器ID
#创建一个能后台运行,且指定容器名称为 test 的容器
docker run -itd --name centos7 centos:7 /bin/bash
#进入容器
docker exec -it 容器ID /bin/bash #exit 退出
#容器 导出/导入
docker export 容器ID > 文件名
docker import 容器文件名 指定镜像名称 #导入的是镜像
#批量停止所有的容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop
#批量强制删除所有的容器
docker rm -f `docker ps -aq`
docker ps -a | awk 'NR>=2{print "docker rm -f "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f
#批量删除 "exit" 状态(后台停止状态)的容器
docker rm $(docker ps -a -q)
#查看容器占用系统资源信息
docker stats