安装

卸载旧版本

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine \
                docker-io  # 这个在 CentOS 7 中常见

不用担心,这不会删除你的镜像、容器、卷或配置文件(它们保存在 /var/lib/docker/),但建议先备份重要数据

安装必要依赖

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

添加 Docker 官方 YUM 仓库

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

如果是 Rocky Linux / AlmaLinux,可以把 centos 替换为对应名称,或者直接使用 centos 通常也能兼容。

对于 CentOS 7,官方仍支持;对于 CentOS 8/Stream,注意 Docker 已停止对 EL8 的新版本支持(截至 2024 年底),建议迁移到 Rocky/Alma 9 或使用替代方案。

查看可用版本(可选)

yum list docker-ce --showduplicates | sort -r

看到类似:

docker-ce.x86_64  3:25.0.3-1.el7                 docker-ce-stable
docker-ce.x86_64  3:24.0.7-1.el7                 docker-ce-stable
...

安装最新版 Docker Engine

sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

这会安装:

  • docker-ce:Docker 引擎
  • docker-ce-cli:命令行工具
  • containerd.io:容器运行时
  • docker-compose-plugin这就是  docker compose(V2)插件!

启动并设置开机自启

sudo systemctl enable docker
sudo systemctl start docker

验证版本

docker --version
应该显示:Docker version 24.0.x 或 25.0.x

docker compose version
应该显示:Docker Compose version v2.xx.x

镜像源

{
  "registry-mirrors": ["https://docker.1panel.dev"]
}

基础概念

工作流程

![[images/Pasted image 20250905093827.png]]

  1. docker pull ​ 获取镜像
  2. docker run ​ 在容器中运行镜像
  3. docker build ​ 将自己的代码打包为一份镜像
  4. docker push ​ 上传打包好的镜像到应用市场
  • 构建镜像:使用  Dockerfile  创建镜像。
  • 推送镜像到注册表:将镜像上传到 Docker Hub 或私有注册表中。
  • 拉取镜像:通过  docker pull  从注册表中拉取镜像。
  • 运行容器:使用镜像创建并启动容器。
  • 管理容器:使用 Docker 客户端命令管理正在运行的容器(例如查看日志、停止容器、查看资源使用情况等)。
  • 网络与存储:容器之间通过 Docker 网络连接,数据通过 Docker 卷或绑定挂载进行持久化。

特性

image

  1. 应用之间不隔离,相互影响

  2. 使用虚拟化技术隔离应用,但是虚拟机之中的应用不相互隔离,且笨重

  3. 容器之间相互隔离

  4. 类似轻量级虚拟机

  5. 共享操作系统内核

  6. 拥有自己的文件系统、CPU、内存、进程空间

  7. 跨平台

  8. 高密度部署

    image

镜像

docker search IMAGE_NAME

image
OFFICIAL 为 OK 为官方镜像

下载镜像 pull

docker pull IMAGE_NAME	# 默认下载最新版本
docker pull IMAGE_NAME:[IMAGE_VERSION]	# 下载指定版本的镜像

如果要下载指定版本的镜像,需要搜索 hub.docker.com/ 对应命令

查看已下载镜像 images

docker images
docker image ls
# 两者等效

image

删除镜像 rmi

docker rmi [IMAGE ID]

填写通过 docker images ​ 查询得到的 IMAGE ID 即可删除

构建镜像 build

docker build -t [IMAGE ID]
  • -t:为镜像指定标签

需要一个 Dockerfile,来指示构建方案

FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"
RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

  • 第一条 FROM,指定使用哪个镜像源
  • RUN 指令告诉 docker 在镜像内执行命令,安装了什么

获取详细信息 inspect

容器或镜像的详细信息都可以获取

docker inspect [IMAGE ID]

修改名称 tag

docker tag <ImageID> <NAME>:<TAG>

容器

  • 镜像(Image):容器的静态模板,包含了应用程序运行所需的所有依赖和文件。镜像是不可变的
  • 容器(Container):镜像的一个运行实例,具有自己的文件系统、进程、网络等,且是动态的。容器从镜像启动,并在运行时保持可变

注意区分镜像和容器:一个镜像可以启动多次,启动一次就是一个容器

运行容器 run

docker run --help	# 查询命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# COMMAND 和 ARG 一般由镜像自行指定,不需要手动写
docker run nginx	# 前台启动
# -d 后台运行; -p 绑定映射端口
docker run -d -p 80:80 nginx
  • -d:后台运行
  • -p:绑定映射端口
  • -P:随机绑定端口
  • -i:允许你对容器内的标准输入 (STDIN) 进行交互
  • -t:在新容器内指定一个伪终端或终端

后台运行

