引言

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
# web容器可以通过"api"域名访问api容器

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核心:

  1. 镜像与容器:理解两者关系
  2. Dockerfile:构建自定义镜像
  3. 数据卷:持久化数据
  4. 网络:容器间通信
  5. 最佳实践:优化镜像大小和安全性

参考资料