03-Docker 容器化
对应原始资料:
项目一前置课b/day12-Docker、基于docker部署服务.md
一、Docker 是什么
- 容器化技术,把应用和它的依赖(运行环境)打包成镜像,到处运行。
- 比虚拟机轻量:共享宿主机内核,秒级启动。
- 解决「在我机器上能跑」的环境一致性问题。
镜像 / 容器 / 仓库
镜像 Image 类比:程序(只读模板)
容器 Container 类比:进程(运行实例)
仓库 Registry 类比:应用商店(Docker Hub)二、安装与基本命令
bash
# Linux 安装(CentOS)
curl -fsSL https://get.docker.com | bash
systemctl start docker && systemctl enable docker
# 配置镜像加速器(阿里云)
docker version
docker info三、镜像命令
bash
docker pull nginx:latest # 拉取
docker images # 列出
docker rmi nginx # 删除
docker save -o nginx.tar nginx # 导出
docker load -i nginx.tar # 导入
docker tag nginx:latest myrepo/nginx:v1
docker push myrepo/nginx:v1四、容器命令
bash
docker run [参数] image
-d # 后台
--name xxx # 容器名
-p 8080:80 # 端口映射 宿主:容器
-v /data:/var/lib # 目录挂载
-e KEY=VALUE # 环境变量
--network xxx # 加入网络
--restart=always # 自启
docker ps # 运行中
docker ps -a # 所有
docker start/stop/restart/rm 容器名
docker logs -f 容器名 # 看日志
docker exec -it 容器名 bash # 进入容器
docker inspect 容器名 # 详情
docker cp 容器名:/path /host # 拷贝五、用 Docker 部署常见服务
MySQL
bash
docker run -d --name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /opt/mysql/data:/var/lib/mysql \
--restart=always \
mysql:8Redis
bash
docker run -d --name redis -p 6379:6379 redis:7Nginx
bash
docker run -d --name nginx -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html nginx六、数据卷(Volume)
数据卷解决「容器删了数据也没了」的问题。
bash
docker volume create mydata
docker volume ls
docker volume inspect mydata挂载方式:
-v 宿主路径:容器路径:bind mount。-v 卷名:容器路径:volume。
七、Dockerfile 自定义镜像
dockerfile
FROM openjdk:8-jdk-slim
ENV APP_HOME=/app
WORKDIR $APP_HOME
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]bash
docker build -t myapp:1.0 .
docker run -d -p 8080:8080 myapp:1.0常用指令
| 指令 | 作用 |
|---|---|
FROM | 基础镜像 |
RUN | 构建时执行(装软件) |
COPY / ADD | 拷贝文件 |
WORKDIR | 工作目录 |
ENV | 环境变量 |
EXPOSE | 声明端口 |
CMD | 容器启动默认命令(可被覆盖) |
ENTRYPOINT | 启动命令(不易被覆盖) |
VOLUME | 声明挂载点 |
八、容器网络
- 默认 bridge:容器间隔离,需
-p才能被外部访问。 --network自定义网络让容器用名字互相访问:
bash
docker network create app-net
docker run -d --name mysql --network app-net mysql
docker run -d --name app --network app-net myapp
# app 容器可以用 mysql:3306 访问 mysql 容器九、Docker Compose(多容器编排)
yaml
# docker-compose.yml
version: "3"
services:
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- mysql-data:/var/lib/mysql
redis:
image: redis:7
app:
build: .
depends_on: [mysql, redis]
ports:
- "8080:8080"
volumes:
mysql-data:bash
docker-compose up -d # 启动
docker-compose down # 停止删除
docker-compose logs -f app十、Docker 与 SpringBoot 部署最佳实践
- 多阶段构建(builder 阶段用 maven 编译,runtime 只放 jre + jar),镜像更小。
- 用分层 jar(SpringBoot 默认),改代码只重新打 application 层。
- 配置文件用
-v挂载或环境变量,不打进镜像。 - 日志输出到 stdout,由 Docker 收集。
练习建议
- 用 Docker 跑 MySQL + Redis,SpringBoot 连接。
- 写 Dockerfile 把自己的 SpringBoot 项目打成镜像并运行。
- 用 docker-compose 一键启动一个三服务应用。
- 把数据卷挂出来,删容器后数据还在。