概念→命令→数据卷→自定义镜像→网络→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)常见命令:你只要先把“运行闭环”记牢
最常用的一套闭环(背这套就够用):
- 拉镜像:
docker pull nginx:1.20.2 - 看镜像:
docker images - 跑容器:
docker run ... - 看容器:
docker ps/docker ps -a - 看日志:
docker logs -f 容器名 - 进容器:
docker exec -it 容器名 bash - 停/启:
docker stop/start/restart 容器名 - 删容器:
docker rm -f 容器名 - 删镜像:
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 参数对照表
--name→container_name-p→ports-e→environment-v→volumes--network→networks
6.2 常用命令(必背)
- 启动:
docker compose up -d - 停并删:
docker compose down - 看状态:
docker compose ps - 看日志:
docker compose logs -f 服务名 - 进容器:
docker compose exec 服务名 bash
7)推荐你这样学(最快掌握)
按这个顺序做 5 个小练习,每个练习都能独立验收:
- 跑 mysql 容器(端口映射 + 账号密码)
验收:客户端能连上 - 跑 nginx 容器 + 挂载 html(本地目录挂载)
验收:改宿主机 index.html,浏览器立即变化 - 跑 nginx 容器 + 挂载 nginx.conf
验收:改配置后reload生效 - 构建 Java 镜像 + run 跑起来
验收:docker logs -f看到启动成功,接口能访问 - 用 compose 一键起三件套
验收:docker compose ps全部 Up,前端能调后端、后端能连 mysql