Skip to content

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:8

Redis

bash
docker run -d --name redis -p 6379:6379 redis:7

Nginx

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 部署最佳实践

  1. 多阶段构建(builder 阶段用 maven 编译,runtime 只放 jre + jar),镜像更小。
  2. 用分层 jar(SpringBoot 默认),改代码只重新打 application 层。
  3. 配置文件用 -v 挂载或环境变量,不打进镜像。
  4. 日志输出到 stdout,由 Docker 收集。

练习建议

  1. 用 Docker 跑 MySQL + Redis,SpringBoot 连接。
  2. 写 Dockerfile 把自己的 SpringBoot 项目打成镜像并运行。
  3. 用 docker-compose 一键启动一个三服务应用。
  4. 把数据卷挂出来,删容器后数据还在。