1. 快速入门
1.1 卸载旧版
首先,检查系统中是否已安装Docker及相关组件:
docker --version
如果系统已安装Docker,您可能会看到类似 Docker version20.10.17,build100c701的输出。为了确保环境的纯净,如果系统中已经存在旧版本的Docker,建议先卸载它:
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine1.2 配置 Docker 的 yum 库
首先要安装一个yum工具
yum install-y yum-utils安装成功后,执行命令,配置Docker的yum源:
yum-config-manager--add-repo https://download.docker.com/linux/centos/docker-ce.repo1.3 安装Docker
yum install-y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin1.4 启动和校验
# 启动Dockersystemctl start docker# 停止Dockersystemctl stop docker# 重启systemctl restart docker# 设置开机自启systemctl enable docker# 执行docker ps命令,如果不报错,说明安装启动成功docker ps1.5 配置镜像加速
这里以阿里云镜像加速为例。
- 注册阿里云账号
首先访问阿里云网站: https://www.aliyun.com/ 注册一个账号。
- 开通镜像服务
在首页的产品中,找到阿里云的容器镜像服务:
点击后进入控制台:首次可能需要选择立刻开通,然后进入控制台。
- 配置镜像加速
找到镜像工具下的镜像加速器:
页面向下滚动,即可找到配置的文档说明:
具体命令如下:
# 创建目录mkdir-p/etc/docker# 复制内容,注意把其中的镜像加速地址改成你自己的tee/etc/docker/daemon.json<<-'EOF'{"registry-mirrors":["https://xxxx.mirror.aliyuncs.com"]}EOF# 重新加载配置systemctl daemon-reload# 重启Dockersystemctl restart docker- 配置 Docker 自启动
默认情况下,每次重启虚拟机我们都需要手动启动
Docker和Docker中的容器。通过如下命令可以实现开机自启:
# Docker开机自启systemctl enable docker# Docker容器开机自启docker update--restart=always[容器名/容器id]1.6 创建容器
- 部署MySQL
首先,我们利用
Docker来安装一个MySQL软件,大家可以对比一下之前传统的安装方式,看看哪个效率更高一些。
如果是利用传统方式部署MySQL,大概的步骤有:
- 搜索并下载
MySQL安装包 - 上传至
Linux环境 - 编译和配置环境
- 安装
而使用Docker安装,仅仅需要一步即可,在命令行输入下面的命令:
docker run-d \--name mysql \-p3306:3306\-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123\ mysql运行效果如图:MySQL安装完毕!通过任意客户端工具即可连接到MySQL。
- 命令解读
docker run -d:创建并运行一个容器,-d则是让容器以后台进程运行--name mysql: 给容器起个名字叫mysql,你可以叫别的-p 3306:3306: 设置端口映射。- 容器是隔离环境,外界不可访问。但是可以将宿主机的端口映射到容器内的端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
- 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
- 格式:
-p 宿主机端口:容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口
-e TZ=Asia/Shanghai: 配置容器内进程运行时的一些参数- 格式:
-e KEY=VALUE,KEY和VALUE都由容器内进程决定 - 案例中,
TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码
- 格式:
mysql: 设置镜像名称,Docker会根据这个名字搜索并下载镜像- 格式:
REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号 - 在未指定
TAG的情况下,默认是最新版本,也就是mysql:latest
- 格式:
镜像的名称不是随意的,而是要到 Docker镜像仓库 中寻找。
镜像运行时的配置也不是随意的,要参考镜像的帮助文档,这些在镜像仓库或者软件的官方网站中都能找到。
如果我们要安装其它软件,也可以到镜像仓库中寻找对应的镜像名称和版本,阅读相关配置即可。
2. 镜像
2.1 下载镜像
# 下载最新版本docker pull mysql# 下载指定版本docker pull mysql:8.0.27如果镜像后面不加版本号,则为letest表示最新版本
2.2 构建镜像
docker build-t 镜像名称.# 如果Dockerfile在上一级目录中docker build-t 镜像名称-f../Dockerfile.-t表示指定镜像名称
-f表示指定Dockerfile路径,如果在当前目录中可以省略-f
2.3 删除镜像
# 删除指定镜像(通过镜像名)docker rmi 镜像名称# 删除指定镜像(通过镜像ID)docker rmi 镜像ID# 强制删除正在被容器使用的镜像(慎用!会先删除关联容器)docker rmi-f 镜像名称/镜像ID# 删除多个镜像docker rmi 镜像1镜像2镜像3# 删除所有镜像(危险操作!)docker rmi $(docker images-q)2.4 保存镜像
将镜像保存到本地:方便备份、离线使用、共享和节省下载时间
# docker save -o 镜像包名 镜像名称docker save-o mysql.tar mysql# 也可以将镜像保存到指定位置docker save-o/root/images/mysql.tar mysql2.5 导入镜像
# docker load --input 镜像名docker load--inputmysql.tar2.6 查看镜像
查看宿主机中下载的所有镜像
docker images2.7 提交镜像
用于将镜像推送到Docker官方仓库中
docker push2.9 清理镜像
一键清理这些没有打标签的镜像:docker image prune -a
root@iZ2ze29609wbuhm5sfl1yqZ:~# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE thrive-blog latest93db21024f2411days ago1.72GB<none><none>0d4dcf860f3112days ago1.72GB<none><none>99483d7c663412days ago1.72GB<none><none>7dfb389e9b0f13days ago1.72GB<none><none>f2cec4b759e913days ago1.72GB<none><none>031ec4192cc02weeks ago1.72GB<none><none>c4c06bafdf764weeks ago1.72GB<none><none>74c03be684a34weeks ago1.55GB<none><none>ff7c7ee472a65weeks ago1.55GB<none><none>d70fd618b14d5weeks ago1.55GB<none><none>fdc350f27a755weeks ago1.55GB<none><none>e9e50e71370f5weeks ago1.58GB<none><none>86d46b004bfa5weeks ago1.58GB<none><none>5290edf031f75weeks ago1.58GB<none><none>bf6da9e495a45weeks ago1.33GB<none><none>0126528c7c4e5weeks ago1.58GB<none><none>5c63ec3adb6d5weeks ago1.58GB nginx latest7f553e8bbc897weeks ago 192MB2.10 清理镜像缓存
docker builder prune3. 容器
3.1 运行并创建容器
# docker run -d --name 容器名称 -p 宿主机端口:容器端口 镜像名称docker run-d--name nginx-p80:80nginxdocker run -d \ # -d: 以后台守护进程模式运行 --name stara-ai \ # 设置容器名称为 stara-ai --restart unless-stopped \ # 设置重启策略:除非手动停止,否则自动重启(如崩溃或重启后) -p 9001:9001 \ # 端口映射:将宿主机的 9001 端口映射到容器的 9001 端口 -e NEXT_PUBLIC_PROJECT_API=https://api.Stara-AI.net/api \ # 设置环境变量:Next.js 项目 API 地址 stara-ai # 使用的镜像名称(默认使用 latest 标签)3.2 查看容器
查看所有容器:docker ps-a 查看运行中的容器:docker ps3.3 启动容器
docker start 容器名称3.4 停止容器
docker stop 容器名称3.5 重启容器
docker restart 容器名称3.6 删除容器
# 删除停止状态的容器docker rm 容器名称或ID# 强制删除正在运行的容器docker rm-f 容器名称或ID3.7 进入容器
dockerexec-it<容器ID或容器名称>bash3.8 查看容器日志
docker logs 容器名称3.9 查看容器信息
docker container inspect 容器名称不过一般使用以下命令查看容器的详细信息,因为该方法不仅可以查看容器的,并且还能查看镜像的详细信息
docker inspect 容器名称如果容器与镜像重名,那么默认优先查看的是容器详细信息
3.10 执行容器内的命令
在指定容器执行对应的命令:
docker exec 容器名 对应的命令
# 查看 Stara 容器内的文件列表dockerexecStara ls3.11 拷贝容器内的文件
docker cp 容器名:容器文件路径 本地文件路径示例:拷贝
mysql容器内的Stara_backup.sql文件到本地./Stara.sql
docker cp mysql:./Stara_backup.sql./Stara.sql4. 网络
在 Docker 中使用网络是为了实现容器之间的通信和与外部网络的连接。网络在 Docker 中的应用场景非常广泛,比如容器间通信、多主机通信、与外部网络的连接
默认情况下每个容器都有一个虚拟的网络IP,但值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,从而导致连接失败。所以可以借助Docker网络来解决这个问题,只要在一个网络中,多个容器之间就能互相访问。下面是网络的常用命令
4.1 创建网络
docker network create 网络名称4.2 删除网络
docker network rm 网络名称4.3 清除网络
清除所有未使用的网络
docker network prune4.4 连接网络
docker network connect 网络名称 容器名称# 也可以通过--alias给网络取个别名docker network connect 网络名称 容器名称--alias 网络别名4.5 断开网络
docker network disconnect 网络名称 容器名称4.6 查看网络信息
docker network inspect 网络名称4.7 查看所有网络
docker network ls4.8 多容器互相访问
只要多个容器在同一个网络中就能实现互相访问,比如MySQL与Stara容器的网络都为lyy,那么他们都可以连接lyy这个网络
# 假设我们有:# - 宿主机IP:192.168.92.140# - Docker网络:lyy(网关:172.18.0.1)# - MySQL容器IP:172.18.0.2# - MySQL容器名:mysql# 方式一:通过虚拟机IP连接SQLALCHEMY_DATABASE_URI='mysql://root:123@192.168.92.140:3306/stara'# 解释:直接使用宿主机的IP,需要MySQL容器映射了3306端口到宿主机# 用法:适用于外部应用(不在Docker网络内)连接数据库# 方式二:通过Docker网络网关IP连接SQLALCHEMY_DATABASE_URI='mysql://root:123@172.18.0.1:3306/stara'# 解释:使用Docker网络的网关IP,网关会转发到对应容器# 用法:不推荐,因为网关可能不直接转发数据库端口# 方式三:通过容器的动态IP连接SQLALCHEMY_DATABASE_URI='mysql://root:123@172.18.0.2:3306/stara'# 解释:使用容器分配的具体IP地址# 问题:容器重启后IP可能变化,导致连接失败# 方式四:通过容器名连接(推荐)SQLALCHEMY_DATABASE_URI='mysql://root:123@mysql:3306/stara'# 解释:使用容器名称,Docker内置DNS会自动解析为当前IP# 优点:容器重启、IP变化都不影响连接实际测试这四种方式:
- 创建网络和容器
# 创建网络docker network create lyy# 启动MySQL容器docker run-d--name mysql \--network lyy \-p3306:3306\-e MYSQL_ROOT_PASSWORD=123\-e MYSQL_DATABASE=stara \ mysql:8.0# 启动一个测试容器(用于测试连接)docker run-d--name test-app \--network lyy \ alpine sleep999999- 获取各种IP地址
# 获取宿主机IP(通常是物理机或虚拟机IP)hostname-I# 输出示例:192.168.92.140# 获取Docker网络信息docker network inspect lyy# 查看 "Gateway": "172.18.0.1"# 查看容器IP:"IPAddress": "172.18.0.2"- 分别测试四种连接方式
# 进入测试容器dockerexec-it test-app sh# 在容器内安装mysql客户端apk add--no-cache mysql-client# 测试方式1:通过宿主机IP连接(需要-p参数映射端口)mysql-h192.168.92.140-P3306-u root-p123-e"SHOW DATABASES;"# 测试方式2:通过网关IP连接(通常不可行)mysql-h172.18.0.1-P3306-u root-p123-e"SHOW DATABASES;"# 大概率失败,因为网关不转发数据库端口# 测试方式3:通过容器具体IP连接mysql-h172.18.0.2-P3306-u root-p123-e"SHOW DATABASES;"# 成功,但IP可能变化# 测试方式4:通过容器名连接(推荐)mysql-h mysql-P3306-u root-p123-e"SHOW DATABASES;"# 成功!Docker自动将"mysql"解析为172.18.0.2外部世界 ↓[宿主机]IP:192.168.92.140||Docker网络:lyy(172.18.0.0/16)|网关:172.18.0.1|├──[MySQL容器]名称:mysql,IP:172.18.0.2└──[Stara容器]名称:stara,IP:172.18.0.3连接方式:1.外部→数据库:192.168.92.140:3306(需端口映射)2.Stara→MySQL:mysql:3306(推荐,自动解析)3.Stara→MySQL:172.18.0.2:3306(可行,但IP会变)上面四种方式我们更推荐使用容器名连接,因为这样的话我们不需要知道网络的IP多少,不管他怎么变,都是这个容器的IP
为什么推荐使用容器名?
# 模拟容器重启(IP可能变化)docker stop mysql docker start mysql# 检查新IP(可能不同)docker inspect mysql|grep IPAddress# 新的IP可能是:172.18.0.5# 但使用容器名依然可以连接!# 在Stara容器内:mysql-h mysql-P3306-u root-p123# Docker自动将"mysql"解析为新的IP 172.18.0.5结论:
- 容器名:像联系人姓名,永久不变
- 容器IP:像手机号码,可能换号
- 使用容器名就像"打电话给张三",而不是"打电话给13800138000"
在代码中的实际应用:
# 错误示例:硬编码IPDATABASE_URL="mysql://root:123@172.18.0.2:3306/mydb"# 容器重启后,代码需要修改!# 正确示例:使用容器名DATABASE_URL="mysql://root:123@mysql:3306/mydb"# 容器重启、重新部署都不需要改代码# Docker Compose中的典型配置version:'3.8'services:mysql:image:mysql:8.0container_name:mysql_db# 固定名称networks:-app-network webapp:image:myapp:latest networks:-app-network environment:# 使用容器名连接数据库DATABASE_URL:"mysql://root:123@mysql_db:3306/mydb"5. 数据卷
为什么要使用数据卷?
使用数据卷可以实现容器和宿主机之间的数据共享和持久化,并且方便在宿主机上修改容器中的数据,提高开发和部署的便利性。
典型应用场景
- 修改容器内的数据比较麻烦,需要先进入到容器才能修改,这时可以使用数据卷,将容器中的数据映射到宿主机,从而实现数据绑定,这样不管修改了容器内的数据还是映射后的宿主机数据,彼此都会双向修改
- 当容器被删除后,数据自然就没有了,如果我们想要实现数据持久化,也可以使用数据卷,这样当容器删除后数据仍然保留
5.1 创建数据卷
创建的数据卷默认存放位置在:/var/lib/docker/volumes/
docker volume create 数据卷名称在创建容器时候使用这个数据卷,也就是数据卷会覆盖容器内的数据
# docker run -d --name 容器名称 -p 宿主机端口:容器端口 数据卷名称:容器内路径 镜像名称docker run-d--name stara-p5000:5000stara-data:/app stara其实在创建容器时候给他指定-v 数据卷名称能够自动创建数据卷,推荐使用这种方式
# -v 参数会自动创建数据卷(如果不存在)docker run-d--name stara-p5000:5000-v stara-data:/app stara5.2 删除数据卷
docker volume rm 数据卷名称5.3 清除数据卷
通过该命令能够删除所有未使用的数据卷
# 默认情况下执行该命令会有交互,需要输入y才能清除docker volume prune# 在后面加上-f可以直接清除docker volume prune-f5.4 查看数据卷信息
docker volume inspect 数据卷名称5.5 查看所有数据卷
docker volume ls5.6 本地数据卷
本地数据卷(Bind Mounts)是将宿主机文件系统目录直接映射到容器中的挂载方式。与 Docker 管理的命名数据卷不同,本地数据卷完全由用户控制。
6. Dockerfile
Dockerfile是用于构建Docker镜像的文本文件。它包含了一系列指令和配置,通过这些指令可以自动化地构建、配置和部署Docker容器。
下面是Dockerfile的一些常见指令和使用方法:
- FROM:指定基础镜像,例如:
FROM ubuntu:latest。 - RUN:在镜像中执行命令。例如:
RUN apt-get update && apt-get install -y python。 - COPY:将文件从宿主机复制到镜像中。例如:
COPY app.py /app/。 - WORKDIR:设置工作目录。例如:
WORKDIR /app/。 - EXPOSE:声明容器运行时的监听端口。例如:
EXPOSE 80。 - CMD:指定容器启动时执行的命令。通常用于设置应用程序的启动命令。例如:
CMD [“python”, “app.py”]。
我们可以选择指定系统镜像如何一步一步来,不过比较麻烦,需要配置很多东西。也可以选择直接使用别人打包好的镜像,这样就可以省去很多配置
6.1 Java
# 设置基础镜像FROM openjdk:11.0-jre-buster# 设置工作目录WORKDIR/app# 将jar包复制到工作目录中并拷贝给app.jarCOPY student.jar/thrive/app.jar# 暴露容器端口号,不写表示所有EXPOSE5555# 创建容器成功做的事情,等价于:java -jar app.jarENTRYPOINT["java","-jar","app.jar"]6.2 Python
# 设置基础镜像FROM python:3.10# 设置工作目录WORKDIR/app# 将当前目录中所有文件复制到指定目录中COPY./app# 构建镜像时做的事情:下载相关依赖RUN pip3 install-r requirements.txt-i https://mirrors.bfsu.edu.cn/pypi/web/simple/# 暴露容器端口号EXPOSE5000# 在容器创建成功后做的事情,相当于执行:python3 app.pyCMD["python3","app.py"]6.3 前端
# 使用官方的 Node.js 镜像作为基础镜像FROM node:20-alpine# 设置工作目录(使用标准路径 /app)WORKDIR/app# 配置 npm 镜像源RUN npm configsetregistry https://registry.npmmirror.com# 复制 package.json 和 package-lock.json(使用相对路径)COPY package*.json.# 安装依赖RUN npm install# 复制所有文件到工作目录(使用相对路径)COPY..# 构建 Next.js 应用RUN npm run build# 暴露应用运行的端口EXPOSE3000# Next.js 默认端口是 3000# 启动 Next.js 应用CMD["npm","start"]7. 发布镜像
一、登录
Docker
# 登录到 Docker Hub(Docker 官方镜像仓库)# 执行后会提示输入用户名和密码# 登录凭证会保存在本地 ~/.docker/config.json 文件中docker login二、在本地将项目构建为
Docker镜像
# 在当前目录下构建 Docker 镜像# -t blog : 为镜像设置标签名称为 "blog"# 未指定版本时,默认使用 "latest" 标签# . : 表示使用当前目录下的 Dockerfile 进行构建docker build-t blog.三、创建一个标记
# 为镜像创建符合 Docker Hub 命名规范的标记# 格式:docker tag 本地镜像名:标签 用户名/仓库名:版本# 标记为具体版本 2.0docker tag blog:latest Stara/blog:2.0# 注释:# blog:latest : 源镜像(上一步构建的镜像)# Stara/ : Docker Hub 用户名(假设用户名为 Stara)# blog : 仓库名称(将在 Docker Hub 上创建的仓库名)# :2.0 : 版本标签# 同时标记为 latest 标签(推荐)docker tag blog:latest Stara/blog:latest# 注释:latest 标签通常指向最新稳定版本四、推送到
Docker仓库
仓库名与标记须一致# 标记时:Stara/blog:2.0 (仓库名是 blog)docker push Stara/blog:2.0# 注释:推送标记为 Stara/blog:2.0 的镜像到 Docker Hub# 输出示例如下:The push refers to repository[docker.io/Stara/blog]f2d56fb9047e:Pushed fd97789b8a64:Pushed9a90196d4ed8:Pushed e40c0d799f4a:Pushed7a0987487f34:Pushed a5d66880f330:Pushed3e21282456a4:Pushed e485bcd02d87:Pushed2.0:digest:sha256:693aa6bf55ce41bfbba9ab916ce2a21f6ece021a850c9762cfb4c57bd882b0ffsize:1999# 注释:# - 每一行显示一个镜像层的推送状态# - "digest" 是镜像的唯一 SHA256 哈希标识符# - "size" 表示镜像的总大小# 推送 latest 标签(推荐)docker push Stara/blog:latest# (可选)另一个镜像的构建和推送(server 项目)# 使用 buildx 工具构建支持特定平台的镜像并直接推送docker buildx build--platform linux/amd64-t Stara/server:2.3.1--push.# 注释:# buildx : Docker 的扩展构建工具,支持多平台构建# --platform : 指定目标平台架构# linux/amd64 : 针对 x86_64 架构的 Linux 系统# -t : 设置镜像标签# Stara/server:2.3.1 : 用户名/仓库名:版本# --push : 构建完成后自动推送到仓库(无需单独 push)# . : 构建上下文为当前目录五、查看刚刚发布的镜像
# 在浏览器中访问 Docker Hub 查看已发布的镜像# 格式:https://hub.docker.com/repository/docker/用户名/仓库名https://hub.docker.com/repository/docker/Stara/blog# 查看后可进行以下操作:# 1. 查看所有版本标签# 2. 查看下载统计# 3. 获取镜像拉取命令# 4. 管理镜像权限# 5. 查看安全扫描报告# (可选)如果推送了 server 镜像,可查看:https://hub.docker.com/repository/docker/Stara/server8. Portainer
Portainer 是一个开源的 Docker 可视化管理工具,它为用户提供了一种简单、直观的方式来管理和监控 Docker 容器、镜像和数据卷。
安装也非常简单,首先下载Portainer的Docker镜像;
docker pull portainer/portainer接下来使用如下命令运行Portainer容器;
docker run-p9000:9000--name portainer \--restart=always \-v/var/run/docker.sock:/var/run/docker.sock \-v/mydata/portainer/data:/data \-d portainer/portainer假设我的虚拟机IP为:
192.168.92.120,那么可以通过如下地址访问
http://192.168.92.120:9000/第一次进入需要设置管理员的账号密码,设置完毕后进入到如下页面就证明OK了
9. dpanel
DPanel是一款由国内开发者打造的Docker可视化管理面板,支持容器管理、镜像构建、文件浏览等核心功能,全中文界面操作更顺手。
docker pull dpanel/dpanel:latestdocker run-it-d--name dpanel--restart=always \-p9000:8080--network dpanel-local \-v/var/run/docker.sock:/var/run/docker.sock \-e APP_NAME=dpanel dpanel/dpanel:latest10. 扩展
10.1 命令别名
如果一段命令过长,可以给这个命令起个别名,方便我们使用:修改
/root/.bashrc文件
# User specific aliases and functionsalias rm='rm -i'alias cp='cp -i'alias mv='mv -i'# 核心alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'alias dis='docker images'# Source global definitionsif[-f/etc/bashrc];then./etc/bashrc fi最后一定要注意 执行这个命令使别名生效
source/root/.bashrc11. Docker Compose
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过使用YAML文件来配置应用程序的服务,它还可以轻松地启动、停止和管理这些服务
官网文档:https://docs.docker.com/compose/
安装:docker compose
sudo apt-get update sudo apt-get install docker-compose-plugin验证是否成功:
docker compose version详细安装教程:https://docs.docker.com/compose/install/linux/#install-the-plugin-manually
脚本文件:compose.yaml
services:# 数据库mysql:container_name:mysql image:mysql:8.0ports:-"3307:3306"networks:# 加入网络-Stara_network environment:# 数据库密码MYSQL_ROOT_PASSWORD:Stara-AI# 创建数据库MYSQL_DATABASE:Stara volumes:# 默认数据卷位置# - mysql_data:/var/lib/mysql# 将 mysql_data 映射到宿主机的当前目录-./mysql_data:/var/lib/mysql# 执行当前目录data中的sql脚本(只在初始化时执行)-./data:/docker-entrypoint-initdb.d command:--character-set-server=utf8mb4--collation-server=utf8mb4_unicode_ci# 后端项目server:container_name:server build:./server ports:-"9003:9003"networks:-Stara_network depends_on:-mysql# 备份服务backup:image:mysql:8.0container_name:mysql_backup# 每3小时自动备份数据command:/bin/sh-c"while true; do mysqldump -h mysql -u root -pliuStara-AI ThriveX > /backup/ThriveX_$(date +%F_%T).sql; sleep 10800; done"# 将容器中的目录映射到当前目录volumes:-./backup:/backup networks:-Stara_network depends_on:-mysql# 网络配置networks:# 创建网络Stara_network:# 数据卷配置:如果映射到宿主机则需要删除此配置,否则会导致冲突# volumes:# mysql_data:运行脚本:
docker compose-p 自定义项目名 up-d--builddocker compose-p<自定义项目名>-f<docker-compose.yml>up-d--builddocker compose-p Stara-f compose_after.yaml up-d--build单独构建:
单独构建当前项目中的server服务。重启、停止、启动等命令同理
docker-compose build server如果名称不是默认的compose.yaml,那么可以这样做
docker-compose-f data_compose.yaml build server常用命令:
docker compose up -d:启动所有的服务。docker compose -p down:停止并删除所有容器、网络,如果加上-v则删除所有卷。docker compose -p 项目名 ps:列出所有运行中的服务。docker compose -p 项目名 logs:查看服务的日志。docker compose exec <service_name> <command>:在运行中的服务容器中执行命令。
查看当前运行的项目:
docker compose-p Stara ps12. Nginx
安装 Nginx
# 拉取镜像docker pull nginx# 创建容器docker run--name nginx-p80:80-p443:443-v/etc/nginx:/etc/nginx:ro-d nginx如果修改了配置文件,执行以下命令重载配置
nginx-sreloaddocker 相关配置
# 服务配置services:# 前端项目blog:# 容器名称container_name:blog# dockerfile的目录位置build:./blog# 端口映射ports:-"9001:9001"volumes:-blog_data:/Stara# 数据卷配置volumes:blog_data:# 使用官方的Node.js镜像作为基础镜像FROM node:20-alpine# 设置工作目录(使用标准路径 /app)WORKDIR/app# 配置 npm 镜像源RUN npm configsetregistry https://registry.npmmirror.com# 复制依赖文件(利用Docker缓存层)COPY package*.json.# 安装依赖RUN npm install# 复制源代码(依赖安装完成后)COPY..# 构建Next.js应用RUN npm run build# 暴露端口(建议使用Next.js默认端口3000,除非有特殊配置)EXPOSE3000# 健康检查(可选)HEALTHCHECK--interval=30s--timeout=3s--start-period=5s--retries=3\ CMD curl-f http://localhost:3000/||exit1# 启动Next.js应用CMD["npm","start"]配置 nginx.conf 反向代理实现绑定域名
events{}http{server{listen80;server_name xxxxxx;# 绑定域名location/{proxy_pass http://blog:9001;# 反向代理proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}}注意:使用blog容器名需要nginx和blog处于同一个网络
配置 ssl证书
如果使用
docker,那么证书的ssl_certificate路径需要在容器内,在宿主机无法访问
events{}http{server{listen443ssl;server_name xxxx;# 证书路径ssl_certificate/etc/nginx/ssl/xxx.net.pem;ssl_certificate_key/etc/nginx/ssl/xxx.net.key;# 证书相关配置ssl_protocols TLSv1.2TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location/{proxy_pass http://blog:9001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}# 配置 http 重定向到 httpsserver{listen80;server_name xxx;return301https://$server_name$request_uri;}}部署静态网站
events{}http{server{listen80;server_name admin.xxxx;location/{root/etc/nginx/html/thrive;# 项目路径index index.html index.htm;# 项目入口}}}
/etc/nginx/html/Stara/index.html
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>一个网页</title></head><body><h1>Hello World!</h1></body></html>部署多个网站
每个网站对应每个
server块,不用担心80和443端口冲突,nginx是根据server_name来区分网站的
events {} http { # 前端项目 server { listen 443 ssl; server_name xxxx; ssl_certificate /etc/nginx/ssl/xxx.net.pem; ssl_certificate_key /etc/nginx/ssl/xxx.net.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://blog:9001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } server { listen 80; server_name xxx; return 301 https://$server_name$request_uri; } # 控制端项目 server { listen 80; server_name admin.xxx; location / { root /etc/nginx/html/Stara; index index.html index.htm; try_files $uri $uri/ /index.html; } } }解决单页面刷新404问题
location / { try_files $uri $uri/ /index.html; }12.1 Nginx 数据卷映射
将宿主机的数据映射到容器内
docker run -d \ -p 80:80 \ -p 18080:18080 \ -p 18081:18081 \ -p 18082:18082 \ -v /Users/yang/Desktop/临时/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /Users/yang/Desktop/临时/nginx/html:/etc/nginx/html \ --name nginx \ nginx:latest
/Users/DELL/Desktop/临时/nginx/nginx.conf
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/json; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; # 指定前端项目所在的位置 location / { root html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 18080; server_name localhost; # 指定前端项目所在的位置 location / { # 这里写容器内的位置,不是宿主机的位置 root /etc/nginx/html/hmall-portal; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /api { rewrite /api/(.*) /$1 break; proxy_pass http://localhost:8080; } } server { listen 18081; server_name localhost; # 指定前端项目所在的位置 location / { root /etc/nginx/html/hmall-admin; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /api { rewrite /api/(.*) /$1 break; proxy_pass http://localhost:8080; } } server { listen 18082; server_name localhost; # 指定前端项目所在的位置 location / { root /etc/nginx/html/hm-refresh-admin; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /api { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; rewrite /api/(.*) /$1 break; proxy_pass http://localhost:8080; } } # upstream backend { # server 127.0.0.1:8081 max_fails=5 fail_timeout=10s weight=1; # server 127.0.0.1:8082 max_fails=5 fail_timeout=10s weight=1; # } }Docker容器化技术提供了一套完整的应用封装、部署和运行解决方案,涵盖从基础环境搭建、镜像构建、容器管理到网络配置、数据持久化和生产部署的全流程。核心包括:通过Dockerfile实现应用环境的标准化封装;利用镜像分层机制提升构建效率;通过容器网络实现服务间安全通信;借助数据卷确保状态持久化;使用Docker Compose编排多服务应用;配合Nginx实现生产环境反向代理;最终通过标准流程将镜像发布到仓库完成持续交付。这一体系实现了开发与生产环境的一致性,显著提升了应用部署效率和运维可靠性。