创建数据库 Docker 镜像是一个常见的需求,以下是详细的步骤和最佳实践:
大多数情况下,直接使用官方数据库镜像是最佳选择:
# MySQL 示例
FROM mysql:8.0
# 设置环境变量
ENV MYSQL_ROOT_PASSWORD=my-secret-pw
ENV MYSQL_DATABASE=myapp
ENV MYSQL_USER=user
ENV MYSQL_PASSWORD=password
# 初始化脚本
COPY ./init.sql /docker-entrypoint-initdb.d/
如果需要完全自定义,可以基于官方镜像扩展:
FROM postgres:13
# 安装额外工具
RUN apt-get update && apt-get install -y \
postgresql-contrib \
&& rm -rf /var/lib/apt/lists/*
# 添加自定义配置
COPY postgresql.conf /etc/postgresql/
COPY pg_hba.conf /etc/postgresql/
# 初始化脚本
COPY init.sql /docker-entrypoint-initdb.d/
# 暴露端口
EXPOSE 5432
# 设置数据卷
VOLUME /var/lib/postgresql/data
数据持久化:使用卷或绑定挂载来持久化数据
docker run -d -v /path/on/host:/var/lib/mysql mysql:8.0
环境变量配置:使用环境变量而非硬编码配置
ENV POSTGRES_USER=admin
ENV POSTGRES_PASSWORD=secret
初始化脚本:将初始化SQL放在/docker-entrypoint-initdb.d/
目录下
健康检查:添加健康检查确保服务可用
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD pg_isready -U postgres || exit 1
多阶段构建:如果需要复杂初始化
FROM alpine AS builder
RUN apk add --no-cache postgresql-client
RUN pg_dump -h old-server -U user dbname > backup.sql
FROM postgres:13
COPY --from=builder /backup.sql /docker-entrypoint-initdb.d/
FROM mysql:8.0
ENV MYSQL_ROOT_PASSWORD=rootpass
COPY my.cnf /etc/mysql/conf.d/
FROM postgres:13
ENV POSTGRES_USER=admin
ENV POSTGRES_PASSWORD=secret
COPY init.sql /docker-entrypoint-initdb.d/
FROM mongo:5.0
COPY mongod.conf /etc/mongod.conf
COPY init.js /docker-entrypoint-initdb.d/
FROM redis:6.2
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
构建镜像:
docker build -t my-database .
运行容器:
docker run -d --name my-db \
-p 3306:3306 \
-v db_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
my-database
使用Docker Compose(推荐):
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: appdb
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
volumes:
db_data:
通过以上方法,您可以创建适合您应用需求的数据库Docker镜像。