Docker — 从入门到实践
  • 前言
  • 修订记录
  • 如何贡献
  • Docker 简介
    • 什么是 Docker
    • 为什么要用 Docker
  • 基本概念
    • 镜像
    • 容器
    • 仓库
  • 安装 Docker
    • Ubuntu
    • Debian
    • Fedora
    • CentOS
    • Raspberry Pi
    • macOS
    • Windows 10
    • 镜像加速器
    • 开启实验特性
  • 使用镜像
    • 获取镜像
    • 列出镜像
    • 删除本地镜像
    • 利用 commit 理解镜像构成
    • 使用 Dockerfile 定制镜像
    • Dockerfile 指令详解
      • COPY 复制文件
      • ADD 更高级的复制文件
      • CMD 容器启动命令
      • ENTRYPOINT 入口点
      • ENV 设置环境变量
      • ARG 构建参数
      • VOLUME 定义匿名卷
      • EXPOSE 暴露端口
      • WORKDIR 指定工作目录
      • USER 指定当前用户
      • HEALTHCHECK 健康检查
      • ONBUILD 为他人作嫁衣裳
      • 参考文档
    • Dockerfile 多阶段构建
      • 实战多阶段构建 Laravel 镜像
    • 构建多种系统架构支持的 Docker 镜像
    • 其它制作镜像的方式
    • 实现原理
  • 操作容器
    • 启动
    • 守护态运行
    • 终止
    • 进入容器
    • 导出和导入
    • 删除
  • 访问仓库
    • Docker Hub
    • 私有仓库
    • 私有仓库高级配置
    • Nexus 3
  • 数据管理
    • 数据卷
    • 挂载主机目录
  • 使用网络
    • 外部访问容器
    • 容器互联
    • 配置 DNS
  • 高级网络配置
    • 快速配置指南
    • 容器访问控制
    • 端口映射实现
    • 配置 docker0 网桥
    • 自定义网桥
    • 工具和示例
    • 编辑网络配置文件
    • 实例:创建一个点到点连接
  • Docker Buildx
    • BuildKit
    • 使用 buildx 构建镜像
    • 使用 buildx 构建多种系统架构支持的 Docker 镜像
  • Docker Compose
    • 简介
    • 安装与卸载
    • 使用
    • 命令说明
    • Compose 模板文件
    • 实战 Django
    • 实战 Rails
    • 实战 WordPress
  • Swarm mode
    • 基本概念
    • 创建 Swarm 集群
    • 部署服务
    • 使用 compose 文件
    • 管理密钥
    • 管理配置信息
    • 滚动升级
  • 安全
    • 内核命名空间
    • 控制组
    • 服务端防护
    • 内核能力机制
    • 其它安全特性
    • 总结
  • 底层实现
    • 基本架构
    • 命名空间
    • 控制组
    • 联合文件系统
    • 容器格式
    • 网络
  • Etcd 项目
    • 简介
    • 安装
    • 集群
    • 使用 etcdctl
  • CoreOS 项目
    • 简介
    • 工具
  • Kubernetes - 开源容器编排引擎
    • 简介
    • 基本概念
    • 架构设计
  • 部署 Kubernetes
    • 使用 kubeadm 部署 kubernetes
    • 在 Docker Desktop 使用
    • 一步步部署 kubernetes 集群
  • Kubernetes 命令行 kubectl
  • 容器与云计算
    • 简介
    • 腾讯云
    • 阿里云
    • 亚马逊云
    • 小结
  • 实战案例 - 操作系统
    • Busybox
    • Alpine
    • Debian Ubuntu
    • CentOS Fedora
    • 本章小结
  • 实战案例 - CI/CD
    • GitHub Actions
    • Drone
      • 部署 Drone
    • Travis CI
  • 在 IDE 中使用 Docker
    • VS Code
  • Docker 开源项目
    • LinuxKit
  • podman -- 下一代 Linux 容器工具
  • 附录
    • 附录一:常见问题总结
    • 附录二:热门镜像介绍
      • Ubuntu
      • CentOS
      • Nginx
      • PHP
      • Node.js
      • MySQL
      • WordPress
      • MongoDB
      • Redis
    • 附录三:Docker 命令查询
      • 客户端命令 (docker)
      • 服务端命令 (dockerd)
    • 附录四:Dockerfile 最佳实践
    • 附录五:如何调试 Docker
    • 附录六:资源链接
  • 归档
    • Mesos - 优秀的集群资源调度平台
      • Mesos 简介
      • 安装与使用
      • 原理与架构
      • Mesos 配置项解析
      • 日志与监控
      • 常见应用框架
      • 本章小结
    • Docker Machine
      • 安装
      • 使用
    • Docker Swarm
Powered by GitBook
On this page
  • 准备
  • 前端构建
  • 安装 Composer 依赖
  • 整合以上阶段所生成的文件
  • 最后一个阶段构建 NGINX 镜像
  • 构建 Laravel 及 Nginx 镜像
  • 启动容器并测试
  • 生产环境优化
  • 附录

Was this helpful?

  1. 使用镜像
  2. Dockerfile 多阶段构建

实战多阶段构建 Laravel 镜像

本节适用于 PHP 开发者阅读。

准备

新建一个 Laravel 项目或在已有的 Laravel 项目根目录下新建 Dockerfile .dockerignore laravel.conf 文件。

在 .dockerignore 文件中写入以下内容。

