Docker入门实战:一小时学会容器化部署

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 myapp

Bind 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的学习曲线平缓,一小时足够上手基本操作。掌握了容器化部署以后,迁移服务器、横向扩容都变得极其简单。这是现代运维的第一关。

Last modification:July 12th, 2026 at 03:59 pm

Leave a Comment