day07--- 20-项目部署(Docker)

25 阅读4分钟

概念→命令→数据卷→自定义镜像→网络→Compose


你学 Docker 先抓住一句话

Docker = 用“镜像(image)”把软件 + 运行环境打包好,然后用“容器(container)”跑起来。
部署时你主要在管四样东西:镜像 / 容器 / 数据卷(volume) / 网络(network)


1)快速入门:一条命令跑 MySQL(要会读懂这条命令)

经典:

docker run -d \
  --name mysql \
  -p 3307:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql:8

要能一眼看懂:

  • run:创建并运行容器(同名不能重复创建
  • -d:后台运行
  • --name mysql:容器名(后面网络互通、exec、logs都靠它)
  • -p 3307:3306:宿主机端口→容器端口(访问宿主机3307就等于访问容器3306)
  • -e:环境变量(由镜像文档决定)
  • mysql:8:镜像名:版本(repo:tag)

你要形成的习惯:

“镜像怎么写、环境变量怎么配”都去看镜像文档(DockerHub/官网),不要凭感觉乱写。


2)常见命令:你只要先把“运行闭环”记牢

最常用的一套闭环(背这套就够用):

  1. 拉镜像:docker pull nginx:1.20.2
  2. 看镜像:docker images
  3. 跑容器:docker run ...
  4. 看容器:docker ps / docker ps -a
  5. 看日志:docker logs -f 容器名
  6. 进容器:docker exec -it 容器名 bash
  7. 停/启:docker stop/start/restart 容器名
  8. 删容器:docker rm -f 容器名
  9. 删镜像:docker rmi 镜像id

排错三板斧:

  • 端口不通:docker ps 看端口映射
  • 程序报错:docker logs -f xxx
  • 搞不懂挂载/网络:docker inspect xxx

3)数据卷:Docker 部署“丝滑”的关键(一定要会)

你讲义里的三个痛点,靠数据卷解决:

  • 容器删了,数据不能丢(MySQL data)
  • 配置要能改(nginx.conf / mysql配置)
  • 静态资源要能更新(nginx html)

3.1 两种挂载方式要分清

① 数据卷(volume)挂载(逻辑名)

-v html:/usr/share/nginx/html

优点:不强依赖宿主机具体目录,迁移更灵活。

② 本地目录(bind mount)挂载(真实路径)

-v /usr/local/tlias-web/html:/usr/share/nginx/html

优点:目录直观、好找、好维护(企业更常用)。

重点规则:本地目录必须以 /./ 开头
不然会被识别成“数据卷名”。

3.2 MySQL 推荐用本地目录挂载

docker run -d \
--name mysql \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123 \
-e TZ=Asia/Shanghai \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql:8

你要理解每个目录的意义:

  • /var/lib/mysql:数据文件(必须持久化)
  • /docker-entrypoint-initdb.d:初始化SQL(首次启动时执行)
  • /etc/mysql/conf.d:自定义配置(my.cnf等)

4)自定义镜像:把 Java 项目打成镜像跑起来

4.1 Dockerfile 先掌握 6 个指令就够了

  • FROM 基础镜像
  • ENV 环境变量
  • WORKDIR 工作目录
  • COPY 拷贝文件
  • EXPOSE 声明端口(给使用者看的)
  • ENTRYPOINT 启动命令

4.2 重要提醒:不要把密钥写进 Dockerfile

把 OSS key 写进 ENV,这会导致:

  • 镜像一旦分发/上传,密钥就跟着泄露
  • 镜像层是可被分析的,风险非常大

更推荐的做法(先记住思路):

  • 运行容器时用 -e OSS_ACCESS_KEY_ID=... 注入
  • compose 里用 .env 文件 / environment: 注入

4.3(更“企业化”写法)

你讲义用 centos:7 + 拷jdk压缩包 能跑,但更常见是直接用 JRE基础镜像(更小、更快):

FROM eclipse-temurin:17-jre
WORKDIR /tlias
COPY tlias.jar /tlias/tlias.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/tlias/tlias.jar"]

构建:

docker build -t tlias:1.0 .

运行(加入网络,能用 mysql 容器名访问数据库):

docker run -d --name tlias-server --network itheima -p 8080:8080 tlias:1.0

5)网络:别再写死 IP,用“容器名当域名”

默认 bridge 网络里容器 IP 会变,所以正确方式是:

1)建自定义网络:

docker network create itheima

2)让 mysql 和 app 在同一个网络:

docker network connect itheima mysql
docker network connect itheima tlias-server

3)在 app 配置里数据库地址写:

  • host:mysql
  • port:3306

这样容器间互通靠 DNS(容器名解析) ,不怕 IP 变化。


6)Docker Compose:一键起 MySQL + Java + Nginx

Compose 就是把一堆 docker run 写成 docker-compose.yml

6.1 参数对照表

  • --namecontainer_name
  • -pports
  • -eenvironment
  • -vvolumes
  • --networknetworks

6.2 常用命令(必背)

  • 启动:docker compose up -d
  • 停并删:docker compose down
  • 看状态:docker compose ps
  • 看日志:docker compose logs -f 服务名
  • 进容器:docker compose exec 服务名 bash

7)推荐你这样学(最快掌握)

按这个顺序做 5 个小练习,每个练习都能独立验收:

  1. 跑 mysql 容器(端口映射 + 账号密码)
    验收:客户端能连上
  2. 跑 nginx 容器 + 挂载 html(本地目录挂载)
    验收:改宿主机 index.html,浏览器立即变化
  3. 跑 nginx 容器 + 挂载 nginx.conf
    验收:改配置后 reload 生效
  4. 构建 Java 镜像 + run 跑起来
    验收:docker logs -f 看到启动成功,接口能访问
  5. 用 compose 一键起三件套
    验收:docker compose ps 全部 Up,前端能调后端、后端能连 mysql