.idea/
.git/
vendor/
node_modules/
public/js/
public/css/
yarn-error.log

bootstrap/cache/*
storage/

# 自行添加其他需要排除的文件,例如 .env.* 文件

在 laravel.conf 文件中写入 nginx 配置。

server {
  listen 80 default_server;
  root /app/laravel/public;
  index index.php index.html;

  location / {
      try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ .*\.php(\/.*)*$ {
    fastcgi_pass   laravel:9000;
    include        fastcgi.conf;

    # fastcgi_connect_timeout 300;
    # fastcgi_send_timeout 300;
    # fastcgi_read_timeout 300;
  }
}

前端构建

第一阶段进行前端构建。

FROM node:alpine as frontend

COPY package.json /app/

RUN cd /app \
      && npm install --registry=https://registry.npm.taobao.org

COPY webpack.mix.js /app/
COPY resources/assets/ /app/resources/assets/

RUN cd /app \
      && npm run production

安装 Composer 依赖

第二阶段安装 Composer 依赖。

FROM composer as composer

COPY database/ /app/database/
COPY composer.json composer.lock /app/

RUN cd /app \
      && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
      && composer install \
           --ignore-platform-reqs \
           --no-interaction \
           --no-plugins \
           --no-scripts \
           --prefer-dist

整合以上阶段所生成的文件

第三阶段对以上阶段生成的文件进行整合。

FROM php:7.2-fpm-alpine as laravel

ARG LARAVEL_PATH=/app/laravel

COPY --from=composer /app/vendor/ ${LARAVEL_PATH}/vendor/
COPY . ${LARAVEL_PATH}
COPY --from=frontend /app/public/js/ ${LARAVEL_PATH}/public/js/
COPY --from=frontend /app/public/css/ ${LARAVEL_PATH}/public/css/
COPY --from=frontend /app/mix-manifest.json ${LARAVEL_PATH}/mix-manifest.json

RUN cd ${LARAVEL_PATH} \
      && php artisan package:discover \
      && mkdir -p storage \
      && mkdir -p storage/framework/cache \
      && mkdir -p storage/framework/sessions \
      && mkdir -p storage/framework/testing \
      && mkdir -p storage/framework/views \
      && mkdir -p storage/logs \
      && chmod -R 777 storage

最后一个阶段构建 NGINX 镜像

FROM nginx:alpine as nginx

ARG LARAVEL_PATH=/app/laravel

COPY laravel.conf /etc/nginx/conf.d/
COPY --from=laravel ${LARAVEL_PATH}/public ${LARAVEL_PATH}/public

构建 Laravel 及 Nginx 镜像

使用 docker build 命令构建镜像。

$ docker build -t my/laravel --target=laravel .

$ docker build -t my/nginx --target=nginx .

启动容器并测试

新建 Docker 网络

$ docker network create laravel

启动 laravel 容器, --name=laravel 参数设定的名字必须与 nginx 配置文件中的 fastcgi_pass laravel:9000; 一致

$ docker run -it --rm --name=laravel --network=laravel my/laravel

启动 nginx 容器

$ docker run -it --rm --network=laravel -p 8080:80 my/nginx

浏览器访问 127.0.0.1:8080 可以看到 Laravel 项目首页。

也许 Laravel 项目依赖其他外部服务,例如 redis、MySQL,请自行启动这些服务之后再进行测试,本小节不再赘述。

生产环境优化

本小节内容为了方便测试,将配置文件直接放到了镜像中,实际在使用时 建议 将配置文件作为 config 或 secret 挂载到容器中,请读者自行学习 Swarm mode 或 Kubernetes 的相关内容。

附录

完整的 Dockerfile 文件如下。

FROM node:alpine as frontend

COPY package.json /app/

RUN cd /app \
      && npm install --registry=https://registry.npm.taobao.org

COPY webpack.mix.js /app/
COPY resources/assets/ /app/resources/assets/

RUN cd /app \
      && npm run production

FROM composer as composer

COPY database/ /app/database/
COPY composer.json /app/

RUN cd /app \
      && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
      && composer install \
           --ignore-platform-reqs \
           --no-interaction \
           --no-plugins \
           --no-scripts \
           --prefer-dist

FROM php:7.2-fpm-alpine as laravel

ARG LARAVEL_PATH=/app/laravel

COPY --from=composer /app/vendor/ ${LARAVEL_PATH}/vendor/
COPY . ${LARAVEL_PATH}
COPY --from=frontend /app/public/js/ ${LARAVEL_PATH}/public/js/
COPY --from=frontend /app/public/css/ ${LARAVEL_PATH}/public/css/
COPY --from=frontend /app/mix-manifest.json ${LARAVEL_PATH}/mix-manifest.json

RUN cd ${LARAVEL_PATH} \
      && php artisan package:discover \
      && mkdir -p storage \
      && mkdir -p storage/framework/cache \
      && mkdir -p storage/framework/sessions \
      && mkdir -p storage/framework/testing \
      && mkdir -p storage/framework/views \
      && mkdir -p storage/logs \
      && chmod -R 777 storage

FROM nginx:alpine as nginx

ARG LARAVEL_PATH=/app/laravel

COPY laravel.conf /etc/nginx/conf.d/
COPY --from=laravel ${LARAVEL_PATH}/public ${LARAVEL_PATH}/public
PreviousDockerfile 多阶段构建Next构建多种系统架构支持的 Docker 镜像

Last updated 5 years ago

Was this helpful?