一、为什么每个开发者都该会 Docker
“在我机器上能跑”是开发圈最大的谎言。Docker 把应用和它依赖的环境打包成一个不可变的镜像,从开发到生产环境完全一致。本文带你从零走完一次完整部署。
二、安装与基础概念
- 镜像(Image):只读模板,类似安装包。
- 容器(Container):镜像的运行实例。
- 仓库(Registry):存镜像的地方,如 Docker Hub。
# 安装(Ubuntu)
sudo apt update && sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
# 验证
docker run hello-world
三、写第一个 Dockerfile
以 Spring Boot 应用为例:
FROM eclipse-temurin:17-jdk
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
多阶段构建能大幅减小体积:
FROM maven:3.9 AS build
COPY . /src && RUN mvn -f /src/pom.xml package
FROM eclipse-temurin:17-jre
COPY --from=build /src/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
四、用 docker-compose 编排多服务
version: "3.8"
services:
app:
build: .
ports: ["8080:8080"]
depends_on: [mysql, redis]
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: pwd123
volumes: ["mysql-data:/var/lib/mysql"]
redis:
image: redis:7
volumes:
mysql-data:
一条 docker compose up -d 拉起整套环境。
五、上线到服务器
- 把镜像推到仓库:
docker tag app:1.0 registry.com/app:1.0 && docker push - 服务器拉取并运行:
docker run -d -p 8080:8080 registry.com/app:1.0 - 前面挂 Nginx 做反向代理和 HTTPS。
六、常见坑
- 容器里时间不对:挂载
/etc/localtime或设 TZ 环境变量。 - 日志写满磁盘:配
--log-opt max-size=10m。 - 数据不持久:务必用 volume 挂载,别写进容器层。
结语
Docker 是现代后端的基本功。先会用,再理解原理,慢慢你就离不开它了。




