返回

Docker 学习

Table of contents

Open Table of contents

服务器安装 Docker

参考地址: https://docs.docker.com/engine/install/centos/

  1. 进入终端,执行如下命令删除系统中的旧版本 docker:
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  1. 设置 docker 镜像源(阿里镜像源)
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装 docker 引擎(25 年 7 月靠后不能直接复制,请看下方的更新注意进行安装)
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

输入两次 y 确认即可等待安装成功

更新需知

2025-08-06 更新:若出现 containerd.io-1.6.33-3.1.el7.x86_64: [Errno 256] No more mirrors to try. 的错误,需按照以下步骤操作

yum -y install containerd.io-1.6.18

containerd.io 这个最新版本的镜像文件虽然标记了 el7 但是其实和 Centos7/RHEL7 是不适配的,需要降低版本

而与此版本适配的 docker-ce 的版本如下:

yum -y install docker-ce-24.0.5 docker-ce-cli-24.0.5

解决方案的出处来自:https://blog.csdn.net/avatar_2009/article/details/149273277

Docker 启动配置

  1. 启动 docker
sudo systemctl start docker
  1. 检查 docker 是否启动成功,随便运行一个 docker 命令
# 检查 docker 启动的进程
docker ps
  1. 设置 docker 启动自启
sudo systemctl enable docker
  1. 设置加速(默认 docker 下载镜像是从 docker hub 下载,设置镜像源,2025.08 更新)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.1ms.run",
    "https://hub.rat.dev",
    "https://docker.m.daocloud.io",
    "https://mirror.iscas.ac.cn",
    "https://docker.xuanyuan.me",
    "https://docker-0.unsee.tech",
    "https://lispy.org",
    "https://proxy.vvvv.ee",
    "https://registry.cyou"
  ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

镜像操作(下载镜像)

以 nginx 为例

docker search nginx
docker pull nginx
docker images
docker rmi nginx

pull 镜像,以 hub.uuuadc.top 为例

docker pull hub.uuuadc.top/library/mysql:5.7

说明:library 是一个特殊的命名空间,它代表的是官方镜像。如果是某个用户的镜像就把 library 替换为镜像的用户名。

容器操作命令(启动容器)

其中 docker rundocker exec 相对操作较为复杂,详细命令使用 docker run --help 查看

docker run 为例,命令格式为 docker run [OPTIONS] IMAGE [COMMAND] [ARG...],其中 [OPTIONS] 就是通过 --help 查看到的可选参数项,IMAGE 为容器名称,后边两个若不更改容器默认启动行为,则无需关心。

操作容器的那几个命令,都是以 <容器 id | 容器名称> 运行的,比如 docker stop 896(根据容器 id 停止容器) 或者 docker stop quizzical_hertz(根据容器运行名称停止容器)

docker run 启动容器

仅了解,正式启动容器需查看 docker-run 详细使用

一般情况下,只需要执行 docker run <image> 即可启动容器。如果没有该容器,则会自动下载。但是此方式只要停止命令(crtl + c)。

此时通过 docker ps 可查看相关的容器启动信息,docker ps -a 可查看所有容器包括已停止的。

删除容器

docker rm <容器id | 容器名称>,执行该命令时,该容器必须是停止状态。如果想要强制删除容器,可以使用 docker rm -f <容器id | 容器名称>

docker run 详细使用

启动容器时,目前有两种方式:

以上简单命令,无法满足正常的容器管理

后台启动

例如 docker run -d --name mynginx nginx

容器外部访问

以 nginx 为例,当使用 docker run 启动 nginx 后,通过 80 端口依然无法在外网访问。

那是因为 nginx 容器只在当前 docker 镜像内运行,而非服务器环境运行。(可以把服务器当作最大的盒子,内部的 docker 环境看作小盒子,且小盒子之间是互相隔离的),访问外网 80 是访问的主机 80,而非 docker 镜像内 nginx 容器的 80。

想实现主机端口到镜像端口,需要做端口映射,例如 -p 88:80,意思就是当访问主机的 88 端口,就相当于访问容器的 80 端口。

所以实现一个比较规范的容器启动命令,例如:docker -d --name mynginx -p 88:80 nginx

想要主机能够访问到容器,一定要为容器暴漏端口。(容器端口可以重复,主机端口不能重复,因为每一个容器都可以当作一个虚拟机,容器之间互相隔离,所以端口可以相同,因为互不影响)

进入容器

以 nginx 为例,docker exec -it <容器id | 容器名称> bash 即可进入 nginx 容器

进入之后,ls / 查看可知,容器内容就是一个小型的 linux 环境,就可以像正常操作 linux 一样操作容器了。退出容器时,使用 exit 即可。

保存容器(加载容器)

  1. docker commit

例如 docker commit -m "commit message" mynginx mynginx:v1.0mynginx 就是 docker run 启动的容器名称,mynginx:v1.0 就是镜像名称,然后可以用 docker images 查看,此时会多出来一个镜像 mynginx:v1.0

具体命令可使用 docker commit --help 查看。

  1. docker save

例如 docker save -o mynginx.tar mynginx:v1.0 ,将已创建的镜像 mynginx:v1.0 打成一个 tar 包,然后 ls 可以查看多出来一个 mynginx.tar 文件。

  1. docker load

例如 docker load -i mynginx.tar,将之前保存的镜像包 mynginx.tar 加载到本地,此时 docker images 可以看到多了一个镜像 mynginx:v1.0。然后就可以使用 docker run 启动容器了。

这一步和 docker pull 下载镜像差不多,区别就是从社区下载和本地加载。

镜像存储(目录挂载)

每次删除镜像再运行镜像,都会重新下载镜像,可以把镜像某些数据保存下来,方便下次使用。

所谓目录挂载,就是把容器的文件夹挂载到主机的某个文件夹,两边文件互相影响(双向绑定),但是删除容器,不会导致主机文件被删除。

docker run -d -p 80:80 -v /data/nginx/html:/usr/share/nginx/html --name mynginx nginx

卷映射

卷映射和目录映射类似,但是卷映射是 docker 内部创建的,而目录映射是主机创建的。

卷名的存储目录若无法记住,可以直接使用 docker volume inspect <volume_name> 查看卷的存储位置就可以了



上一篇
项目 Lint 配置问题汇总
下一篇
ESlint 8 升级至 9