Docker安装与常用命令
容器与虚拟机的区别及Docker技术解析 容器与虚拟机在虚拟化技术上有本质区别: 容器:轻量级进程隔离,共享主机内核,启动快,资源占用少,适合快速部署和弹性伸缩 虚拟机:完整操作系统虚拟化,硬件隔离,启动慢但隔离更彻底 Docker作为主流容器运行时,具有CS架构,提供三种运行时选择: Docker:适合开发环境,生态完善 Containerd:通常与Kubernetes配合使用 Podman:无
容器和虚拟机(虚拟化)的区别

Docker运行时选型
| 虚拟机 | 容器 | |
|---|---|---|
| 优点 | 1. 使用简单 2. 也有成熟管理工具,vmware esxi、vcenter、KVM、Openstack 3. 可以随意定制 4. 启动虚拟机要经历完整的 Linux 启动流程 |
1. 快速部署 (扩容,弹性伸缩) 2. 大部分环境都有现成镜像 3. 让我们不再关注系统基础设施,把关注点放在配置、升级、优化 4. 不依赖硬件 5. 启动容器秒级 6. 相当于一个进程 |
| 缺点 | 1. 需要硬件支持虚拟化技术 (VT-X) 2. 资源利用率不高 3. 同一台虚拟跑多个服务,可能有冲突 4. 占用资源较多 5. 不满足目前升级、快速扩容、快速部署、回滚不方便 |
1. 使用较为复杂 2. 共享 linux 系统内核,推荐使用较新 linux 内核 3. 自定义镜像与批量管理 |
| 运行时 (runtime) | 说明 |
|---|---|
| docker | 易用性高、生态完善,适用于开发与单机部署 |
| containerd | 一般搭配 k8s 使用 |
| podman | 无守护进程、兼容 docker 命令,安全性更强 |
Docker架构(CS)

