当前位置: 首页 > news >正文

02. Docker:安装和操作

目录

一、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/dockertee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://41q9iv61.mirror.aliyuncs.com"]    #使用自己的加速器
}
EOFsystemctl 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 EngineLoaded: 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 EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since 三 2024-12-11 18:45:24 CST; 2s agoDocs: https://docs.docker.comMain PID: 1348 (dockerd)Tasks: 8Memory: 29.4MCGroup: /system.slice/docker.service└─1348 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock12月 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/dockertee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://41q9iv61.mirror.aliyuncs.com"]    #使用自己的加速器
}
EOFsystemctl 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 EngineLoaded: 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 EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since 三 2024-12-11 18:56:33 CST; 4s agoDocs: https://docs.docker.comMain PID: 1204 (dockerd)Tasks: 17Memory: 146.6MCGroup: /system.slice/docker.service├─1204 /usr/bin/dockerd└─1211 containerd --config /var/run/docker/containerd/containerd.toml12月 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 - CommunityVersion:    26.1.4Context:    defaultDebug Mode: falsePlugins:buildx: Docker Buildx (Docker Inc.)Version:  v0.14.1Path:     /usr/libexec/docker/cli-plugins/docker-buildxcompose: 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 - CommunityVersion:           26.1.4API version:       1.45Go version:        go1.21.11Git commit:        5650f9bBuilt:             Wed Jun  5 11:32:04 2024OS/Arch:           linux/amd64Context:           defaultServer: Docker Engine - CommunityEngine:Version:          26.1.4API version:      1.45 (minimum version 1.24)Go version:       go1.21.11Git commit:       de5c9cfBuilt:            Wed Jun  5 11:31:02 2024OS/Arch:          linux/amd64Experimental:     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 |headUsage:  docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:run         Create and run a new container from an imageexec        Execute a command in a running containerps          List containersbuild       Build an image from a Dockerfile
[root@MineGi ~]# docker image --help |tail -5rm          Remove one or more imagessave        Save one or more images to a tar archive (streamed to STDOUT by default)tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGERun '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 镜像名称:标签        #当一个镜像有多个标签时,只是删除其中指定的标签,如果没指定标签,默认会删除latestdocker 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-storeLogin 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+ COMMAND942 root      20   0 1776908  80908  24860 S  93.8  4.0   2:10.23 dockerd3547 root      20   0    1624    104     56 R  81.2  0.0   0:54.43 sh3527 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 statsCONTAINER 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_bohrCONTAINER 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     1CONTAINER 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 -10     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 1cat >/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"]
}
EOFsystemctl 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

相关文章:

02. Docker:安装和操作

目录 一、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 配置镜像…...

【MySQL中多表查询和函数】

目录 1.多表查询 1.1 外键 1.2 链接查询 2.MySQL函数 内置函数简介 数值函数 字符串函数 时间日期函数 条件判断操作 开窗函数 1.多表查询 本质&#xff1a;把多个表通过主外键关联关系链接&#xff08;join&#xff09;合并成一个大表&#xff0c;在去单表查询操作…...

加速科技精彩亮相ICCAD 2024

12月11日—12日 &#xff0c;中国集成电路设计业的年度盛会——ICCAD 2024在上海世博馆隆重举行。本次活动以“智慧上海&#xff0c;芯动世界”为主旨&#xff0c;汇聚了众多业界精英&#xff0c;共同探讨集成电路产业的未来。作为半导体测试行业领军企业&#xff0c;加速科技携…...

免费下载 | 2024算网融合技术与产业白皮书

《2024算网融合技术与产业白皮书&#xff08;2023年&#xff09;》的核心内容概括如下&#xff1a; 算网融合发展概述&#xff1a; 各国细化算网战略&#xff0c;指引行业应用创新升级。 算网融合市场快速增长&#xff0c;算力互联成为投资新热点。 算网融合产业模式逐渐成型…...