使用 -d 可以开启后台容器

开启时会得到容器 ID,可以使用 exec 和容器 ID 进入容器

查看容器 ps

docker ps	# 只查询现在正在运行的容器
docker ps -a	# 包含之前运行过现在停止的容器

image

  • CONTAINER ID:  容器 ID。
  • IMAGE:  使用的镜像。
  • COMMAND:  启动容器时运行的命令。
  • CREATED:  容器的创建时间。
  • STATUS:  容器状态。
  • PORTS:  容器的端口信息和使用的连接类型(tcp\udp)。
  • NAMES:  自动分配的容器名称。

状态有 7 种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

停止容器 stop

docker stop CONTAINER_ID/NAMES

启动容器 start

docker start CONTAINER_ID/NAMES

重新运行停止状态的容器,注意和 run ​ 区分

重启容器 restart

docker restart CONTAINER_ID/NAMES

无论容器是否在运行,都会停止,再启动

容器状态 stats

docker stats CONTAINER_ID/NAMES

容器日志 logs

docker logs CONTAINER_ID/NAMES
# 持续查看
docker logs CONTAINER_ID/NAMES -f

在运行的容器中执行命令 exec

docker exec

进入容器交互式终端

# 进入容器
docker exec -it CONTAINER_ID /bin/bash
# 进入容器,且允许与容器的标准输入(stdin)、输出(stdout)和标准错误(stderr)进行交互
docker attach [IMAGE ID]

推荐使用 exec -it,退出容器终端时,不会导致容器停止;attach 在退出终端时也会导致容器停止

删除容器 rm

docker rm CONTAINER_ID/NAMES	# 删除容器前需要先停止
docker rm -f CONTAINER_ID/NAMES	# 强制删除

清除容器 prune

docker container prune

可以清除所有处于终止状态的容器

导出导入容器 export import

docker export [IMAGE ID] > name.tar

可以将容器快照到本地文件

# 从容器快照文件中导入为镜像
cat docker /name.tar | docker import -test/name:v1
# 通过URL或者目录导入
docker import http://example.com/exampleimage.tgz example/imagerepo

容器互联

  • docker 有一个连接系统允许将多个容器连接在一起,共享连接信息
  • docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息

容器命名

新建网络

仓库管理

https://hub.docker.com

docker login
docker logout
docker search
docker push

推送仓库 push

docker push username/imageName

私有仓库

https://yeasy.gitbook.io/docker_practice/repository/nexus3_registry #待完成

Nexus 3

Dockerfile

指令

Dockerfile 指令 说明
FROM 指定基础镜像,用于后续的指令构建。
MAINTAINER 指定 Dockerfile 的作者/维护者。(已弃用,推荐使用 LABEL 指令)
LABEL 添加镜像的元数据,使用键值对的形式。
RUN 在构建过程中在镜像中执行命令。
CMD 指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT 设置容器创建时的主要命令。(不可被覆盖)
EXPOSE 声明容器运行时监听的特定网络端口。
ENV 在容器内部设置环境变量。
ADD 将文件、目录或远程 URL 复制到镜像中。
COPY 将文件或目录复制到镜像中。
VOLUME 为容器创建挂载点或声明卷。
WORKDIR 设置后续指令的工作目录。
USER 指定后续指令的用户上下文。
ARG 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。
ONBUILD 当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL 设置发送给容器以退出的系统调用信号。
HEALTHCHECK 定义周期性检查容器健康状态的命令。
SHELL 覆盖 Docker 中默认的 shell,用于 RUN、CMD 和 ENTRYPOINT 指令。

FROM

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。&& 连接命令,可以只创建单层

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath. Match 规则。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在 docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:

CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
假设已通过 Dockerfile 构建了 nginx: test 镜像:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
  1. 不传参运行
docker run  nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf
  1. 传参运行
docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程 (/etc/nginx/new. conf: 假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

格式:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

以下示例设置 NODE_VERSION = 7.2.0 ,在后续的指令中可以通过 $NODE_VERSION 引用:

ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量

构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

格式:

ARG <参数名>[=<默认值>]

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

格式:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

EXPOSE

仅仅只是声明端口。

作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

格式:

EXPOSE <端口1> [<端口2>...]

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

格式:

WORKDIR <工作目录路径>

USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

格式:

USER <用户名>[:<用户组>]

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。
当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式:

ONBUILD <其它指令>

LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

比如可以添加镜像的作者:

LABEL org.opencontainers.image.authors="runoob"

构建镜像

docker build -t image:v1 .

最后的 . 代表本次执行的上下文路径,docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包

由于 docker 的运行模式是 C/S。本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到本机文件。这就需要把本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

Docker Machine

Swarm 集群管理