Docker安装
包管理器安装(推荐开发环境使用)
- 优点:自动处理依赖关系,便于升级维护
- 缺点:需要联网且受发行版仓库版本限制
二进制部署(生产环境推荐)
- 优点:版本控制精确,离线环境可用,部署位置灵活
- 缺点:需手动管理依赖和更新
yum/apt安装
官方docker仓库:Index of linux/ — Linux 索引/
yum
基于kylinv10sp3
#0.安装依赖
yum install -y https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/slirp4netns-0.4.3-4.el7_8.x86_64.rpm
yum install -y https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/fuse-overlayfs-0.7.2-6.el7_8.x86_64.rpm
#1.添加docker源仓库
yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
#2.修改源
sed -i 's/$releasever/7/g' /etc/yum.repos.d/docker-ce.repo
#3.安装docker
yum install docker-ce-rootless-extras -y
yum install -y docker-ce docker-ce-cli containerd.io
#4.开启并设置开机自启docker,并查看版本
#5.设置docker镜像加速
systemctl enable --now docker && docker --version
cat >/etc/docker/daemon.json<<'EOF'
> {
> "registry-mirrors" : ["https://do.nark.eu.org",
> "https://dc.j8.work",
> "https://docker.m.daocloud.io",
> "https://dockerproxy.com",
> "https://docker.mirrors.ustc.edu.cn",
> "https://docker.nju.edu.cn",
> "https://docker.mirrors.ustc.edu.cn",
> "https://docker.registry.cyou",
> "https://docker-cf.registry.cyou",
> "https://dockercf.jsdelivr.fyi",
> "https://docker.jsdelivr.fyi",
> "https://dockertest.jsdelivr.fyi",
> "https://mirror.aliyuncs.com",
> "https://dockerproxy.com",
> "https://mirror.baidubce.com",
> "https://docker.m.daocloud.io",
> "https://docker.nju.edu.cn",
> "https://docker.mirrors.sjtug.sjtu.edu.cn",
> "https://docker.mirrors.ustc.edu.cn",
> "https://mirror.iscas.ac.cn",
> "https://docker.rainbond.cc",
> "https://do.nark.eu.org",
> "https://docker.shootchat.top",
> "https://registry.docker-cn.com"]
> }
> EOF
#6.重新加载系统配置文件,重启docker
systemctl daemon-reload && systemctl restart docker
#7.测试是否能拉取镜像
docker run hello-world
#8.查看镜像
docker images
#9.docker补全
yum install -y bash-completion
sudo curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
source /etc/bash_completion.d/docker.sh
apt
基于ubuntu2204
#1.安装前先卸载操作系统默认安装的docker
apt purge docker docker-engine docker.io containerd runc
#2.安装必要支持
apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
#2.添加源和gpgkey
#添加 Docker 官方 GPG key (可能国内现在访问会存在问题)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#添加 apt Docker官方源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#阿里源(推荐使用阿里的gpg KEY)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#阿里apt源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#3.更新源
apt update
#4.安装docker
apt install docker-ce docker-ce-cli containerd.io
#5.查看docker状态,查看docker版本
systemctl status docker && docker --version
#6.安装docker命令补全工具
sudo apt-get install bash-completion
sudo curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
source /etc/bash_completion.d/docker.sh
#7.配置docker镜像加速
cat >/etc/docker/daemon.json<<'EOF'
{
"registry-mirrors" : ["https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://docker.shootchat.top",
"https://registry.docker-cn.com"]
}
EOF
#8.重新加载系统配置文件,重启docker
systemctl daemon-reload && systemctl restart docker
#9.测试是否能拉取镜像
docker run hello-world
#10.查看镜像
docker images
二进制安装
官方Docker二进制下载地址:Index of linux/static/stable/x86_64/
#0.删除系统已有的runc
rm -rf /usr/local/bin/runc
#1.下载docker27.0.3二进制包到/download下
wget https://download.docker.com/linux/static/stable/x86_64/docker-27.0.3.tgz -P /download
#2.解压docker27.0.3二进制包,将包中的命令复制到/usr/local/bin/下
tar -xf /download/docker-27.0.3.tgz -C /download
cp -rf /download/docker/* /usr/local/bin/
#3.查看docker版本
docker --version
#4.配置docker systemd文件
cat > /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
Environment=GOTRACEBACK=crash
#Environment=HTTP_PROXY=10.0.0.1:7890 HTTPS_PROXY=10.0.0.1:7890
#注意二进制文件位置
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
#5.设置镜像加速
mkdir /etc/docker
cat >/etc/docker/daemon.json <<'EOF'
{
"registry-mirrors" : ["https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://docker.shootchat.top",
"https://registry.docker-cn.com"]
}
EOF
#6.生效系统配置文件,开启并开自启docker
systemctl daemon-reload && systemctl enable --now docker
#7.测试是否能拉取镜像
docker run hello-world
#8.查看镜像
docker images
#9.docker补全
yum install -y bash-completion
sudo curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
source /etc/profile.d/bash_completion.sh
-
没有删除runc的错误提示

Docker镜像操作
部分命令需翻
1.获取镜像
命令格式为docker pull <Name[:TAG]>
- Name:镜像仓库的名称
- TAG:是镜像的标签(通常用来显示版本信息)
pull子命令主要包括有:
- -a:是否获取仓库中所有镜像
- -q:不输出拉取的详细信息
#1.拉取一个Ubuntu2404系统的基础镜像
[root@docker01 ~]# docker pull ubuntu:24.04
24.04: Pulling from library/ubuntu
20043066d3d5: Pull complete
Digest: sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54
Status: Downloaded newer image for ubuntu:24.04
docker.io/library/ubuntu:24.04
#如果不指定TAG,则默认会选择latest标签,下载最新版本的镜像
#2.获取最新版本的Ubuntu基础镜像
[root@docker01 ~]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
如果从非官方仓库下载,则需要在仓库名称前指定完整的仓库地址
2.查看镜像
(1)列出镜像
使用docker images 或者 docker image ls命令可以列出本地主机上已有镜像
docker images 子命令主要包括:
- -a:列出所有镜像文件
- -q:输出ID信息
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu latest c3a134f2ace4 4 weeks ago 78.1MB
hello-world latest 1b44b5a3e06a 3 months ago 10.1kB
ubuntu 18.04 f9a80a55f492 2 years ago 63.2MB
| 输出关键字 | 说明 |
|---|---|
| REPOSITORY | 来自于哪个仓库 |
| TAG | 镜像的标签信息 |
| IMAGE ID | 镜像的ID,如果两个镜像的ID相同,说明它们实际上指向了同一个镜像,只是具有不同标签名称而已 |
| CREATED | 创建的时间 |
| SIZE | 镜像大小 |
(2)镜像标签
为了使用特定的镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签。
例如,添加一个新的myubuntu:latest镜像标签
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 60adc2e137e7 31 hours ago 152MB
[root@docker01 ~]# docker tag nginx:latest mynginx:latest
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx latest 60adc2e137e7 31 hours ago 152MB
nginx latest 60adc2e137e7 31 hours ago 152MB
# 可以看到mynginx:latest和nginx:latest ID是完全一致的
# 它们实际上指向了同一个镜像文件,只是别名不同而已,类似Linux硬链接
(3)镜像/容器 详细信息(配合jq)
使用docker inspect命令可以获取镜像的详细信息
docker inspect 子命令主要包括:
- -f :指定输出信息
- -s :如果类型为容器,则显示文件的总大小
[root@docker01 ~]# docker inspect nginx:latest
[
{
"Id": "sha256:60adc2e137e757418d4d771822fa3b3f5d3b4ad58ef2385d200c9ee78375b6d5",
"RepoTags": [
"mynginx:latest",
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:553f64aecdc31b5bf944521731cd70e35da4faed96b2b7548a3d8e2598c52a42"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2025-11-18T04:24:11.258715718Z",
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.29.3",
"NJS_VERSION=0.9.4",
"NJS_RELEASE=1~trixie",
"PKG_RELEASE=1~trixie",
"DYNPKG_RELEASE=1~trixie"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"Architecture": "amd64",
"Os": "linux",
"Size": 151863538,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/218547a9156f06788a620daa7342ff42f3fdb085b4a012dce3035e19f1b621c7/diff:/var/lib/docker/overlay2/0c48854341fee3ca0d671c9259e5bcdf3d6c682b6245aeafb716df57af25605d/diff:/var/lib/docker/overlay2/784b938512de68fb27f5d98865654000010ccd47ba6a2deba17f14c34fce9549/diff:/var/lib/docker/overlay2/dcdb5b70a495ba061fa38c3e42daf6d87bba6f8c34a56a812867f9842365290f/diff:/var/lib/docker/overlay2/4567994bdb923d46f0923d8af691ef107c4aedb96f7347cb613a8a03152c28f7/diff:/var/lib/docker/overlay2/ef634c708c35dad81cfcf7ea28bd5995d14a80b9672561e24bb52dbc275659db/diff",
"MergedDir": "/var/lib/docker/overlay2/e0f42b3f111e7ce5dc2a4216c523da673e33fb57314002a3328304b18f6590bd/merged",
"UpperDir": "/var/lib/docker/overlay2/e0f42b3f111e7ce5dc2a4216c523da673e33fb57314002a3328304b18f6590bd/diff",
"WorkDir": "/var/lib/docker/overlay2/e0f42b3f111e7ce5dc2a4216c523da673e33fb57314002a3328304b18f6590bd/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:70a290c5e58b68f39496ab93a62f21b8b2ca0502e97905131838de1b39a37cbb",
"sha256:008ba900efa19180f53a0ed13fc6feb7d2d34bad25a839702024f87c5122568a",
"sha256:1e79db1a7c1e2dc46e0cb975b22d67695877d42318a3598d01f322df3078c43d",
"sha256:fe0771a36433cf0ef9f598e1f0b526520fa60c732d969e67bc6dd38f01bebf40",
"sha256:5f0d4d15245b8979efd5be5e1726e44dd6461c32c2fa193b15228e591f1d2442",
"sha256:388bb4cadb9eb18529d3f466855a783f38c821571bc180fec9d0663fef1d0322",
"sha256:38d44e06fd0163071bcf2eeff92083e9420f4fb17c32fb5c4af71b75e0e91eaa"
]
},
"Metadata": {
"LastTagTime": "2025-11-19T11:00:56.29894501Z"
}
}
]
使用jq命令来取出json中的信息
#安装jq
apt install -y jq
#1.docker inspect nginx:latest | jq .[] #先去掉最外面的[]然后直接使用即可
#2.过滤镜像中的变量
[root@docker01 ~]# docker inspect nginx:latest | jq .[].Config.Env
[
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.29.3",
"NJS_VERSION=0.9.4",
"NJS_RELEASE=1~trixie",
"PKG_RELEASE=1~trixie",
"DYNPKG_RELEASE=1~trixie"
]
#3.获取镜像中的端口号
[root@docker01 ~]# docker inspect nginx:latest | jq .[].Config.Env
{
"80/tcp": {}
}
(4)镜像历史
docker history 该命令就是查看镜像各层的创建信息
docker history 子命令主要包括:
- -q:输出镜像各层的ID
[root@docker01 ~]# docker history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
60adc2e137e7 31 hours ago CMD ["nginx" "-g" "daemon off;"] 0B buildkit.dockerfile.v0
<missing> 31 hours ago STOPSIGNAL SIGQUIT 0B buildkit.dockerfile.v0
<missing> 31 hours ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 31 hours ago ENTRYPOINT ["/docker-entrypoint.sh"] 0B buildkit.dockerfile.v0
<missing> 31 hours ago COPY 30-tune-worker-processes.sh /docker-ent… 4.62kB buildkit.dockerfile.v0
<missing> 31 hours ago COPY 20-envsubst-on-templates.sh /docker-ent… 3.02kB buildkit.dockerfile.v0
<missing> 31 hours ago COPY 15-local-resolvers.envsh /docker-entryp… 389B buildkit.dockerfile.v0
<missing> 31 hours ago COPY 10-listen-on-ipv6-by-default.sh /docker… 2.12kB buildkit.dockerfile.v0
<missing> 31 hours ago COPY docker-entrypoint.sh / # buildkit 1.62kB buildkit.dockerfile.v0
<missing> 31 hours ago RUN /bin/sh -c set -x && groupadd --syst… 73.2MB buildkit.dockerfile.v0
<missing> 31 hours ago ENV DYNPKG_RELEASE=1~trixie 0B buildkit.dockerfile.v0
<missing> 31 hours ago ENV PKG_RELEASE=1~trixie 0B buildkit.dockerfile.v0
<missing> 31 hours ago ENV NJS_RELEASE=1~trixie 0B buildkit.dockerfile.v0
<missing> 31 hours ago ENV NJS_VERSION=0.9.4 0B buildkit.dockerfile.v0
<missing> 31 hours ago ENV NGINX_VERSION=1.29.3 0B buildkit.dockerfile.v0
<missing> 31 hours ago LABEL maintainer=NGINX Docker Maintainers <d… 0B buildkit.dockerfile.v0
<missing> 2 days ago # debian.sh --arch 'amd64' out/ 'trixie' '@1… 78.6MB debuerreotype 0.16
3.搜索镜像
使用docker search命令可以搜索 Docker Hub官方仓库中的镜像
docker search子命令主要包括:
- -f:过滤输出内容
- –limit:限制输出结果个数,默认为25个
#1.搜索官方提供带nginx关键字的镜像
[root@docker02 ~]# docker search --filter="is-official=true" nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 21071 [OK]
#2.搜索收藏超过150的nginx镜像
[root@docker02 ~]# docker search --filter=stars=150 nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 21071 [OK]
bitnami/nginx Bitnami Secure Image for nginx 201
linuxserver/nginx An Nginx container, brought to you by LinuxS… 233
4.删除镜像
(1)使用标签删除镜像
使用docker rmi 或docker image rm 命令可以删除镜像
docker rmi 支持的子命令包括:
- -f:强制删除镜像,即使有容器依赖他
- –no-prune:表示不移除本地存储的父镜像
#1.例如要删除mynginx:latest镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx latest 60adc2e137e7 31 hours ago 152MB
nginx latest 60adc2e137e7 31 hours ago 152MB
hello-world latest 1b44b5a3e06a 3 months ago 10.1kB
[root@docker01 ~]# docker rmi -f mynginx:latest
Untagged: mynginx:latest
(2)使用ID删除镜像
当使用docker rmi 命令,后面可以跟上镜像的ID,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身
[root@docker01 ~]# docker tag ubuntu:24.04 ubuntu-1:24.04
[root@docker01 ~]# docker tag ubuntu:24.04 ubuntu-2:24.04
[root@docker01 ~]# docker tag ubuntu:24.04 ubuntu-3:24.04
[root@docker01 ~]# docker tag ubuntu:24.04 ubuntu-4:24.04
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-2 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu-3 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu-4 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu-1 24.04 c3a134f2ace4 4 weeks ago 78.1MB
hello-world latest 1b44b5a3e06a 3 months ago 10.1kB
[root@docker01 ~]# docker rmi -f c3a134f2ace4
Untagged: ubuntu-1:24.04
Untagged: ubuntu-2:24.04
Untagged: ubuntu-3:24.04
Untagged: ubuntu-4:24.04
Untagged: ubuntu:24.04
Untagged: ubuntu@sha256:c35e29c9450151419d9448b0fd75374fec4fff364a27f176fb458d472dfc9e54
Deleted: sha256:c3a134f2ace4f6d480733efcfef27c60ea8ed48be1cd36f2c17ec0729775b2c8
Deleted: sha256:e8bce0aabd687e9ee90e0bada33884f40b277196f72aac9934357472863a80ae
(3)清理镜像
使用Docker一段时间后,系统可能会遗留一些临时镜像,以及一些没有被使用的镜像,可以通过 docker image prune命令来进行清理
子命令包括:
- -a:删除所有无用镜像
- -f:强制删除镜像,不进行提示
#例如,如下命令会自动清理临时遗留镜像文件层,最后会提示释放的存储空间
[root@docker01 ~]# docker image prune -f
Total reclaimed space: 0B
5.创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建
(1)基于已有容器创建
使用docker commit 命令
子命令主要包括:
- -a:作者信息
- -c:提交的适合指向Dcokerfile指令,包括CMD | ENTRYPOINT | ENV|EXPOSE | LABEL | ONBUILD|USER | VOLUME | WORKDIR 等
- -m:提交信息
- -p:提交时暂停容器运行
#1.启动一个镜像,并在其中进行修改。例如创建一个5MB的文件
[root@docker01 ~]# docker run -it ubuntu:22.04 /bin/bash
root@ce49658fd14a:/# dd if=/dev/zero of=test bs=1M count=5
root@ce49658fd14a:/# exit
此时该容器与原ubuntu:22.04镜像相比,已经发生改变,可以使用docker [container] commit 命令来提交一个新的镜像。提交时可以使用ID或者名称来指定容器:
[root@docker01 ~]# docker commit -m "ADD a new file" -a "csq" 05f199663e88 ubuntu2204-test:v1.0
sha256:9723060a999f65aae87190165169b6ecfc3435e4e42dd527705abe93b802db06
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu2204-test v1.0 9723060a999f 17 seconds ago 83.1MB
ubuntu 24.04 c3a134f2ace4 4 weeks ago 78.1MB
(2)基于本地模板导入
用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker [container] import 命令。命令格式为 docker import [OPTIONS] file URL - [REPOSITORY[:TAG]]
#1.查看镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu2204-test v1.0 9723060a999f 14 minutes ago 83.1MB
ubuntu 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu 22.04 9fa3e2b5204f 5 weeks ago 77.9MB
#2.保存镜像到本地
[root@docker01 ~]# docker save ubuntu2204-test:v1.0 -o ubuntutest.tar
#3.删除镜像
[root@docker01 ~]# docker rmi -f ubuntu2204-test:v1.0
Untagged: ubuntu2204-test:v1.0
Deleted: sha256:9723060a999f65aae87190165169b6ecfc3435e4e42dd527705abe93b802db06
Deleted: sha256:789360e36188409835b621608cca564e5c2744545f4dd805f3ae4a6f3c8c2959
#4.导入镜像
[root@docker01 ~]# cat ubuntutest.tar | docker import - ubuntu2204-test:v1.0
sha256:bcbaf413615b5857dddd1fac9d0c6d1b4f740fc516aff5f5019c9761a1a555ce
#5.查看镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu2204-test v1.0 bcbaf413615b 2 seconds ago 85.7MB
ubuntu 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu 22.04 9fa3e2b5204f 5 weeks ago 77.9MB
(3)基于Dockerfile创建
Dockerfile创建镜像是最常见的方式,Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
下面给出一个Dockerfile搭建http web服务器简单案例
#1.描述镜像
cat > Dockerfile-web <<EOF
FROM ubuntu:24.04
RUN apt update && apt install -y nginx
WORKDIR /etc/nginx/
EXPOSE 80
CMD ["/usr/sbin/nginx","-g","daemon off;"]
EOF
#2.构建镜像
docker build -t web:v1.0 -f Dockerfile-web .
#3.查看镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
web v1.0 c75cc1bd6f9e 50 seconds ago 141MB
#4.运行容器
docker run -d -p 80:80 --name web web:v1.0
#5.浏览器查看

6.存储和载入镜像
(1)存储镜像
如果要到处镜像到本地文件,可以使用docker save命令。到处镜像到指定文件中
- -o:写入文件
#1.保存镜像ubuntu2204-test:v1.0到本地,镜像文件为ubuntutest.tar
docker save ubuntu2204-test:v1.0 -o ubuntutest.tar
#通过这种方法可以将镜像分享给其他人
(2)载入镜像
可以使用docker load将导出的tar文件再导入到本地镜像库
#1.从文件 ubuntutest.tar 导入镜像到本地镜像列表
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu2204-test v1.0 bcbaf413615b 23 minutes ago 85.7MB
ubuntu 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu 22.04 9fa3e2b5204f 5 weeks ago 77.9MB
#2.删除镜像
docker rmi -f ubuntu2204-test:v1.0
#3.导入镜像
docker load -i ubuntutest.tar
#4.查看镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu2204-test v1.0 9723060a999f 24 minutes ago 83.1MB
ubuntu 24.04 c3a134f2ace4 4 weeks ago 78.1MB
ubuntu 22.04 9fa3e2b5204f 5 weeks ago 77.9MB
# 这将导入镜像及其相关的元数据信息
# 可以使用docker images查看和原镜像一致
7.上传镜像
可以使用docker push命令上传镜像到仓库,默认上传到Docker Hub 官方仓库(需要登录)。
我们这里使用阿里云仓库上传镜像
例如,用户csq上传本地的web:v1.0 镜像到阿里云仓库,可以先添加新标签,登录阿里云镜像仓库,然后再上传
#1.修改镜像标签
docker tag web:v1.0 registry.cn-hangzhou.aliyuncs.com/chenshiren/web:v1.0
#2.登录阿里云镜像仓库
docker login --username=csqcsqcsq registry.cn-hangzhou.aliyuncs.com
#3.上传镜像
docker push registry.cn-hangzhou.aliyuncs.com/chenshiren/web:v1.0
第一次上传,会提示输入登录信息,之后登录信息会记录到本地
~/.docker目录下
8.load和import区别
- 如果需要导入整个镜像,包含镜像的完整文件系统、元数据和历史记录,则使用
docker load命令。 - 如果只需要导入容器的文件系统不包含容器的元数据和历史记录,则使用
docker import命令。
Docker容器操作
开启内核转发(必须开启)
保证容器网络正常通信
[root@docker01 ~]# grep ip_forward /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@docker01 ~]# sysctl -p #生效
1.创建容器
(1)新建容器
可以使用docker create命令新建一个容器,例如
[root@docker02 ~]# docker create -it ubuntu:22.04
f437102784349eebdc4342b0dc0308ed82877cba8181f48ad0411b0ec0b3b798
[root@docker02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f43710278434 ubuntu:22.04 "/bin/bash" 10 seconds ago Created busy_davinci
(2)启动容器
使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它
[root@docker02 ~]# docker start f43710278434
f43710278434
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f43710278434 ubuntu:22.04 "/bin/bash" 52 seconds ago Up 5 seconds busy_davinci
(3)新建并启动容器
除了创建容器后通过start命令来启动,也可以直接新建并启动容器
使用docker run等价于先执行docker create命令,再执行docker start命令
启动容器输出hello,world! 容器自动停止
[root@docker02 ~]# docker run ubuntu:22.04 /bin/echo 'Hello world!'
Hello world!
[root@docker02 ~]# docker ps -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
434bc1dcb1db ubuntu:22.04 "/bin/echo 'Hello wo…" 9 seconds ago Exited (0) 9 seconds ago charming_lamarr
当你在使用docker run来创建并启动容器时,Docker后台运行标准操作包括:
-
检查本地是否存在指定镜像,不存在就在默认仓库拉取镜像
-
利用镜像创建一个容器,并启动该容器
-
分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
-
从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
-
执行用户指定的应用程序
-
执行完毕后容器自动终止
启动一个bash终端,允许用户进行交互
[root@docker02 ~]# docker run -it ubuntu:22.04 /bin/bash
root@e90ab08eb2cc:/#
#可以在终端输入命令
[root@docker02 ~]# docker run -it ubuntu:22.04 /bin/bash
root@e90ab08eb2cc:/# pwd
/
root@e90ab08eb2cc:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@e90ab08eb2cc:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:41 pts/0 00:00:00 /bin/bash
root 10 1 0 12:41 pts/0 00:00:00 ps -ef
#可以看到进程只要/bin/bash应用,没有其他无关进程
root@e90ab08eb2cc:/# exit
#exit退出容器ctrl+d也可以退出容器
(4)阻塞容器打印错误代码
可以使用docker wait CONTAINER [CONTAINER…]子命令来等待容器退出,并打印退出返回结果
某些适合,执行docker run时候因为命令无法正常执行容器会出错 直接退出,此时可以查看退出的错误代码
- 125:Docker daemon执行出错,例如指定了不支持的Docker命令参数
- 126:所指定命令无法执行,例如权限出错
- 127:容器内命令无法找到
#1.运行一个ubuntu:22.04容器,并在容器中执行 abc命令
[root@docker02 ~]# docker run ubuntu:22.04 /bin/abc
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/abc": stat /bin/abc: no such file or directory: unknown.
[root@docker02 ~]# docker ps -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9edd7882f90a ubuntu:22.04 "/bin/abc" 8 seconds ago Created heuristic_snyder
[root@docker02 ~]# docker wait 9edd7882f90a
127
(5)查看容器输出
获取容器的输出信息,可以通过docker logs 命令
子命令主要包括:
- -f:持续保持输出
- -t:显示时间戳信息
- –since:只显示某个时间内的日志,例如10m(10分钟内)
- –until:只显示某个时间点之前的日志
#1.进入容器执行命令查看日志
[root@docker01 ~]# docker exec -it 03fd54fa79ac tail -f /var/log/nginx/access.log
#2.使用docker logs 查看10分钟内的日志
docker logs --since 10m nginx-web
#1.启动mysql
docker run -d -p 3306:3306 --name mysql mysql:8.0-debian
#2.出现问题
[root@docker02 ~]# docker logs mysql
2025-11-19 13:09:49+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1debian11 started.
2025-11-19 13:09:49+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2025-11-19 13:09:49+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1debian11 started.
2025-11-19 13:09:49+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
#提示让设置密码,删除容器并配置变量
#3.启动mysql并设置密码
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=1 mysql:8.0-debian
#4.登录mysql
docker exec -it mysql mysql -uroot -p1
2.停止容器
(1)暂停容器
使用docker pause CONTAINER [CONTAINER....]命令来暂停运行中的容器
#1.开启一个终端,输入如下命令
[root@docker02 ~]# docker run -it --rm --name test ubuntu:22.04 /bin/bash
root@af59aa9bb9e9:/#
#2.使用另一个终端输入命令暂停启动的容器
[root@docker02 /]# docker pause test
test
[root@docker02 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af59aa9bb9e9 ubuntu:22.04 "/bin/bash" 37 seconds ago Up 36 seconds (Paused) test
处于paused状态的容器,可以使用docker unpause CONTAINER [CONTAINER...]命令来恢复运行状态
[root@docker02 /]# docker unpause test
test
[root@docker02 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af59aa9bb9e9 ubuntu:22.04 "/bin/bash" 2 minutes ago Up 2 minutes test
(2)终止容器
使用docker stop来终止一个运行中的容器
还可以通过docker kill直接发送SIGKILL信号来强行终止容器
#1.终止刚刚启动的test容器
[root@docker02 /]# docker stop test
可以使用docker container prune命令,自动清除处于停止状态的容器
[root@docker02 ~]# docker container prune -f
Deleted Containers:
fa85361e317523878943932916e8d11e9c9964eadbf948fd6d4cd430cdd727dc
506f9ef71ed8954a405b5e3621358dca77fe73618f52cf1ed3df96996de79c57
a32e42c36477d738f7749acc7ba3d0dc9b5a824b1bfb9ec941df3ffe461485f0
3097a683930b9165c4c60ed5630e144df931ea6e34d99f861f1578fe10fc88d8
Total reclaimed space: 0B
(3)重启容器
使用docker restart命令将会将一个运行状态的容器先终止,然后再重新启动
#1.重启mysql容器
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f2ce613d73d mysql:8.0-debian "docker-entrypoint.s…" 9 minutes ago Up 9 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
c77ac0e2040a nginx:1.24 "/docker-entrypoint.…" 23 minutes ago Up 23 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-web
[root@docker02 ~]# docker restart mysql
3.进入容器
(1)attach命令
docker attach [container]
attach命令缺点就是,当多个窗口同时attach到同一个容器中,所有窗口都会同步显示输出命令的信息,当某个窗口因为某些命令阻塞时,其他窗口就无法执行操作了。
#1.创建容器
[root@docker02 ~]# docker run -itd ubuntu:22.04
#2.使用命令进入容器
[root@docker02 ~]# docker attach f4a9c4b089c4
root@f4a9c4b089c4:/#
#当退出容器的时候,容器自动终止了
(2)exec命令
docker exec CONTAINER COMMAND [ARG...]
#1.进入刚运行的容器中,并启动一个bash
[root@docker02 ~]# docker exec -it f4a9c4b089c4 /bin/bash
root@f4a9c4b089c4:/#
#当提出容器的时候,容器还健在
#不影响容器内其他应用的前提下,用户可以与容器进行交互
4.删除容器
使用docker rm命令来删除处于终止或退出状态的容器
主要的命令包括:
- -f:强制删除一个运行中的容器
- -l:删除容器的连接,但保留容器
- -v:删除容器挂载的数据卷
#1.查看容器
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4a9c4b089c4 ubuntu:22.04 "/bin/bash" 3 minutes ago Up 2 minutes upbeat_shamir
2f2ce613d73d mysql:8.0-debian "docker-entrypoint.s…" 17 minutes ago Up 8 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
c77ac0e2040a nginx:1.24 "/docker-entrypoint.…" 31 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-web
#2.强制删除ubuntu:22.04容器
[root@docker02 ~]# docker rm -f f4a9c4b089c4
f4a9c4b089c4
5.导入和导出容器
(1)导出容器镜像
将一个已创建的容器(无论运行中还是已停止)的 “文件系统快照” 打包成一个 tar 格式的文件,用于备份、迁移或后续生成新镜像
可以使用docker export命令
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f2ce613d73d mysql:8.0-debian "docker-entrypoint.s…" 21 minutes ago Up 12 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
c77ac0e2040a nginx:1.24 "/docker-entrypoint.…" 35 minutes ago Up 9 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-web
#导出nginx-web和mysql容器镜像
[root@docker02 ~]# docker export -o nginx.tar nginx-web
[root@docker02 ~]# docker export -o mysql.tar mysql
[root@docker02 ~]# ls
mysql.tar nginx.tar
(2)导入容器镜像
使用docker import命令导入镜像
#1.将容器镜像导入到本地
[root@docker02 ~]# cat nginx.tar | docker import - web:v1.0
[root@docker02 ~]# docker images web:v1.0
REPOSITORY TAG IMAGE ID CREATED SIZE
web v1.0 c7ece2b8463a 9 seconds ago 140MB
6.查看容器
(1)查看容器详情(配合jq)
使用 docker inspect NAME|ID [NAME|ID...]可以查看容器详情
例如,查看某容器的具体信息,容器ID,创建时间,路径,状态,镜像,配置,挂载的卷,IP地址等
#1.查看mysql容器
[root@docker02 ~]# docker inspect mysql
(2)查看统计信息
查看统计信息可以使用docker stats [CONTAINER...]命令,会显示CPU、内存、存储、网络等使用情况的统计信息
[root@docker02 ~]# docker stats mysql
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
2f2ce613d73d mysql 0.48% 266.3MiB / 1.883GiB 13.81% 1.08kB / 0B 6.59MB / 108MB 37
(3)查看容器内进程
使用docker top CONTAINER [ps OPTIONS]查看容器内进程
该命令会打印出容器内的进程信息,包括PID、用户、时间、命令等
#1.查看mysql容器的所有线程
[root@docker02 ~]# docker top mysql -efL
#2.查看mysql容器的进程状态
[root@docker02 ~]# docker top mysql aux
7.其他容器命令
(1)复制文件
docker cp命令可以在容器和主机之间复制文件
子命令主要包括:
- -a:复制文件会带有原始uid/gid信息
- -L:跟随软连接,使用该项会复制链接的目标内容
#1.将本地的路径csq.html复制到nginx-web容器的/usr/share/nginx/html/路径下
[root@docker02 ~]# echo csq > csq.html
[root@docker02 ~]# docker cp csq.html nginx-web:/usr/share/nginx/html/
[root@docker02 ~]# curl localhost/csq.html
csq
(2)查看变更
docker diff 查看容器内文件系统的变更
#1.查看nginx-web容器内的数据修改
[root@docker02 ~]# docker diff nginx-web
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
A /usr/share/nginx/html/csq.html
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /run
A /run/nginx.pid
#A:表示新增的文件或目录
#C:表示改变了文件或目录的权限或属性
#D:表示删除的文件或目录
(3)查看端口映射
使用docker port命令可以查看容器的端口映射情况
#1.查看nginx-web容器的端口映射情况
[root@docker02 ~]# docker port nginx-web
80/tcp -> 0.0.0.0:80
80/tcp -> [::]:80
(4)更新配置
使用docker [container] update可以更新容器的一些运行时配置,它可以更改容器的资源限制、网络设置、重启策略等。
docker update命令可以接受多个选项来更新容器的不同配置。以下是一些常用的选项:
-
--blkio-weight: 设置IO限制,10~1000,默认值为0,代表无限制 -
--cpu-period: 设置CPU周期限制 -
--cpu-quota: 设置CPU配额限制 -
--cpu-rt-period: 设置实时CPU周期限制 -
--cpu-rt-runtime: 设置实时CPU运行时间限制 -
--cpu-shares,-c: 设置容器的CPU份额 -
--cpus: 设置容器可以使用的CPU数量 -
--cpuset-cpus: 设置容器可以使用的CPU核,如0-3,0,1; -
--cpuset-mems: 设置容器可以使用的内存块,如0-3,0,1; -
--kernel-memory: 设置容器的内核内存限制 -
--memory,-m: 设置容器的内存限制 -
--memory-reservation: 设置容器的内存保留限制 -
--memory-swap: 设置容器的内存+交换限制,-1表示对缓冲区无限制 -
--restart:容器退出后的重启策略no:默认策略,表示容器退出后不会自动重启。on-failure:表示只在容器以非零状态退出时才重启。on-failure:3:在容器非正常退出时重启容器,最多重启3次always:无论容器以什么状态退出,Docker引擎都会自动重新启动容器。
例如,设置web容器的CPU数量为2,重启策略为always
[root@docker02 ~]# docker update --cpus 2 --restart=always nginx-web
nginx-web
查看是否设置成功
[root@docker02 ~]# docker inspect nginx-web |grep always
"Name": "always",
[root@docker02 ~]# docker inspect nginx-web |grep -i nanocpus
"NanoCpus": 2000000000,
8.容器运行常用相关参数
| 选项 | 说明 |
|---|---|
| -a | 是否绑定到标准输入、输出和错误 |
| -d | 是否在后台运行容器, |
| -i | 保持标准输入打开 |
| -P | 通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口下 |
| -p | 指定如何映射到本地主机端口,例如 -p 1111-2222:1234-2234 |
| –rm | 容器退出后是否自动删除,不能与-d一起使用 |
| -t | 是否分配一个伪终端 |
| -tmpfs=[ ] | 挂载临时文件系统到容器 |
| -w | 容器的默认工作目录 |
| -v | 挂载主机上的文件卷到容器内 |
| –volumes-from=[ ] | 从其他容器挂载卷 |
| –group-add=[ ] | 运行容器的用户组 |
| –expose=[ ] | 指定容器会暴露出来的端口或端口范围 |
| –restart=[ ] | 容器的重启策略,包括no、no-failure、always、unless-stopped |
| –net=[ ] | 指定网络模式 |
9.容器环境配置常用参数
| 选项 | 说明 |
|---|---|
| -e | 指定容器内的环境变量 |
| –link [name:alias] | 链接到其他容器 |
| –name | 指定容器别名 |
更多推荐


所有评论(0)