Docker容器化技术指南


Docker容器化技术指南

1. MySQL 容器化部署

1.1 快速启动命令

1
2
3
4
5
6
7
8
9
10
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=your_password \
-v /opt/mysql/conf:/etc/mysql/conf.d \
-v /opt/mysql/data:/var/lib/mysql \
mysql:8.0.34 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

1.2 参数解析

参数说明扩展知识
-p 3306:3306端口映射(宿主机:容器)使用-p 3306:3306/tcp指定协议
-e TZ=Asia/Shanghai时区设置支持IANA时区列表
--character-set-server字符集配置推荐使用utf8mb4支持完整Unicode

2. Docker 核心命令手册

2.1 镜像管理

镜像操作

1
2
3
4
5
docker pull ubuntu:22.04          # 拉取镜像
docker image ls # 查看镜像列表
docker image prune # 清理悬空镜像
docker save -o backup.tar nginx # 镜像打包
docker load -i backup.tar # 导入镜像

2.2 容器管理

生命周期管理

1
2
3
4
5
6
docker run -it --rm ubuntu bash    # 临时测试容器
docker start/stop/restart [容器] # 启停管理
docker rm $(docker ps -aq) # 批量删除容器
docker ps # 查看当前容器的运行状态
# 此时查看不到已经停止运行的容器,可以使用 -a 参数查看所有存在的容器
# 可以使用 docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Name}}"进行更美观的查看

信息查看

1
2
3
docker stats                      # 实时资源监控
docker inspect [容器] | grep IP # 查看容器IP
docker diff [容器] # 查看文件改动

2.3 运维命令

日志管理

1
2
docker logs -f --tail 100 [容器]  # 实时追踪日志
docker logs --since 10m [容器] # 查看最近10分钟日志

故障排查

1
2
docker exec -it mysql bash       # 进入容器终端(使用exit命令退出)
docker cp file.txt [容器]:/path # 宿主机与容器文件互传

Docker命令思维导图

3. 存储与数据卷

3.1 存储类型对比

类型特点适用场景
匿名卷自动创建随机命名临时测试
命名卷持久化存储,易管理数据库存储
绑定挂载直接映射宿主机目录配置文件管理

3.2 高级存储方案

使用只读卷(适合配置文件)

1
docker run -v /path/config:/etc/nginx:ro nginx

多容器共享数据卷

1
2
3
docker volume create app_data
docker run -v app_data:/data backend
docker run -v app_data:/data frontend

Docker存储方案

4. 镜像构建实践

Dockerfile是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。Docker可以根据Dockerfile帮我们构建镜像。

4.1 常见Dockerfile指令

指令说明示例
FROM指定基础镜像FROM centos:6
ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./jrell.tar.gz /tmp
RUN执行Linux的shell命令,一般是安装过程的命令RUN tar -zxvf /tmp/jrell.tar.gz && export PATH=/tmp/jrell:$PATH
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

4.2 推荐Dockerfile模板

多阶段构建示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# ==========================================================
# 第一阶段:构建阶段(用Maven打包Java应用)
# ==========================================================

# 使用包含Maven的官方镜像作为构建环境(版本3.8.6)
# 这个镜像包含JDK和Maven,适合用来编译Java项目
# AS build 给这个构建阶段命名为"build",方便后续引用
FROM maven:3.8.6 AS build

# 将本地项目的源代码复制到镜像的/app/src目录
# 注意:此处的src目录需要与Dockerfile所在目录结构一致
COPY src /app/src

# 复制项目的依赖配置文件(pom.xml)到镜像中
# pom.xml 是Maven项目的核心配置文件,包含项目依赖信息
COPY pom.xml /app

# 在镜像中执行Maven打包命令
# -f 指定pom.xml文件路径
# clean package 表示先清理旧构建再打包
# 这步会生成项目的jar包在target目录下
RUN mvn -f /app/pom.xml clean package

# ==========================================================
# 第二阶段:运行阶段(用JRE运行应用)
# ==========================================================

# 使用更轻量的Eclipse Temurin JRE镜像(仅包含Java运行环境)
# 相比JDK镜像,JRE镜像体积更小,更适合生产环境
FROM eclipse-temurin:17-jre

# 从之前的构建阶段(build)复制打包好的jar文件
# --from=build 表示从名为build的阶段获取文件
# 这里*jar通配符会自动找到target目录下的jar文件
COPY --from=build /app/target/*.jar /app.jar

# 声明容器运行时监听的端口(实际映射需要在运行容器时通过-p参数设置)
# 这只是文档说明作用,不是强制绑定
EXPOSE 8080

# 设置容器启动时执行的命令
# 这个特殊参数可以加速Tomcat等需要随机数的应用启动
# -Djava.security.egd=file:/dev/./urandom
# -jar /app.jar 表示运行我们复制的jar包
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]

4.3 构建优化技巧

  1. 使用.dockerignore文件排除无用文件
  2. 多阶段构建减小镜像体积(从3GB优化到300MB)
  3. 固定基础镜像版本(避免自动更新导致的不兼容)
  4. 非root用户运行(增强安全性):
1
2
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser

4.4 构建后运行常用命令

1
2
3
4
5
docker build -t testupd .                    # 构建容器镜像(在使用该命令时,需要在该jar包所在目录下,且有DockerFile文件)
docker run -d --name testudp -p 8081:8081/tcp testudp # 运行容器(可以指定使用tcp或者udp协议)
docker stop testudp # 停止运行容器
docker rm testudp # 删除容器
docker rmi testudp # 删除容器镜像

5. 生产环境最佳实践

5.1 容器编排建议

docker-compose.yml 示例

1
2
3
4
5
6
7
8
9
10
version: "3.8"
services:
mysql:
image: mysql:8.0.34
deploy:
resources:
limits:
memory: 2g
healthcheck:
test: mysqladmin ping -h 127.0.0.1 -u root

5.2 监控与日志

  • 日志驱动配置
1
docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3
  • 推荐监控工具
    • cAdvisor:容器资源监控
    • Prometheus + Grafana:可视化监控
    • ELK Stack:日志分析系统

附录:实用资源

  1. Docker 官方文档
  2. Dockerfile 最佳实践
  3. OCI 镜像规范
  4. 容器安全扫描工具

文章作者: 栖桐听雨声
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 栖桐听雨声 !
  目录