使用命名卷和数据容器与PHP-FPM和Nginx Docker容器共享应用数据(详细教程)

253 阅读2分钟

在这个例子中,我们将使用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