🌟 热烈欢迎踏上【云原生百日精进:从入门到实战的技术全景】学习之旅的每一位朋友!能在这里相遇,共同探讨云原生的奥秘,我感到无比激动和期待!🎉
🚀 云原生,作为云计算领域的新锐力量,正引领着技术革新的浪潮。在这个专栏里,我们将一起从零开始,逐步深入云原生的世界。无论你是初学者还是资深开发者,这里都将是你精进技艺、探索前沿的最佳舞台。
📚 我们将携手探索云原生的核心概念、关键技术和实战应用,共同开启云计算的新篇章。希望这段旅程不仅能让你收获满满的知识与技能,更能感受到学习的乐趣和成就。
💬 朋友们,让我们共同启程吧!在这个充满挑战与机遇的时代,相互学习、共同进步,一起书写属于我们的云原生精进传奇!期待与你共同成长,见证彼此的蜕变与飞跃!
一、🌟 温故知新导向标 🌟
1.1 🔍 前情提要与内容速览
前情提要
在上一篇文章中,我们深入了解了Docker的起源、发展及其核心理念。Docker,作为一种轻量级的容器化技术,通过其独特的镜像机制,为应用提供了一个可移植、可重复的运行环境,从而大大简化了应用的部署和管理。我们探讨了Docker如何解决了传统应用部署中的环境不一致性和“在我的机器上可以运行”的难题,带来了开发、测试和部署的便捷性。此外,我们还对比了Docker与虚拟机,分析了它们之间的关系以及各自的优缺点。接着,我们引导大家体验了Docker的安装与部署,详细介绍了如何在公网和内网环境下进行Docker的初始化。最后,为了让Docker的管理更加直观,我们介绍了如何使用可视化管理工具,特别是Portainer的安装方法,以提升Docker的管理效率。通过上一篇文章的学习,相信大家对Docker有了更全面的认识和理解。
内容速览
本文详细介绍了Docker容器技术的基础知识,包括Docker常用命令、Dockerfile的编写与优化、以及Docker Compose的使用。首先,文章梳理了Docker的常用命令,帮助读者熟悉如何操作Docker容器。接着,深入解析了Dockerfile的常用参数,并通过两个实际案例展示了如何基于Java和Nginx创建Docker镜像。在镜像大小优化方面,文章介绍了使用Alpine作为基础镜像和多阶段构建Java镜像的方法。随后,文章引入了Docker Compose,阐述了其基础概念、使用原因以及与Docker的兼容性。在Docker Compose的部署安装部分,提供了详细的步骤指导。此外,文章还通过一个Mysql应用服务案例,展示了Docker Compose在实际项目中的应用。最后,文章详细解析了Docker Compose的YAML文件结构,并总结了Docker Compose的常用命令,为读者提供了全面的Docker容器技术学习指南。
1.2 🎯 今日学习航程指南
航程概览
深入探索Docker技术:我们将逐步深入了解Docker技术的各个方面,从基础命令操作到高级应用,帮助你全面掌握这一现代化容器技术。
关键站点
Docker常用命令掌握:启程于Docker的基础操作,通过实践学习Docker的常用命令,包括容器的创建、启动、停止等。这将为你后续的学习打下坚实的基础。
Dockerfile参数与案例学习:深入了解Dockerfile的编写,掌握其核心参数。通过基于Java和Nginx的实际应用案例,学习如何定制自己的Docker镜像,理解容器化应用的构建过程。
&emsp镜像优化技巧:探索如何使用Alpine等轻量级基础镜像来减小镜像大小。学习多阶段构建技巧,进一步优化Java等应用的镜像构建过程,提升效率和性能。
Docker Compose入门与进阶:我们将深入了解Docker Compose的基本概念,并探讨它与Docker之间的兼容性。接着,我们将探究Docker Compose在现代应用开发中的重要性,同时学习其安装和部署的方法。为了更好地实践Docker Compose的使用,我们将通过一个Mysql应用服务案例进行演示。此外,我们还将详细解析Docker Compose的YAML文件结构,帮助你掌握其配置技巧。最后,我们将汇总Docker Compose的常用命令,以提高你的操作效率。
航程小结
通过今日的学习航程,你将从Docker的基础命令开始,逐步深入到Dockerfile的编写、镜像优化,以及Docker Compose的高级应用。这一旅程将使你更加熟练地掌握Docker技术,为你的应用开发和管理带来极大的便利。
二、docker容器基础
2.1 🔨 Docker常用命令
1.查看docker版本,包括 Docker 版本号、API 版本号、对应的 Git Commit、Containerd 和 runC的版本信息等。
- OCI:Open Container Initiative的简称,由Linux基金会主导开发OCI规范和标准,目的是围绕容器格式和Runtime(运行时)制定的一个开放的工业化标准。
- Containerd:Docker为了兼容OCI标准,将容器Runtime及其管理功能从Docker守护进程中剥离出来,用于不启动Docker也能直接通过Containerd来管理容器。
- RunC:Docker按照OCF(Open Container Format)开放容器格式标准制定的一个轻量级工具,可以使用RunC不通过Docker引擎即可实现容器的启动、停止和资源隔离等功能。
docker version
查看docker详细信息
docker info
......
Containers: 8 # 容器个数
Running: 4 # 正在运行的容器个数
Paused: 0 # 暂停的容器个数
Stopped: 4 # 停止的容器个数
Images: 8 # 镜像个数
Server Version: 20.10.4 # 当前服务器 Docker Server 的版本
Storage Driver: overlay2 # 存储驱动,一般为 overlay2,性能好速度快,其他驱动 aufs、overlay、brtfs
......
Cgroup Driver: cgroupfs # 限制和隔离的驱动,生产环境建议使用 systemd
......
Docker Root Dir: /var/lib/docker # Docker 根目录,生产环境建议使用 SSD 硬盘,或者独立的磁盘,不要和系统盘用同一个磁盘。
......
Live Restore Enabled: false # Docker 热更新,生产环境建议设置为 true
搜索镜像
docker search mysql
docker search busybox
拉取镜像
docker pull docker.io/busybox
备份镜像
docker save docker.io/busybox:latest -o /root/busybox.tar
恢复镜像
docker load -i busybox.tar
查看镜像
docker images
给镜像重新打标签
docker tag busybox:latest busybox:2024040601
查看镜像的制作历史
docker history docker.io/busybox:latest
查看镜像的信息
docker inspect docker.io/busybox:latest
commit 自定义镜像
docker commit d76e8f39e026 busybox:2024040602
删除镜像
docker rmi docker.io/busybox:latest
上传镜像
docker push 192.168.1.100: 5000/busybox: latest
启动一个容器
docker start <容器名称>
// 前台启动
docker run -ti --rm busybox:2024040601 bash
// -d 后台启动
docker run -tid busybox:2024040601 bash
// 以特权模式启动
docker run -itd --privileged=true nginx:latest /usr/sbin/init
使用 -p 参数把容器端口和宿主机端口绑定
- -p 宿主机端口: 容器端口
docker run -itd -p 80:80 -v /root/test:/var/www/html myos:http
将真实机目录挂载到容器中提供持久化存储
- 启动容器时,使用 -v 参数映射卷;将真实机目录挂载到容器中提供持久化存储;目录不存在就自动创建,目录存在就直接覆盖掉;多个容器可以映射同一个目录,来达到数据共享的目的
docker run -it -v /root/test:/abc myos:latest
停止一个容器
docker stop [0b5ef163a0e8]
重启一个容器
docker restart [0b5ef163a0e8]
使用top,查看容器内运行的进程
docker top [0b5ef163a0e8]
查看容器日志
docker logs -f busybox:2024040601
查看正在运行的容器
docker ps
// 查看所有容器,包括已经退出的
docker ps -a
// 查看所有容器的 ID
docker ps -aq
连接容器启动进程
- 使用attach进入容器,是上帝进程的身份进入容器的,当执行exit退出容器时,会结束整个容器, 通常用于在测试时,查看报错信息;
docker attach [0b5ef163a0e8]
连接容器,启动新进程
- 在对容器的使用过程中,都是使用exec,新开一个进程的方式进入容器,进行编辑的;
docker exec -it [0b5ef163a0e8] /bin/bash
删除一个容器([]里是容器的id号)
docker rm [0b5ef163a0e8]
三、dockerfile
3.1 🧐 Dockerfile常用参数解析
FROM
- 作用:定义基础镜像,即当前Dockerfile所创建镜像的基础镜像。
- 说明:每个Dockerfile的第一条指令必须是FROM,用于指定一个已经存在的基础Docker镜像,后续的指令都是基于这个基础镜像进行构建。
RUN
- 作用:在镜像内部执行命令,并创建一个新的镜像层。通常用于安装软件包。
- 格式:RUN 或 RUN [“executable”, “param1”, “param2”]
- 示例:RUN apt-get update && apt-get install -y nginx
- 说明:RUN指令会在当前镜像的顶部执行命令,并创建一个新的镜像层。为了减少镜像大小,应该尽量将多个命令组合在一起,并使用&&连接。
- 注意:为了减小镜像大小,多个RUN命令应合并,并清理不必要的文件和缓存。
CMD
- 作用:设置容器启动后默认执行的命令。
- 格式:CMD [“executable”,“param1”,“param2”]、CMD [“param1”,“param2”](作为ENTRYPOINT的默认参数)或 CMD command param1 param2
- 示例:CMD [“nginx”, “-g”, “daemon off;”]
- 说明:CMD指令用于设置容器启动后默认执行的命令。如果Docker容器以指定的命令运行,那么CMD指令将被忽略。
- 注意:如果运行docker run时使用了命令,此命令会覆盖CMD命令。
ENTRYPOINT
- 作用:配置容器启动时运行的命令,与CMD类似,但优先级更高,且不会被docker run时的命令覆盖。
- 格式:ENTRYPOINT [“executable”, “param1”, “param2”]或ENTRYPOINT command param1 param2
- 示例:ENTRYPOINT [“/usr/sbin/nginx”, “-g”, “daemon off;”]
- 说明:ENTRYPOINT指定的命令不会被docker run命令行指定的参数覆盖,而这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序。如果运行docker run时使用了–entrypoint选项,此选项的参数可当作要运行的程序覆盖ENTRYPOINT指令指定的程序。
EXPOSE
- 作用:声明容器提供服务时所使用的端口。
- 格式:EXPOSE [/…]
- 示例:EXPOSE 80/tcp
- 说明:EXPOSE并不会让容器的端口访问到主机,要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
ENV
- 作用:设置环境变量。
- 格式:ENV key=value 或 ENV key1=value1 key2=value2…
- 示例:ENV NGINX_VERSION 1.15.0
- 说明:设置容器的环境变量,这些环境变量可以被后续的RUN、CMD、ENTRYPOINT等指令中使用。
COPY
- 作用:从构建上下文目录中复制文件或目录到镜像里。
- 格式:COPY [–chown=:] … 或 COPY [–chown=:] [“”,… “”]
- 示例:COPY package.json /usr/src/app/
- 说明:COPY指令会从构建上下文目录中复制文件或目录到镜像里。目标路径可以是绝对路径,也可以是相对于WORKDIR的相对路径。
ADD
- 作用:与COPY类似,但支持从URL获取文件,且可以自动解压tar文件。将本地文件、目录或远程文件添加到镜像中。
- 格式:ADD [–chown=:] … 或 ADD [–chown=:] [“”,… “”](与COPY类似)以及 ADD (从URL添加)
- 示例:ADD https://example.com/foobar /
- 说明:ADD的功能与COPY类似,但ADD还支持从URL添加文件,并且可以自动解压tar文件。然而,由于ADD的复杂性可能导致构建缓存失效,因此通常推荐使用COPY。
VOLUME
- 作用:创建一个可以从容器内部挂载的挂载点,将本地文件、目录或远程文件添加到镜像中。常用于数据的持久化存储。一般用来存放数据库和需要保持的数据等。
- 格式:VOLUME [“/data”]
- 示例:VOLUME /var/lib/mysql
- 说明:VOLUME指令用于在容器中创建一个挂载点,用于数据持久化或共享数据。这个挂载点可以与其他容器或主机共享数据。在容器运行时,可以通过-v或–volume参数来挂载这个卷。
WORKDIR
- 作用:指定工作目录,后续的RUN、CMD、ENTRYPOINT、COPY、ADD等指令都会在该目录执行。如果不存在则会创建该目录。
- 格式:WORKDIR /path/to/workdir
- 示例:WORKDIR /app
- 说明:WORKDIR指令用于设置工作目录,后续的指令会在这个目录下执行。这可以确保后续指令的路径问题得到解决,并提高了可读性。
USER
- 作用:切换运行用户。指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户身份运行。
- 格式:USER daemon 或 USER uid:gid 或 USER user:group 或 USER uid
- 示例:USER nginx
- 说明:USER指令用于设置运行容器时的用户身份。这可以增加安全性,防止容器以root用户身份运行。
LABEL
- 作用:给镜像添加元数据。
- 格式:LABEL = = = …
- 示例:LABEL version=“1.0” description=“This is a web server”
- 说明:LABEL指令用于给镜像添加元数据,这些元数据可以用于描述镜像的信息,如版本、描述等。这些数据可以在docker inspect命令中查看。
3.2 💡 Dockerfile案例:要基于🍵 Java、🚀 Nginx等实际常用应用
3.2.1 案例 1: 基于Java的应用
# 使用一个已经包含Java运行时的基础镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 将本地的myapp.jar复制到容器的/app目录下
COPY myapp.jar /app/myapp.jar
# 暴露应用需要监听的端口
EXPOSE 8080
# 设置容器启动时默认执行的命令
CMD ["java", "-jar", "myapp.jar"]
docker build -t my-java-app . # 对于Java应用镜像
3.2.2 案例 2: 基于Nginx的Web服务器
# 使用Nginx官方的基础镜像
FROM nginx:latest
# 将本地的静态网站内容复制到容器的/usr/share/nginx/html目录下
COPY mywebsite/ /usr/share/nginx/html/
# 暴露Nginx服务监听的端口
EXPOSE 80
# 由于Nginx镜像已经包含了启动Nginx的命令,所以这里不需要额外的CMD指令
docker build -t my-nginx-server . # 对于Nginx服务器镜像
3.3 📉 镜像大小优化,使用🏔️ Alpine作为基础镜像,多阶段构建Java镜像
为了优化Docker镜像的大小,我们可以采取多种策略,其中包括使用更轻量级的基础镜像,如Alpine Linux,以及利用Docker的多阶段构建功能。Alpine Linux是一个轻量级的Linux发行版,专为安全性和轻量级而设计,非常适合用于Docker镜像。多阶段构建则允许我们在一个Dockerfile中使用多个FROM指令,以便在构建过程的不同阶段使用不同的基础镜像。
以下是一个使用Alpine Linux作为基础镜像,并利用多阶段构建来优化Java镜像大小的Dockerfile示例👇:
- 第一阶段 使用了一个包含Maven和JDK的基础镜像来构建Java应用程序。这将编译和打包Java项目。
- 第二阶段 使用了一个仅包含JRE的Debian基础镜像来运行Java应用程序。这通过从第一阶段复制已经构建好的JAR文件来减小了镜像的大小,因为不需要包含整个JDK和Maven工具链。
- 第三阶段(可选)演示了如何切换到Alpine Linux以进一步减小镜像大小。这个阶段从第二阶段复制了JAR文件,但使用了基于Alpine的OpenJDK镜像。
注意:虽然Alpine Linux可以显著减小镜像大小,但由于其使用的是musl libc而不是常见的glibc,某些依赖于glibc的库或应用程序可能无法在Alpine上正常运行。因此,在选择使用Alpine之前,请确保您的Java应用程序与其兼容。
# 第一阶段:构建阶段
FROM maven:3.6.3-jdk-11 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package
# 第二阶段:生产阶段
FROM openjdk:11-jre-slim-buster AS runtime
WORKDIR /app
COPY --from=build /app/target/myapp.jar ./myapp.jar
CMD ["java", "-jar", "myapp.jar"]
# 如果想进一步减小镜像大小,可以考虑使用Alpine Linux作为基础镜像的第三阶段
# 第三阶段(可选):使用Alpine Linux进一步减小镜像大小
FROM openjdk:11-jre-alpine
WORKDIR /app
COPY --from=build /app/target/myapp.jar ./myapp.jar
CMD ["java", "-jar", "myapp.jar"]
为了实际构建这个多阶段Dockerfile,你只需在包含Dockerfile的目录中运行以下命令,将创建一个名为my-optimized-java-app的镜像,该镜像已经过优化,仅包含运行Java应用程序所必需的文件和依赖项。
docker build -t my-optimized-java-app .
四、docker-compose
4.1 📖 简介和兼容性
4.1.1 docker-compose基础概念
- docker-compose项目是docker官方的开源项目, 负责实现对docker容器集群的快速编排。
- docker-compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)
- docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务中可以包括多个容器实例,docker-compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如consul。
- docker-compose的工程配置文件默认为docker-compose.yml。可以通过环境变量COMPOSE_FILE -f 参数自定义配置文件,其自定义多个有依赖关系的服务及每个人服务运行的容器。
4.1.2 为什么要使用docker-compose
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
compose允许用户通过一个单独docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)
简单来说:就是来管理多个容器的,定义启动顺序的,合理编排,方便管理。
Docker Compose的优势包括:
- 管理多个容器:Docker Compose可以轻松地定义、启动和管理多个容器,使得容器的集群部署变得更加简单和高效。
- 定义容器之间的依赖关系:通过Docker Compose,用户可以清晰地定义容器之间的依赖关系,确保在启动或停止应用程序时,相关的容器能够按照正确的顺序进行启动或关闭。
- 简化开发环境的搭建:在开发环境中,通常需要同时运行多个服务,如数据库、Web服务器等。Docker Compose可以一键启动整个开发环境,极大地简化了环境的搭建过程。
- 提高应用程序的可移植性:Docker Compose可以将整个应用程序及其所需的容器和配置打包成一个可移植的镜像,使得应用程序可以在不同的环境中轻松运行,无需重新配置和安装依赖。
4.1.3 compose和docker兼容性
Docker版本变化说明👇:
Docker从1.13.x版本开始,版本分为企业版EE和社区版CE,版本号也改为按照时间线来发布,比如17.03就是2017年3月。
Docker的linux发行版的软件仓库从以前的https://apt.dockerproject.org和https://yum.dockerproject.org变更为目前的https://download.docker.com, 软件包名字改为docker-ce和docker-ee。
compose文件格式版本 | docker版本 |
---|---|
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
4.2 🔧 如何部署安装
一、下载二进制文件
- 下载二进制文件 /usr/local/bin/docker-compose
- Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases
1、运行以下命令以下载 Docker Compose 的当前稳定版本👇,要安装其他版本的 Compose,请替换 v2.2.2
sudo curl -L “https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-
(
u
n
a
m
e
−
s
)
−
(uname -s)-
(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose
2、Docker Compose 存放在 GitHub,不太稳定。可以也通过执行下面的命令,高速安装 Docker Compose。
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.2/docker-compose-uname -s
-uname -m
> /usr/local/bin/docker-compose
二、将可执行权限应用于二进制文件
chmod +x /usr/local/bin/docker-compose
三、创建链接文件
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
四、测试是否安装成功
docker-compose version
4.3 🚀 创建Mysql应用服务案例
1.创建docker-compose构建目录
mkdir -p /opt/docker-compose/docker-compose-mysql -p
2.创建docker-compose构建文件
vim /opt/docker-compose/docker-compose-mysql/docker-compose.yaml
version: '3'
services:
mysql:
image: mysql:latest
restart: always
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: Root!@#2023
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M;
ports:
- 3306:3306
3.启动容器
docker-compose up -d
4.关闭容器
docker-compose down
4.4 🗂️ YAML文件结构详解与使用
- version :指定了 Docker Compose 文件的版本号
- services :定义了要运行的服务列表
- mysql:是服务的名称,可以自定义
- image :指定了要使用的镜像,这里使用了最新版的 Nginx 镜像
- restart:设置容器在退出时自动重启。这里设置为 ‘always’,表示始终自动重启
- container_name:指定容器的名称。这里将容器命名为 ‘mysql’
- environment:设置环境变量。这里设置了一个名为 ‘MYSQL_ROOT_PASSWORD’ 的环境变量,并将其值设置为 ‘Root!@#2023’
- command:覆盖容器启动后的默认命令
- ports :将容器内部的 3306端口映射到主机上的 3306 端口,使得可以通过主机 IP 访问容器中运行的 Mysql服务
4.5 🛠️docker-compose常用命令
查看帮助
docker-compose -h
启动所有docker-compose服务
docker-compose up
启动所有docker-compose服务并后台运行
docker-compose up -d
停止并删除容器、网络、卷、镜像
docker-compose down
进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose exec yml里面的服务id
展示当前docker-compose编排过的运行的所有容器
docker-compose ps
展示当前docker-compose编排过的容器进程
docker-compose top
查看容器输出日志
docker-compose logs yml里面的服务id
检查配置
docker-compose config
检查配置,有问题才有输出
docker-compose config -q
重启服务
docker-compose restart
启动服务
docker-compose start
停止服务
docker-compose stop
五、🎉 今日精粹与明日期待 🌠
5.1 🎯 今日内容重点回顾
- Docker常用命令:掌握Docker的基础操作是关键,如启动、停止、删除容器等命令,这些是实现容器管理的基石。
- Dockerfile编写:了解了Dockerfile的常用参数,并通过Java和Nginx的案例,实践了如何定制Docker镜像,这是实现应用容器化的重要步骤。
- 镜像优化:学习了使用Alpine作为基础镜像和多阶段构建技巧来减小镜像大小,提升镜像的效率和性能。
- Docker Compose应用:深入理解了Docker Compose的概念、兼容性和使用原因。通过Mysql服务案例,实践了Compose的部署和YAML文件配置,这有助于高效地管理和部署多个容器。
5.2 🔮 明日精彩先知
明日我们将深入探讨Docker Swarm,这是Docker官方提供的容器编排工具,用于管理多个Docker主机并形成一个集群。
首先,我们将了解Docker Swarm的基本概念,包括其关键特性和工作模式,以及它是如何进行容器调度的。Swarm的集群模式特性将使我们了解到它是如何实现高可用性、扩展性和容错性的。
接着,我们将进入实战环节,学习如何搭建一个高可用的Docker Swarm集群。从集群节点的规划开始,我们将逐步完成集群的创建和节点管理。在这个过程中,你将掌握集群的扩展、节点的添加和删除等操作。
最后,我们将学习如何在Swarm集群中管理服务。这包括服务的部署、更新、回滚和扩展等操作,让你能够灵活应对各种应用场景。
相关资料下载地址📚
- docker官方文档:https://docs.docker.com/
- docker二进制包下载:https://docs.docker.com/get-docker/
- 离线包下载链接:https://pan.baidu.com/s/1I3ubVl8vJkTBQFxzPgXNDA 提取码:yqpt