2017-08-10 16 views
2

如何在單獨的NGINX和PHP-FPM容器之間提供容器化PHP應用程序的代碼,其圖像基於busybox並且僅包含代碼?我使用docker撰寫的第三個版本。Docker - 將代碼交付給nginx和php-fpm

包含代碼圖像的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 

的搬運工-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容器中使用應用程序容器中的音量,但是撰寫v3不允許(volume_from指令)。無法使用它。

2)將代碼放入一個已命名的卷並將其連接到容器。以這種方式,我不能容器代碼。無法使用。 (我還必須在羣中的每個節點上手動創建該卷)

3)將代碼直接複製到基於NGINX和PHP-FPM的圖像兩次。壞主意,我必須保持他們的一致性。

卡住了。任何其他選項?我可能誤解了一些東西,只能從Docker開始。

+0

奧凱以及我的第一個可能的解決方案是服務於多服務搬運工容器使用綁定安裝進行開發並將文件(通過Dockerfile指令)複製到用於生產的php圖像中,並創建一個暴露這些文件的卷。然後,我將通過使用命名卷的docker-compose.yml與nginx容器共享此卷。不知道它是否會運行,但至少文檔證實:https://docs.docker.com/engine/admin/volumes/#tips-for-using-bind-mounts-or-volumes – Sergey

回答

0

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

(1)使用多克 - 撰寫:(這是非常簡單的開發ENV)

你將不得不從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
+0

爲什麼使用docker將php-fpm容器中的代碼組裝到nginx容器中是爲了簡化開發環境?我正準備在製作中使用這個功能(儘管使用疊代而不是合成)。 – Sergey

+0

請仔細檢查...您需要找到一種方法來將代碼從app容器提供給web容器(應用容器應完全密封)。通過上面的代碼,您可以創建一個可從主機(運行Docker容器)訪問的卷。因此,任何有權訪問主機的人都可以修改代碼,然後應用程序也會在容器內受到影響。此外,這種機制是使用碼頭集裝箱鏈接...我認爲爲了將來你的應用程序...你應該使用碼頭網絡...如果可能的話可能使用最新版本的docker-compose語法。 – Andy

+0

我不打算從主機上掛載代碼,如果你的意思是這樣的話,那只是爲了開發。該代碼將被複制到應用程序圖像進行生產,並以只讀模式暴露給Web容器。雖然我不確定這是否可行,是否需要棄用鏈接。或者,我可以將代碼複製到應用程序和Web圖像中,但這是太多的維護。碼頭網絡如何幫助我共享容器之間的代碼? – Sergey