Ubuntu系统下部署大语言模型:Ollama和OpenWebUI实现各大模型的人工智能自由

之前在window下安装过 Ollama和OpenWebUI搭建本地的人工智能web项目(可以看我之前写的文章),无奈电脑硬件配置太低,用qwen32b就很卡,卡出PPT了,于是又找了一台机器安装linux系统,在linux系统下测试一下速度能否可以快一些。 系统硬件介绍 Ubuntu 22.04.4 LTS CPU: i5…...

基于Mybatis,MybatisPlus实现数据库查询分页功能

基于Mybatis&#xff0c;MybatisPlus实现数据库查询分页功能 目录 基于Mybatis&#xff0c;MybatisPlus实现数据库查询分页功能使用Mybatis插件实现分页数据库准备分页插件配置和使用常用数据&#xff1a; 使用MybatisPlus插件实现分页数据库准备分页插件配置和使用自定义分页查…...

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…...

技术文档的定义和规范,以及技术文档模板参考

技术文档是指用于记录、传达和共享技术信息的文档&#xff0c;通常涵盖系统设计、开发过程、用户指南、维护手册等内容。技术文档的质量直接影响到项目的可维护性、可扩展性和团队的协作效率。以下是技术文档的定义和一些规范&#xff1a; 一、定义 技术文档是用于描述产品、系…...

基于windows环境使用nvm安装多版本nodejs

目录 前言 一、卸载node 二、nvm是什么&#xff1f; 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…...

力扣9. 回文数

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数 是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xff0c;121 是回文&#xff0c;而…...

C#—BitArray点阵列

C#—BitArray点阵列 在 C# 中&#xff0c;BitArray 类用来管理一个紧凑型的位值数组&#xff0c;数组中的值均为布尔类型&#xff0c;其中 true&#xff08;1&#xff09;表示此位为开启&#xff0c;false&#xff08;0&#xff09;表示此位为关闭。 当需要存储位&#xff08…...

国产自主可控新征程:华为原生鸿蒙系统与鲲鹏认证

华为于今年10月22日在深圳正式发布了其原生鸿蒙系统HarmonyOS NEXT。这是我国首个实现全栈自研的操作系统&#xff0c;标志着中国在操作系统领域取得了突破性进展。HarmonyOS NEXT 5.0的发布&#xff0c;使得鸿蒙操作系统成为继苹果iOS和安卓系统之后的全球第三大移动操作系统&…...

esxi8 虚拟机使用ubuntu22模板后 没有ip配置文件,只有ipv6链接正常使用

esxi8 虚拟机使用模板后 没有ip配置文件&#xff0c;只有ipv6链接正常使用&#xff0c;/etc/NetworkManager/system-connections配置下没有配置文件 只有/etc/netplan/有文件 sudo ip addr add 192.168.1.9/24 dev ens35 # 临时设置ip&#xff0c; 接口名ens35 sudo vi /et…...

【Qualcomm】IPQ5018查看连接终端RSSI、SNR、NF方法

IPQ5018 简介 IPQ5018 是高通(Qualcomm)公司推出的一款面向网络设备的系统级芯片(SoC)。它通常用于路由器、接入点和其他网络设备中,提供高性能的无线网络连接。以下是关于 IPQ5018 的一些关键特性和功能: 关键特性 高性能处理器 IPQ5018 集成了多核 CPU,通常是 ARM …...

【构建工具】现代开发的重要角色

你可能有所听闻构建工具&#xff0c;但是不知道是干什么的&#xff0c;或者是开发中用到了&#xff0c;大概会使用&#xff0c;但是想理解一下具体的工作原理等&#xff0c;那么我将分享一下我对其的理解。【 我将分为两篇来讲解】。 当我们谈到构建工具时&#xff0c;可以把它…...

【Linux系统】—— 初识 shell 与 Linux 中的用户

