Docker — 跨平台和环境部署
Docker 作为一个开放源代码的容器化解决方案而存在。它整合了应用及其必要的组件,并将其打包成一个轻量化且相互独立的容器。支持在不同平台上运行,并在各种环境中实现兼容性。
1. Docker 基本概念
镜像 (Image) :Docker镜像是一个专为构建容器设计的独特模板,并整合了构建高效容器所必需的软件组件(如代码、库、依赖和环境配置)。这种镜像类似于构建蓝图的过程,并能够生成容器以满足开发需求。
Container:在Docker框架中,“Container”是指一个镜像的具体实例,在实际运行中,“Container”通常由一个或者多个进程共同承载,并且具备隔离特性。“Container”的生命周期相对短暂,在开发部署过程中能够快速实现启动、停止以及销毁等操作
Dockerfile
存储位置 (Repository):Docker镜像的位置类似于代码库的版本控制系统。镜像可以上传至仓库中方便其他用户下载。Docker Hub 是一个开放平台存储大量官方及社区提供的镜像。
2. Docker 的优势
轻量级 :基于系统级的虚拟化技术不采用容器化技术,在这种架构下构建的应用不需要完整的操作系统环境,并且相比传统容器化技术具有更快的启动速度,在资源利用方面更为高效。
环境一致性 :Docker 容器整合了应用所需的所有环境配置细节,并通过精确的设置保证在各种环境下运行表现统一。这样能够有效避免因不同环境中配置差异导致的一致性问题。
迅速部署与扩展:Docker具备迅速部署与扩展的能力,在短短数秒内即可启动多台实例,并为大规模系统提供便捷的部署与扩展解决方案。
便于 CI/CD :Docker 与 DevOps 流程无缝集成,支持持续集成、交付和部署。
3. Docker 安装
请参考Docker官方文档的具体安装指南,请访问以下链接获取详细信息:https://docs.docker.com/engine/install/centos/
请参考Docker官方文档的具体安装指南,请访问以下链接获取详细信息:https://docs.docker.com/engine/install/centos/
3.1 卸载旧版
首先如果系统中已经存在旧的Docker,则先卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux
3.2 配置Docker的yum库
首先要安装一个yum工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
bash
安装成功后,执行命令,配置Docker的yum源:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
bash
更新yum,建立缓存
sudo yum makecache fast
bash
3.3 安装Docker
最后,执行命令,安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
bash
3.4 启动和校验
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
bash

4. Docker 基本使用
该平台内置了一个后台服务器系统。通过使用 Docker 命令能够指导 Docker 服务完成任务。当 Docker 服务处理应用程序部署时,在线搜索和下载相应的镜像文件是必要步骤之一。随后基于镜像构建容器,并赋予其运行权限即可完成任务。
4.1 Docker 命令

