Docker 容器化部署实战

什么是 Docker

Docker 是一个开源的容器化平台,可以让开发者打包应用及其依赖到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。

Dockerfile 编写

PHP 应用 Dockerfile 示例

FROM php:8.0-fpm

# 安装依赖
RUN apt-get update && apt-get install -y 
    libpng-dev 
    libjpeg62-turbo-dev 
    libfreetype6-dev 
    libzip-dev 
    zip 
    unzip 
    git 
    && docker-php-ext-configure gd --with-freetype --with-jpeg 
    && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql zip opcache

# 安装 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 设置工作目录
WORKDIR /var/www

# 复制应用代码
COPY . /var/www

# 安装依赖
RUN composer install --no-dev --optimize-autoloader

# 设置权限
RUN chown -R www-data:www-data /var/www/storage

EXPOSE 9000
CMD ["php-fpm"]

Nginx Dockerfile 示例

FROM nginx:alpine

# 复制配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 复制静态文件
COPY --from=builder /var/www/public /var/www/public

EXPOSE 80

Docker Compose 配置

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: blog_app
    restart: unless-stopped
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - blog_network

  nginx:
    image: nginx:alpine
    container_name: blog_nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./docker/nginx:/etc/nginx/conf.d
    networks:
      - blog_network

  mysql:
    image: mysql:8.0
    container_name: blog_mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: blog
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_PASSWORD: secret
      MYSQL_USER: blog
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - blog_network

  redis:
    image: redis:alpine
    container_name: blog_redis
    restart: unless-stopped
    networks:
      - blog_network

networks:
  blog_network:
    driver: bridge

volumes:
  mysql_data:

常用 Docker 命令

# 构建镜像
docker build -t myapp:latest .

# 运行容器
docker run -d -p 80:80 --name myapp myapp:latest

# 查看运行中的容器
docker ps

# 查看日志
docker logs -f myapp

# 进入容器
docker exec -it myapp /bin/bash

# 停止容器
docker stop myapp

# 启动 Docker Compose
docker-compose up -d

# 停止 Docker Compose
docker-compose down

生产环境部署

使用 Docker Swarm

# 初始化 Swarm
docker swarm init

# 部署服务
docker stack deploy -c docker-compose.yml blog

# 查看服务
docker stack ps blog

# 扩容服务
docker service scale blog_app=3

总结

Docker 让应用部署变得简单高效。通过容器化,我们可以确保开发、测试和生产环境的一致性,大大减少了"在我机器上可以运行"的问题。