用Dockerfile生成docker-compose.yaml文件
根据使用 Docker 创建的包含 nginx 和 php-fpm 环境的 Dockerfile,创建 docker-compose.yaml 文件,使得可以使用 docker-compose 命令生成和启动容器的 Docker 图像。
流程
-
- 创建docker-compose.yaml文件
-
- 修改nginx和php-fpm的Dockerfile设置
-
- 使用docker-compose启动两个镜像
-
- 确认连接到容器
- 停止并删除容器
创建 docker-compose.yaml 文件
$ pwd
$HOME/works/docker-sample/php-tcp
$ touch docker-compose.yaml
$ vim docker-compose.yaml
$ cat docker-compose.yaml
docker-compose.yaml 的配置内容如下。
version: '3'
services:
php-sample:
restart: always
build:
context: .
dockerfile: ./php/Dockerfile
nginx-sample:
restart: always
ports:
- 80:80
build:
context: .
dockerfile: ./nginx/Dockerfile
修改nginx和php-fpm的Dockerfile配置。
如果继续使用docker-compose命令创建容器,将在读取nginx和php-fpm镜像的配置文件时出现错误,因此需要对两个Dockerfile进行修改。
php-fpm的Dockerfile
在进行更改之前,制作原件的副本,并保证能够清楚地看出更改的内容。
$ cp php/Dockerfile php/Dockerfile.orig
$ vim php/Dockerfile
$ diff -uw php/Dockerfile.orig php/Dockerfile
下面是更改的内容。
(行首的(-)表示更改前的描述。行首的(+)表示更改后的描述)
--- php/Dockerfile.orig 2022-03-27 13:43:21.000000000 +0900
+++ php/Dockerfile 2022-03-27 13:43:50.000000000 +0900
@@ -1,5 +1,5 @@
FROM php:8.1.4-fpm-alpine
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
-COPY settings/php.ini /usr/local/etc/php/conf.d/php.ini
-COPY src /usr/share/nginx/html
+COPY php/settings/php.ini /usr/local/etc/php/conf.d/php.ini
+COPY php/src /usr/share/nginx/html
当从 Dockerfile 引用相对路径时,已将其更改为从 docker-compose.yaml 引用的相对路径。
nginx 的 Dockerfile
$ cp nginx/Dockerfile nginx/Dockerfile.orig
$ vim nginx/Dockerfile
$ diff -uw nginx/Dockerfile.orig nginx/Dockerfile
nginx的Dockerfile更改如下所示。
$ diff -uw nginx/Dockerfile.orig nginx/Dockerfile
--- nginx/Dockerfile.orig 2022-03-27 13:44:42.000000000 +0900
+++ nginx/Dockerfile 2022-03-27 13:45:20.000000000 +0900
@@ -1,3 +1,3 @@
FROM nginx:1.21.6-alpine
-COPY settings/default.conf /etc/nginx/conf.d/default.conf
+COPY nginx/settings/default.conf /etc/nginx/conf.d/default.conf
使用docker-compose启动两个镜像
$ docker-compose up -d --build
Creating network "php-tcp_default" with the default driver
Building php-sample
...
Creating php-tcp_nginx-sample_1 ... done
Creating php-tcp_php-sample_1 ... done
当使用docker-compose启动容器时,会执行”Creating network “php-tcp_default” with the default driver”命令,并自动为我们创建临时网络。
确认与容器的连接
确认容器的启动,并尝试连接到 Nginx。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4fc4a4e62ee php-tcp_nginx-sample "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp php-tcp_nginx-sample_1
1f6bbef6b036 php-tcp_php-sample "docker-php-entrypoi…" 2 minutes ago Up 2 minutes 9000/tcp php-tcp_php-sample_1
$ curl -I -s localhost:80
HTTP/1.1 200 OK
Server: nginx/1.21.6
Date: Sun, 27 Mar 2022 08:27:17 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/8.1.4
通过WEB浏览器访问 http://localhost/ ,确认是否显示了 phpinfo() 的执行结果。
停止并删除容器
$ docker-compose down
Stopping php-tcp_nginx-sample_1 ... done
Stopping php-tcp_php-sample_1 ... done
Removing php-tcp_nginx-sample_1 ... done
Removing php-tcp_php-sample_1 ... done
Removing network php-tcp_default
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES