簡體   English   中英

Docker - 將代碼提供給nginx和php-fpm

[英]Docker - deliver the code to nginx and php-fpm

如何在單獨的NGINX和PHP-FPM容器之間提供容器化PHP應用程序的代碼,該應用程序的映像基於busybox並且僅包含代碼? 我使用第3版的docker compose。

包含代碼的圖像的Dockerfile將是:

FROM busybox

#the app's code
RUN mkdir /app

VOLUME /app

#copy the app's code from the context into the image
COPY code /app

docker-compose.yml文件將是:

version: "3"
services:
  #the application's code
  #the volume is currently mounted from the host machine, but the code will be copied over into the image statically for production
  app:
   image: app
   volumes:
    - ../../code/cms/storage:/storage
   networks:
    - backend

  #webserver
  web:
   image: web
   depends_on:
    - app
    - php
   networks:
    - frontend
    - backend
   ports:
    - '8080:80'
    - '8081:443'

  #php
  php:
   image: php:7-fpm
   depends_on:
    - app
   networks:
    - backend

networks:
 cms-frontend:
   driver: "bridge"
 cms-backend:
   driver: "bridge"

我想到的解決方案既不合適:

1)在PHP和NGINX容器中使用應用程序容器中的卷,但是comp3不允許它(volumes_from指令)。 不能用它。

2)將代碼放在指定的卷中並將其連接到容器。 這樣,我無法容納代碼。 不能用。 (我還必須在群中的每個節點上手動創建此卷?)

3)基於NGINX和PHP-FPM將代碼直接復制兩次到圖像中。 不好的想法,我必須讓他們保持一致。

堅持這個。 還有其他選擇嗎? 我可能誤解了一些東西,只從Docker開始。

我也一直在尋找解決類似的問題,而且當兩個服務在一個容器中運行以進行生產時,Nginx + PHP-FPM似乎是其中一個例外。 在開發中,您可以將項目文件夾綁定到nginx和php容器。 根據Bret Fisher的指南,php的默認值為: php-docker-good-defaults

到目前為止,Nginx + PHP-FPM組合是我建議使用多服務容器的唯一方案。 這是一個相當獨特的問題,並不總是適合“一個容器,一個服務”的模型。 您可以使用兩個單獨的容器,一個使用nginx,另一個使用php:fpm,但我在生產中嘗試過,並且有很多缺點。 PHP代碼的副本必須在每個容器中,它們必須通過TCP進行通信,這比單個容器中使用的Linux套接字要慢得多,並且因為它們之間通常有一對一的關系,所以個人服務控制是沒有實際意義的。

您可以在此處閱讀有關在docker頁面上設置多個服務容器的更多信息(它也在上面的鏈接中列出): Docker在容器中運行多個服務

我看到它的方式,你有兩個選擇:

(1)使用Docker-compose :(這是非常簡單的開發環境)

您將不得不從nginx和php-fpm圖像構建兩個單獨的容器。 然后只需在nginx上的web文件夾上從php-fpm提供app文件夾。

# The Application
  app:
    build:
      context: ./
      dockerfile: app.dev.dockerfile
    working_dir: /var/www
    volumes:
      - ./:/var/www
    expose:
      - 9000
  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dev.dockerfile
    working_dir: /var/www
    volumes_from:
      - app
    links:
       - app:app
    ports:
      - 80:80
      - 443:443

(2)使用單個Dockerfile構建其中的所有內容。

  • 從一些linux或php圖像開始
  • 安裝nginx
  • 構建自定義圖像
  • 並使用supervisord服務多服務docker容器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM