mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-10 11:54:37 +00:00
@@ -1,10 +1,10 @@
|
||||
## 多阶段构建
|
||||
# 多阶段构建
|
||||
|
||||
### 之前的做法
|
||||
## 之前的做法
|
||||
|
||||
在 Docker 17.05 版本之前,我们构建 Docker 镜像时,通常会采用两种方式:
|
||||
|
||||
#### 全部放入一个 Dockerfile
|
||||
### 全部放入一个 Dockerfile
|
||||
|
||||
一种方式是将所有的构建过程编包含在一个 `Dockerfile` 中,包括项目及其依赖库的编译、测试、打包等流程,这里可能会带来的一些问题:
|
||||
|
||||
@@ -50,7 +50,7 @@ CMD ["./app"]
|
||||
$ docker build -t go/helloworld:1 -f Dockerfile.one .
|
||||
```
|
||||
|
||||
#### 分散到多个 Dockerfile
|
||||
### 分散到多个 Dockerfile
|
||||
|
||||
另一种方式,就是我们事先在一个 `Dockerfile` 将项目及其依赖库编译测试打包好后,再将其拷贝到运行环境中,这种方式需要我们编写两个 `Dockerfile` 和一些编译脚本才能将其两个阶段自动整合起来,这种方式虽然可以很好地规避第一种方式存在的风险,但明显部署过程较复杂。
|
||||
|
||||
@@ -119,7 +119,7 @@ go/helloworld 2 f7cf3465432c 22 seconds ago 6.47MB
|
||||
go/helloworld 1 f55d3e16affc 2 minutes ago 295MB
|
||||
```
|
||||
|
||||
### 使用多阶段构建
|
||||
## 使用多阶段构建
|
||||
|
||||
为解决以上问题,Docker v17.05 开始支持多阶段构建 (`multistage builds`)。使用多阶段构建我们就可以很容易解决前面提到的问题,并且只需要编写一个 `Dockerfile`:
|
||||
|
||||
@@ -168,7 +168,7 @@ go/helloworld 1 f55d3e16affc 2 minutes ago 295MB
|
||||
|
||||
很明显使用多阶段构建的镜像体积小,同时也完美解决了上边提到的问题。
|
||||
|
||||
#### 只构建某一阶段的镜像
|
||||
### 只构建某一阶段的镜像
|
||||
|
||||
我们可以使用 `as` 来为某一阶段命名,例如
|
||||
|
||||
@@ -182,7 +182,7 @@ FROM golang:1.9-alpine as builder
|
||||
$ docker build --target builder -t username/imagename:tag .
|
||||
```
|
||||
|
||||
#### 构建时从其他镜像复制文件
|
||||
### 构建时从其他镜像复制文件
|
||||
|
||||
上面例子中我们使用 `COPY --from=0 /go/src/github.com/go/helloworld/app .` 从上一阶段的镜像中复制文件,我们也可以复制任意镜像中的文件。
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
## 实战多阶段构建 Laravel 镜像
|
||||
# 实战多阶段构建 Laravel 镜像
|
||||
|
||||
> 本节适用于 PHP 开发者阅读。
|
||||
|
||||
### 准备
|
||||
## 准备
|
||||
|
||||
新建一个 `Laravel` 项目或在已有的 `Laravel` 项目根目录下新建 `Dockerfile` `.dockerignore` `laravel.conf` 文件。
|
||||
|
||||
@@ -46,7 +46,7 @@ server {
|
||||
}
|
||||
```
|
||||
|
||||
### 前端构建
|
||||
## 前端构建
|
||||
|
||||
第一阶段进行前端构建。
|
||||
|
||||
@@ -65,7 +65,7 @@ RUN cd /app \
|
||||
&& npm run production
|
||||
```
|
||||
|
||||
### 安装 Composer 依赖
|
||||
## 安装 Composer 依赖
|
||||
|
||||
第二阶段安装 Composer 依赖。
|
||||
|
||||
@@ -85,7 +85,7 @@ RUN cd /app \
|
||||
--prefer-dist
|
||||
```
|
||||
|
||||
### 整合以上阶段所生成的文件
|
||||
## 整合以上阶段所生成的文件
|
||||
|
||||
第三阶段对以上阶段生成的文件进行整合。
|
||||
|
||||
@@ -111,7 +111,7 @@ RUN cd ${LARAVEL_PATH} \
|
||||
&& chmod -R 777 storage
|
||||
```
|
||||
|
||||
### 最后一个阶段构建 NGINX 镜像
|
||||
## 最后一个阶段构建 NGINX 镜像
|
||||
|
||||
```docker
|
||||
FROM nginx:alpine as nginx
|
||||
@@ -122,7 +122,7 @@ COPY laravel.conf /etc/nginx/conf.d/
|
||||
COPY --from=laravel ${LARAVEL_PATH}/public ${LARAVEL_PATH}/public
|
||||
```
|
||||
|
||||
### 构建 Laravel 及 Nginx 镜像
|
||||
## 构建 Laravel 及 Nginx 镜像
|
||||
|
||||
使用 `docker build` 命令构建镜像。
|
||||
|
||||
@@ -132,7 +132,7 @@ $ docker build -t my/laravel --target=laravel .
|
||||
$ docker build -t my/nginx --target=nginx .
|
||||
```
|
||||
|
||||
### 启动容器并测试
|
||||
## 启动容器并测试
|
||||
|
||||
新建 Docker 网络
|
||||
|
||||
@@ -156,11 +156,11 @@ $ docker run -it --rm --network=laravel -p 8080:80 my/nginx
|
||||
|
||||
> 也许 Laravel 项目依赖其他外部服务,例如 redis、MySQL,请自行启动这些服务之后再进行测试,本小节不再赘述。
|
||||
|
||||
### 生产环境优化
|
||||
## 生产环境优化
|
||||
|
||||
本小节内容为了方便测试,将配置文件直接放到了镜像中,实际在使用时 **建议** 将配置文件作为 `config` 或 `secret` 挂载到容器中,请读者自行学习 `Swarm mode` 或 `Kubernetes` 的相关内容。
|
||||
|
||||
### 附录
|
||||
## 附录
|
||||
|
||||
完整的 `Dockerfile` 文件如下。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user