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

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包括三个概念:

  • 镜像(Image):Docker镜像,就相当于是一个 root 文件系统。
  • 容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker是一个CS架构程序,分两部分组成

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令
概念核心说明
Docker 镜像(Images)用于创建 Docker 容器的模板(如 Ubuntu 系统、Nginx 应用等)。
Docker 容器(Container)镜像运行时的实体,独立运行一个或一组应用,是镜像的实例化形态。
Docker 客户端(Client)通过命令行或 Docker SDK 与 Docker 守护进程通信,发起操作请求的工具。
Docker 主机(Host)运行 Docker 守护进程和容器的物理机器或虚拟机器。
Docker Registry保存镜像的仓库(如 Docker Hub),含多个仓库和标签,标签对应镜像版本,格式为<仓库名>:<标签>(默认标签 latest)。

Docker应用场景

  • web应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其他的后台应用
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry 平台来搭建自己的PaaS环境

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/
chown -R root:root /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          3424175c5b6c   2 seconds ago   83.1MB
ubuntu            22.04         5a81c4b8502e   2 years ago     77.8MB

(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看日志的本质,容器中/var/log/服务日志软链接到/dev/stdout /dev/stderr

获取容器的输出信息,可以通过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

docker logs 查看的是容器的哪里?

核心结论:docker logs 查看的是容器的 标准输出(stdout)和标准错误(stderr) 日志,默认存储在 Docker 主机的 /var/lib/docker/containers/ 目录下,具体存储位置和方式由 日志驱动(log driver) 决定。

一、日志来源:容器的 stdout 和 stderr

容器运行时,应用程序打印到 “控制台” 的所有信息,都会被 Docker 捕获并记录,这就是 docker logs 能查看的核心内容:

  • stdout(标准输出):应用的正常运行日志(如 Nginx 的访问日志、PHP 的业务日志)。
  • stderr(标准错误):应用的错误日志(如数据库连接失败、代码语法错误)。
#进入容器
docker exec -it nginx bash
#查看日志
nginx [ / ]$ ls -l /var/log/nginx/access.log 
lrwxrwxrwx 1 root root 11 Nov 19 06:55 /var/log/nginx/access.log -> /dev/stdout
nginx [ / ]$ ls -l /var/log/nginx/error.log  
lrwxrwxrwx 1 root root 11 Nov 19 06:55 /var/log/nginx/error.log -> /dev/stderr
#查看日志链接
nginx [ / ]$ ls -l /dev/stdout 
lrwxrwxrwx 1 root root 15 Nov 26 01:24 /dev/stdout -> /proc/self/fd/1
nginx [ / ]$ ls -l /dev/stderr 
lrwxrwxrwx 1 root root 15 Nov 26 01:24 /dev/stderr -> /proc/self/fd/2
#查看进程
nginx [ / ]$ ps -ef            
UID              PID    PPID C STIME TTY          TIME CMD
nginx              1       0 0 24:03 ?        00:00:00 nginx: master process nginx -g daemon off;
nginx              7       1 0 24:03 ?        00:00:00 nginx: worker process
nginx              8       1 0 24:03 ?        00:00:00 nginx: worker process
nginx            810       0 0 22:23 pts/0    00:00:00 bash
nginx            859     810 0 24:52 pts/0    00:00:00 ps -ef

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.查看容器

Docker容器有四种状态:运行、已暂停、重新启动、已退出

(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命令可以接受多个选项来更新容器的不同配置。以下是一些常用的选项:

Resource constraints | Docker Docs — 资源约束 |Docker 文档

选项(含短选项)功能描述关键说明
–restart设置容器退出后的重启策略可选值:no(默认,不自动重启)
on-failure(非零状态退出时重启)
on-failure:3(非零退出重启,最多 3 次)
always(无论退出状态,均重启)
–memory, -m设置容器的内存限制示例:-m 2g(限制 2GB 内存)
–memory-swap设置容器的内存 + 交换空间限制默认与内存限制一致;-1表示对交换缓冲区无限制
–memory-reservation设置容器的内存保留限制软限制,仅当主机内存紧张时生效,确保容器最低内存需求
–cpuset-mems设置容器可使用的内存块取值格式:0-3(0~3 号内存块)、0,1(仅 0、1 号内存块)
–kernel-memory设置容器的内核内存限制限制容器占用的内核态内存(如内核栈、缓冲区等)
–blkio-weight设置 IO 限制取值范围:10~1000;默认值 0(无限制)
–cpu-period设置 CPU 周期限制用于控制 CPU 调度周期,需与–cpu-quota配合使用
–cpu-quota设置 CPU 配额限制基于–cpu-period的 CPU 使用配额(单位:微秒)
–cpu-rt-period设置实时 CPU 周期限制针对实时调度的 CPU 周期配置(需系统支持实时调度)
–cpu-rt-runtime设置实时 CPU 运行时间限制实时调度模式下的 CPU 最大运行时间(单位:微秒)
–cpu-shares, -c设置容器的 CPU 份额相对权重(非绝对限制),仅当 CPU 资源竞争时生效
–cpus设置容器可使用的 CPU 数量示例:–cpus 2(允许使用 2 核 CPU)
–cpuset-cpus设置容器可使用的 CPU 核取值格式:0-3(0~3 核)、0,1(仅 0、1 核)
#1.设置web容器重启策略为always
[root@docker02 ~]# docker update  --restart=always nginx-web
nginx-web
#查看是否设置成功
[root@docker02 ~]# docker inspect nginx-web |grep always
                "Name": "always",
                
#2.设置mysql容器的内存限制为1G,swap空间限制为1G
docker update --memory 1G --memory-swap 1G  mysql
#查看是否设置成功
[root@docker01 ~]# docker inspect  mysql | jq .[].HostConfig.Memory
1073741824
[root@docker01 ~]# docker inspect  mysql | jq .[].HostConfig.MemorySwap
1073741824

(5)管理和监控 Docker 系统资源

Docker system 命令是 Docker 提供的一个用于管理和监控 Docker 系统资源的命令集。它可以帮助你查看 Docker 守护进程的状态、磁盘使用情况,并进行资源清理。

命令作用常用场景
docker system df查看磁盘空间使用情况定期检查,了解空间占用。
docker system prune清理未被使用的资源释放磁盘空间,系统维护。
docker system info显示系统详细信息环境诊断,查看配置。

8.容器运行常用相关参数

Docker Docs — 运行容器 官方文档

选项说明
-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指定容器别名

更多推荐