通常情况下,在重新启动虚拟机时我们需要手动执行 Docker 启动以及其内部的容器运行过程。通过输入特定的命令序列可以实现开机自动启动:例如,在终端中输入相应的命令即可完成配置。
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
bash
4.2 Docker部署MySQL服务示例
docker run -d \ # 以后台模式启动容器(detached mode)。
--name mysql \ # 将容器命名为 "mysql",便于管理。
-p 3306:3306 \ # 将主机的 3306 端口映射到容器的 3306 端口,方便本地主机访问 MySQL 服务。
-e TZ=Asia/Shanghai \ # 设置容器的时区为上海时间(Asia/Shanghai),以确保时间一致。
-e MYSQL_ROOT_PASSWORD=123 \ # 设置 MySQL root 用户的密码为 "123"(实际环境中应使用复杂密码)。
-v ./mysql/data:/var/lib/mysql \ # 挂载本地数据目录到容器的 MySQL 数据目录,以持久化存储数据库数据。
-v ./mysql/conf:/etc/mysql/conf.d \ # 挂载本地配置目录到容器的 MySQL 配置目录,以便加载自定义配置文件。
-v ./mysql/init:/docker-entrypoint-initdb.d \ # 挂载本地初始化脚本目录到容器,容器启动时将执行目录中的脚本。
mysql # 使用官方 MySQL 镜像。
bash
镜像的名字并非随机设定;
需要从 DockerRegistry 平台查找;
配置在构建过程中也并非任意选择;
必须参考该镜像的技术文档;
这些信息可以在 DockerHub 网站或软件官方文档中找到。
4.3 Dockerfile制作镜像
镜像的来源有两种:
(1)直接去DockerRegistry下载
(2)基于官方基础镜像自己制作
由于制作镜像的过程中需要分层次进行处理与打包这一过程较为复杂因此Docker为此提供了一种自动化解决方案即自动打包镜像的功能我们只需将打包过程中的各个步骤以固定语法的形式编写出来让Docker负责处理并执行这些步骤即可
这种用于存储镜像结构的文件即可被称为Dockerfile;其对应的语法结构具体可参考官方文档。
https://docs.docker.com/engine/reference/builder/

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
bash
然后,执行命令,构建镜像:
# 使用 Docker 从指定目录中的 Dockerfile 构建镜像
docker build -t docker-demo:1.0 /root/demo
# 参数说明:
# docker build # Docker 命令,用于从 Dockerfile 构建镜像
# -t docker-demo:1.0 # 使用 -t 参数为镜像指定名称和标签(版本号)
# docker-demo # 镜像的名称,用于标识构建出的镜像
# 1.0 # 镜像的版本号(tag),用于区分不同版本,格式为 <镜像名>:<版本号>
# /root/demo # 指定 Dockerfile 所在的目录路径,Docker 将在该目录中查找名为 Dockerfile 的文件
bash
4.4 网络
Java项目通常会调用多种中间件如MySQL和Redis。将这些容器放置于同一个网络环境中则能够实现相互调用。

4.5 Docker Compose
Docker Compose 是一个软件工具, 允许用户定义和部署多台容器服务. 用户可以通过配置 docker-compose.yml 文件来轻松地部署应用的多个服务并进行管理.
非简单项目的开发将涉及多种不同的其他中间件,在手动配置每个组件时会面临极大的挑战和不便。
而 Docker Compose 就能够帮助我们 支持快速部署多个相互作用的 Docker 容器 。它被用来配置一个单独的 docker-compose.yml 模板文件(YAML 格式),用于定义一组相关联的应用容器。
举例来说,用docker run部署MySQL的命令如下:
docker run -d \ # 以后台模式启动容器(detached mode)。
--name mysql \ # 将容器命名为 "mysql",便于管理。
-p 3306:3306 \ # 将主机的 3306 端口映射到容器的 3306 端口,方便本地主机访问 MySQL 服务。
-e TZ=Asia/Shanghai \ # 设置容器的时区为上海时间(Asia/Shanghai),以确保时间一致。
-e MYSQL_ROOT_PASSWORD=123 \ # 设置 MySQL root 用户的密码为 "123"(实际环境中应使用复杂密码)。
-v ./mysql/data:/var/lib/mysql \ # 挂载本地数据目录到容器的 MySQL 数据目录,以持久化存储数据库数据。
-v ./mysql/conf:/etc/mysql/conf.d \ # 挂载本地配置目录到容器的 MySQL 配置目录,以便加载自定义配置文件。
-v ./mysql/init:/docker-entrypoint-initdb.d \ # 挂载本地初始化脚本目录到容器,容器启动时将执行目录中的脚本。
mysql # 使用官方 MySQL 镜像。
bash
如果用docker-compose.yml文件来定义,就是这样:
# Docker Compose 配置文件,版本为 3.8
version: "3.8"
# 定义多个服务
services:
# 定义 MySQL 服务
mysql:
# 使用官方的 MySQL 镜像
image: mysql
# 指定容器名称
container_name: mysql
# 映射主机和容器的端口
ports:
- "3306:3306" # 将主机的 3306 端口映射到容器的 3306 端口
# 设置环境变量
environment:
TZ: Asia/Shanghai # 设置容器的时区为亚洲/上海
MYSQL_ROOT_PASSWORD: 123 # 设置 MySQL 根用户的密码为 123
# 挂载主机目录到容器中,用于持久化数据和自定义配置
volumes:
- "./mysql/conf:/etc/mysql/conf.d" # 挂载本地的配置文件夹到容器的 MySQL 配置目录
- "./mysql/data:/var/lib/mysql" # 挂载本地的数据文件夹到容器的 MySQL 数据目录
# 指定网络配置
networks:
- new # 将此服务连接到名为 new 的网络
# 定义网络
networks:
new:
name: cyt # 指定网络的名称为 cyt
bash


