容器和虚拟机(虚拟化)的区别

image-20251119171343205

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)

image-20251119173420561

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

内容参考:Ubuntu 22.04下Docker安装(最全指引)_docker ubuntu2204-CSDN博客

二进制安装

官方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的错误提示

    image-20251119173557045

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 rmidocker 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.浏览器查看

image-20251119194733122

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 指定容器别名
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