Docker入门实战:一小时学会容器化部署
"在我机器上能跑"——这句话是开发者和运维之间永恒的争端来源。Docker的出现终结了这个问题。把应用和环境打包成一个标准化的容器镜像,在任何地方运行结果都一样。
1. Docker核心概念:镜像和容器
镜像:一个只读模板,包含了运行应用所需的全部文件和配置。相当于一个轻量级的虚拟机快照。
容器:镜像的运行实例。可以启动、停止、删除。同一个镜像可以同时运行多个容器,彼此隔离。
Dockerfile:构建镜像的配方,定义了镜像里有什么以及怎么构建。
Docker Hub:公共镜像仓库,类似GitHub之于代码。有数以百万计的预构建镜像可直接使用。
2. 第一个Dockerfile
以部署一个Typecho博客为例:
FROM php:8.2-fpm-alpine
# 安装系统依赖
RUN apk add --no-cache nginx mysql-client
# 安装PHP扩展
RUN docker-php-ext-install pdo_mysql mysqli
# 复制应用代码
COPY . /var/www/html/
# 暴露端口
EXPOSE 80
# 启动命令
CMD ["php-fpm"]在项目根目录执行:
docker build -t my-typecho:latest .
docker run -d -p 8080:80 my-typecho:latest访问localhost:8080就能看到你的博客了。
3. Docker Compose:编排多容器应用
实际项目通常需要多个服务协同工作。Typecho需要PHP-FPM + Nginx + MySQL,用Docker Compose编排:
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: typecho
volumes:
- db_data:/var/lib/mysql
app:
build: .
depends_on:
- db
volumes:
- ./:/var/www/html
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./:/var/www/html
depends_on:
- app
volumes:
db_data:docker compose up -d一键启动所有服务,docker compose down全部停止。
4. 数据持久化
容器重启后内部数据会丢失——这通常是你想要的(保证每次启动都是干净状态),但数据库文件需要持久化。
使用Volumes(推荐):
docker run -v mysql_data:/var/lib/mysql mysql:8.0或Bind Mounts(开发时方便):
docker run -v /host/path:/container/path myappBind mounts直接映射宿主机目录,修改代码后容器内即时生效,开发体验好。
5. 生产环境最佳实践
镜像精简:用alpine为基础镜像,每个RUN指令会创建一个层,把多个命令合并到一条RUN减少层数。多阶段构建只在最终镜像中保留运行时必需的文件。
健康检查:在Dockerfile中添加HEALTHCHECK指令,Docker定期检查容器健康状态,不健康时自动重启。
资源限制:docker run --memory=512m --cpus=1限制容器资源使用,防止单个容器耗尽服务器资源。
日志管理:应用输出到stdout/stderr,Docker自动收集。配合docker logs查看或用日志驱动发送到ELK/Loki。
安全:不要在镜像中硬编码密钥。用环境变量或Docker Secrets传递敏感信息。以非root用户运行容器进程。
Docker的学习曲线平缓,一小时足够上手基本操作。掌握了容器化部署以后,迁移服务器、横向扩容都变得极其简单。这是现代运维的第一关。