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