引言
Docker是最流行的容器技术。本文介绍Docker的基础概念和实战应用。
一、Docker基础
1.1 核心概念
- 镜像(Image):只读模板
- 容器(Container):镜像的运行实例
- 仓库(Registry):存储镜像
1.2 Docker架构
1 2 3 4
| Docker Client → Docker Daemon → Containers → Images → Volumes → Networks
|
二、基本命令
2.1 镜像操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| docker pull nginx:latest
docker images
docker rmi nginx:latest
docker build -t myapp:1.0 .
docker push myapp:1.0
docker save nginx > nginx.tar docker load < nginx.tar
|
2.2 容器操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| docker run -d --name mynginx -p 80:80 nginx
docker ps docker ps -a
docker start mynginx docker stop mynginx docker restart mynginx
docker rm mynginx
docker exec -it mynginx /bin/bash
docker logs mynginx
docker inspect mynginx
|
三、Dockerfile
3.1 基本指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| FROM openjdk:11-jre-slim
LABEL maintainer="yourname@example.com"
WORKDIR /app
COPY target/app.jar app.jar
ENV JAVA_OPTS="-Xms256m -Xmx512m"
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
|
3.2 多阶段构建
1 2 3 4 5 6 7 8 9 10 11 12 13
| FROM maven:3.8-jdk-11 AS build WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests
FROM openjdk:11-jre-slim WORKDIR /app COPY --from=build /app/target/app.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
|
四、数据卷
4.1 Volume
1 2 3 4 5 6 7 8 9 10 11
| docker volume create mydata
docker run -d -v mydata:/data nginx
docker volume ls
docker volume rm mydata
|
4.2 Bind Mount
1 2
| docker run -d -v /host/path:/container/path nginx
|
五、网络
5.1 网络模式
1 2 3 4 5 6 7 8 9 10 11 12
| docker network create mynet
docker network ls
docker run -d --network mynet --name web nginx
docker run -d --network mynet --name api myapp
|
5.2 端口映射
1 2 3 4 5 6 7 8
| docker run -d -p 80:80 nginx
docker run -d -p 80:80 -p 443:443 nginx
docker run -d -P nginx
|
六、实战示例
6.1 部署Spring Boot应用
1 2 3 4 5
| FROM openjdk:11-jre-slim WORKDIR /app COPY target/springboot-app.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
|
1 2 3 4 5 6 7 8 9
| docker build -t springboot-app:1.0 .
docker run -d \ --name springboot-app \ -p 8080:8080 \ -e SPRING_PROFILES_ACTIVE=prod \ springboot-app:1.0
|
6.2 部署MySQL
1 2 3 4 5 6 7
| docker run -d \ --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root123 \ -e MYSQL_DATABASE=mydb \ -v mysql-data:/var/lib/mysql \ mysql:8.0
|
6.3 部署Redis
1 2 3 4 5 6
| docker run -d \ --name redis \ -p 6379:6379 \ -v redis-data:/data \ redis:7 \ redis-server --appendonly yes
|
七、最佳实践
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 1. 使用轻量级基础镜像 FROM alpine:latest
2. 合并RUN指令减少层数 RUN apt-get update && \ apt-get install -y curl && \ apt-get clean
3. 使用.dockerignore node_modules .git *.log
4. 使用非root用户 USER nobody
5. 设置健康检查 HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/ || exit 1
|
总结
Docker核心:
- 镜像与容器:理解两者关系
- Dockerfile:构建自定义镜像
- 数据卷:持久化数据
- 网络:容器间通信
- 最佳实践:优化镜像大小和安全性
参考资料