在这个例子中,我们将使用Docker的"(命名)卷 "选项来保存我们的应用程序文件/数据。与生产环境中的 "绑定(共享)卷 "相比,这个选项提供了更好的安全性。欲了解更多详情,请阅读Docker中的数据管理页面。由于我们没有使用 "bind(shared) volumes"(这通常在开发环境中使用),我们将把应用程序代码复制到我们的 "数据容器 "my_app 。然后PHP-FPM和Nginx容器将使用这个容器来访问应用程序的数据。
注意事项
当你把你的代码部署到生产环境时,你对你的应用程序代码所做的改变将无法使用,除非你给你的卷指定一个不同的名字。例如,如果它以前被命名为app_code_volume_1 ,那么下次应该是类似于app_code_volume_2 。
结构
├── docker
│ ├── docker-compose.yml
│ ├── Makefile
│ ├── nginx
│ │ ├── app.conf
│ │ ├── Dockerfile
│ │ └── nginx.conf
│ ├── php
│ │ ├── Dockerfile
│ │ └── www.conf
│ └── source
│ └── Dockerfile
├── index.php
└── Readme.md
文件
docker/nginx/app.conf
server {
listen 80 default_server;
server_name localhost;
root /app;
index index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass my_php:9000;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
error_log /var/log/nginx/app_error.log;
access_log /var/log/nginx/app_access.log;
}
docker/nginx/Dockerfile
FROM nginx:1.15.8-alpine
COPY app.conf /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf
WORKDIR /app
docker/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
docker/php/Dockerfile
FROM php:7.2.13-fpm-alpine3.8
COPY www.conf /usr/local/etc/php-fpm.d/www.conf
WORKDIR /app
CMD ["php-fpm", "--nodaemonize"]
docker/php/www.conf
[global]
daemonize=no
[www]
user=www-data
group=www-data
listen=my_nginx:9000
pm=dynamic
pm.max_children=40
pm.start_servers=2
pm.min_spare_servers=2
pm.max_spare_servers=4
pm.max_requests=500
docker/source/Dockerfile
FROM tianon/true
COPY . /app
docker/docker-compose.yml
version: "3.4"
services:
my_app:
build:
context: ".."
dockerfile: "docker/source/Dockerfile"
volumes:
- "app_code:/app"
my_php:
build:
context: "./php"
hostname: "my-php"
volumes:
- "app_code:/app"
depends_on:
- "my_app"
environment:
PS1: "\\u@\\h:\\w\\$$ "
my_nginx:
build:
context: "./nginx"
hostname: "my-nginx"
ports:
- "4080:80"
volumes:
- "app_code:/app"
depends_on:
- "my_php"
environment:
PS1: "\\u@\\h:\\w\\$$ "
volumes:
app_code:
name: "app_code_volume"
index.php
echo 'UP';
构建
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker_my_app latest fa430e0dd199 21 minutes ago 48.6kB
docker_my_php latest 642a68c15625 22 minutes ago 77.7MB
docker_my_nginx latest 9ac2a0cd6fb0 22 minutes ago 16.1MB
tianon/true latest 183cb5fd5414 7 months ago 125B
docker_my_app_1 容器将永远不会运行,所以不要对它感到兴奋!
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1327e7c84fa docker_my_nginx "nginx -g 'daemon of…" 22 minutes ago Up 22 minutes 0.0.0.0:4080->80/tcp docker_my_nginx_1
97a336f95a6b docker_my_php "docker-php-entrypoi…" 22 minutes ago Up 22 minutes 9000/tcp docker_my_php_1
2117d5b517ea docker_my_app "/true" 22 minutes ago Exited (0) 22 minutes ago docker_my_app_1
$ docker inspect app_code_volume
[
{
"CreatedAt": "2019-05-23T20:36:01+01:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "docker",
"com.docker.compose.version": "1.21.2",
"com.docker.compose.volume": "app_code_volume"
},
"Mountpoint": "/var/lib/docker/volumes/app_code_volume/_data",
"Name": "app_code_volume",
"Options": null,
"Scope": "local"
}
]
$ sudo ls -l /var/lib/docker/volumes/app_code_volume/_data
total 12
drwxr-xr-x 5 root root 4096 May 23 20:36 docker
-rw-r--r-- 1 root root 18 May 22 22:49 index.php
-rw-r--r-- 1 root root 124 May 23 19:27 Readme.md
测试
$ curl -i 0.0.0.0:4080
HTTP/1.1 200 OK
Server: nginx/1.15.8
Date: Thu, 23 May 2019 19:39:08 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/7.2.13
UP
如你所知,我们把应用程序的数据复制到我们的数据容器中,但它们仍然可以在PHP-FPM和Nginx容器中访问。请看下面:
$ docker exec -it docker_my_php_1 ls -l
total 12
-rw-r--r-- 1 root root 124 May 23 18:27 Readme.md
drwxr-xr-x 5 root root 4096 May 23 19:36 docker
-rw-r--r-- 1 root root 18 May 22 21:49 index.php
$ docker exec -it docker_my_nginx_1 ls -l
total 12
-rw-r--r-- 1 root root 124 May 23 18:27 Readme.md
drwxr-xr-x 5 root root 4096 May 23 19:36 docker
-rw-r--r-- 1 root root 18 May 22 21:49 index.php