【Linux系统】—— 初识shell 与 Linux 中的用户 1 Xshell 运行原理1.1 命令行的组成1.2 外壳程序 2 Linux中的用户2.1 两种用户2.2 创建普通用户2.3 用户切换2.3.1 普通->超级2.3.2 超级->普通 3 指令的短暂提权3.1 为什么要提权3.2 sudo 指令3.3 人人都能提权吗 1 Xshe…...

二维码数据集,使用yolov,voc,coco标注,3044张各种二维码原始图片(未图像增强)

二维码数据集&#xff0c;使用yolov&#xff0c;voc&#xff0c;coco标注&#xff0c;3044张各种二维码原始图片&#xff08;未图像增强&#xff09; 数据集分割 训练组70&#xff05; 2132图片 有效集20&#xff05; 607图片 测试集10&#xff05; 305图…...

Vue指令

创建项目&#xff1a; vue init webpack 项目名称 element-ui npm i element-ui -saxios npm i axios1.1.3 -S vuex npm i vuex3.6.2 -S vuex持久化 npm i -S vuex-persistedstate4.1.0代理模版 proxyTable: {/api: {target: http://localhost:8081/,changeOrigin: true,pathRe…...

数据保护策略:如何保障重要信息的安全

一、什么是数据安全&#xff1f; 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程&#xff0c;负责监督信息的收集、存储和传输。 机密性&#xff1a;保护数据免遭未授权方访问。 完整性&#xff1a;保护数据免遭未经授权的修改、损坏…...

Chrome webdriver下载-避坑

WebDriver以原生的方式驱动浏览器&#xff0c;不需要调整环境变量。 一、window版 1.chrome和chromedriver下载地址&#xff1a; Chrome for Testing availability 我下载的是如下两个安装包&#xff0c;解压即可。 2.导包 pip install selenium然后用python代码引用即可…...

递归求最大公约数

#include <stdio.h>// 函数声明 int gcd(int a, int b);int main() {int x, y;printf("请输入两个正整数&#xff1a;");scanf("%d %d", &x, &y);printf("最大公约数是&#xff1a;%d\n", gcd(x, y));return 0; }// 递归求最大公约…...

关于在浏览器里面获取手机方向的事件

先说问题&#xff1a;浏览器有一个自带原生的获取手机方向的事件方法 deviceorientation: https://developer.mozilla.org/en-US/docs/Web/API/DeviceOrientationEvent/DeviceOrientationEvent 这个事件里面有个实例absolute 看名字知道意思吧&#xff0c;对就是绝对坐标的意…...

STM32 出租车计价器系统设计(一) 江科大源码改写

STM32 出租车计价器系统设计 功能目标 驱动步进电机模拟车轮旋转&#xff0c;并实现调速功能。 设置车轮周长和单价&#xff0c;检测车轮转速和运转时间。 计算并显示行驶里程和价格。 硬件材料 28BYJ48 五线四相步进电机和 ULN2003 驱动板模块 测速传感器模块 嵌入式小系统…...

eclipse rcp-创建rcp-创建target

1.创建一个target文件&#xff0c;将其命名为mine-rcp.target 2. 编辑target 2.1 点击add按钮&#xff0c;选中software site 2.2 选择一个software site 打开浏览器。 选择一个合适的eclipse作为基础版本。进入https://download.eclipse.org/eclipse/downloads/https://dow…...

微信小程序--创建一个日历组件

微信小程序–创建一个日历组件 可以创建一个日历组件&#xff0c;来展示当前月份的日期&#xff0c;并支持切换月份的功能。 一、目录结构 /pages/calendarcalendar.wxmlcalendar.scsscalendar.jscalendar.json二、calendar.wxml <view class"calendar"><…...

质量问题分析与改进常见方法

大同小异&#xff0c;本质都是定位、解决、推广三大步双归零 技术归零五条要求&#xff1a;“定位准确、机理清楚、问题复现、措施有效、举一反三”。 管理归零五条要求&#xff1a;“过程清楚、责任明确、措施落实、严肃处理、完善规章”。 航天FRACASFRACAS &#xff0c;是“…...

质数的和与积

质数的和与积 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 两个质数的和是S&#xff0c;它们的积最大是多少&#xff1f; 输入 一个不大于10000的正整数S&#xff0c;为两个质数的和。 输出 一个整…...

数据结构 (35)分配类排序

前言 分配类排序是数据结构中的一种重要排序方法&#xff0c;其核心思想是利用分配和收集过程对元素进行排序&#xff0c;而无需比较元素之间的关键字。这种方法突破了基于关键字比较的排序算法的时间下界&#xff0c;可以达到线性时间复杂度O(n)。 一、分配类排序的基本概念 分…...

Cesium隐藏默认控件

终于有时间开始整理下知识点了。 开搞 本地环境 vue3vitecesiumvite和cesium都是最新版本这里有个问题需要注意&#xff0c;就是如何为Cesium配置Vite&#xff0c;随便检索一下&#xff0c;大部分都时通过插件【vite-plugin-cesium】作为解决方案&#xff0c;我本地创建新的示…...

Spark SQL 执行计划解析源码分析

本文用于记录Spark SQL执行计划解析的源码分析。文中仅对关键要点进行提及&#xff0c;无法面面具到&#xff0c;仅描述大体的框架。 Spark的Client有很多种&#xff0c;spark-sql&#xff0c;pyspark&#xff0c;spark- submit&#xff0c;R等各种提交方式&#xff0c;这里以…...

wordpress获取分类文件/企业网站优化解决方案

特性&#xff1a;1.原子性&#xff1a;一个事务中所有对数据库的操作是一个不可分割的操作序列&#xff0c;要么全做要么全不做 2.一致性&#xff1a;数据不会因为事务的执行而遭到破坏 3.隔离性&#xff1a;一个事物的执行&#xff0c;不受其他事务的干扰&#xff0c;即并发执…...

制作网站模板教程/2022国内外重大新闻事件10条

四天来学习servlet是很痛苦的经历&#xff0c;其实可以不必要这么痛苦&#xff0c;关键是一定要学会冷静的分析问题与解决问题&#xff0c;要不言学习也没有那么多的乐趣。初学java刚满15天。 首先对于资源来说建议先读一点点的PPT大致了解一下&#xff0c;然后推荐那本&#x…...

青海省住房和建设厅网站首页/营销咨询公司排名

openstack octavia 是 openstack lbaas的支持的一种后台程序&#xff0c;提供为虚拟机流量的负载均衡。实质是类似于trove&#xff0c;调用 nove 以及neutron的api生成一台安装好haproxy和keepalived软件的虚拟机&#xff0c;并连接到目标网路。octavia共有4个组件 housekeepin…...

国外网站备案流程/百度指数查询工具

opencart作为商城系统&#xff0c;而商城系统肯定采用很多图片来装饰网站&#xff0c;那么&#xff0c;图片多就延迟了加载时间。怎么才能提高速度呢&#xff1f;除了开启GZIP压缩和图片本身的大小控制之外&#xff0c;我们还可以利用图片延迟加载&#xff01;在页脚加入两段JS…...

企业核名网上办理流程/赣州seo顾问

Quick reference for Ansible variables 【From】 https://github.com/lorin/ansible-quickref 转载于:https://www.cnblogs.com/pekkle/p/10671306.html...

网站友情链接怎么弄/太原seo快速排名

FORM Bulider开发过程中&#xff0c;有些界面在输入时&#xff0c;经常要判断输入的数据是否有重复。本文介绍一种在多列多行校验数据的方法。如下&#xff0c;完成界面上所有输入的工单不能重复的功能。分析&#xff1a;因为 FORM Bulider的许多触发器不允许使用go_record()、…...