编写好docker-compose.yml文件,就可以部署项目了。常见的命令:
# 启动所有, -d 参数是后台启动
docker compose up -d
bash
5. 部署示例
项目说明:
cyt:后端代码
cyt-portal:用户端的前端代码
cyt-admin:管理端的前端代码
5.1 逐个部署
5.1.1 部署Java项目

请注意:host使用了MySQL作为其地址;它恰好是我们容器的MySQL名称;因此,在同一网络内就能互相访问。
首先将项目打包;
将工程目录下的Dockerfile和/tar目录下的.jar同步至虚拟机的/root目录下。
# 1.首先通过命令创建一个网络
docker network create cytnet
# 1.构建项目镜像,不指定tag,则默认为latest
docker build -t cyt.
# 2.创建并容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name cyt --network cytnet -p 8080:8080 cyt
bash
5.1.2 部署前端
将前端代码复制至 nginx 目录下的 html 子目录中,在 nginx.conf 配置文件内为这两个静态资源目录建立代理关系。
将整个nginx目录上传到虚拟机的/root目录下
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network hmall \
nginx
bash
5.2 DockerCompose一键部署
编写docker-compose.yml文件
version: "3.8" # 定义 Docker Compose 文件的版本
services:
# MySQL 数据库服务
mysql:
image: mysql # 使用官方 MySQL 镜像
container_name: mysql # 设置容器名称为 "mysql"
ports:
- "3306:3306" # 将主机的 3306 端口映射到容器的 3306 端口
environment:
TZ: Asia/Shanghai # 设置容器的时区为亚洲/上海
MYSQL_ROOT_PASSWORD: 123 # 设置 MySQL 的 root 用户密码
volumes:
- "./mysql/conf:/etc/mysql/conf.d" # 挂载自定义配置文件目录到容器中
- "./mysql/data:/var/lib/mysql" # 持久化存储 MySQL 数据库的数据
- "./mysql/init:/docker-entrypoint-initdb.d" # 初始化 SQL 脚本目录
networks:
- cyt-net # 连接到名为 "cyt-net" 的自定义网络
# Java 应用服务(cyt)
cyt:
build:
context: . # 设置构建上下文为当前目录
dockerfile: Dockerfile # 指定构建 Java 应用的 Dockerfile 文件
container_name: cyt # 设置容器名称为 "cyt"
ports:
- "8080:8080" # 将主机的 8080 端口映射到容器的 8080 端口
networks:
- cyt-net # 连接到自定义网络 "cyt-net"
depends_on:
- mysql # 设置依赖关系:确保 MySQL 容器在 cyt 容器之前启动
# Nginx 反向代理服务
nginx:
image: nginx # 使用官方 Nginx 镜像
container_name: nginx # 设置容器名称为 "nginx"
ports:
- "18080:18080" # 将主机的 18080 端口映射到容器的 18080 端口(可以根据需要修改)
- "18081:18081" # 将主机的 18081 端口映射到容器的 18081 端口(可以根据需要修改)
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf" # 挂载自定义 Nginx 配置文件
- "./nginx/html:/usr/share/nginx/html" # 挂载静态文件目录到 Nginx 容器中
depends_on:
- cyt # 设置依赖关系:确保 cyt 容器在 nginx 容器之前启动
networks:
- cyt-net # 连接到自定义网络 "cyt-net"
# 定义自定义网络
networks:
cyt-net:
name: cyt # 将自定义网络命名为 "cyt"
bash

在终端中执行以下命令时,在Docker Compose的作用下会将解析文件 docker-compose.yml 并开始服务的配置设置。
# 启动所有, -d 参数是后台启动
docker compose up -d
bash
