2017-02-22 142 views
2

我基於兩個不同的圖像創建了兩個碼頭集裝箱。一個數據庫和另一個Web服務器。這兩個容器都在我的mac osx上運行。從另一個容器訪問碼頭集裝箱

我可以從主機訪問db容器,並且可以從主機訪問web服務器。

但是,我如何從Web服務器訪問數據庫連接?

我開始分貝容器的方法是

搬運工運行--name Oracle的數據庫-p 1521:1521 -p 5501:5500的Oracle /數據庫:12.1.0.2-EE

我開始WLS容器作爲 搬運工運行--name甲骨文WLS -p 7001:7001 WLS-圖片:1521/ORCLCDB

:最新

我可以通過連接到 sqlplus的斯科特/ welcome1 @ //本地主機上的主機訪問分貝我可以通過訪問主機上的wlshttp://localhost:7001/console

+0

因此,Web容器和db容器都在主機上?如果是這樣,你使用哪個版本的docker?因爲Docker的老版本有一種方法,而新版本有不同的方式。你是否也能夠使用docker-compose?這將使它更容易,但我不想用你不能使用的方法給出答案。 – Caperneoignis

回答

1

最簡單的方法是使用--link,但是更新版本的docker正在遠離它,事實上那個開關很快就會被移除。

下面的鏈接也提供了一個很好的方法,連接兩個容器。你可以跳過附加部分,因爲這只是一個很有用的如何添加項目到圖像。

https://deis.com/blog/2016/connecting-docker-containers-1/

你感興趣的部分是兩個容器之間的通信。最簡單的方法是通過Web服務器容器中的名稱引用數據庫容器。

例子:

您指定的數據庫容器DB1和Web服務器容器WEB0。容器應該都在橋接網絡上,這意味着Web容器應該能夠通過引用它的名稱連接到DB容器。

因此,如果您的應用程序具有Web配置文件,那麼對於DB主機,您將使用名稱DB1。

如果您使用的是較舊版本的docker,那麼您應該使用--link。

例子:

第1步:

那麼當您啓動Web應用程序。用途:

第2步:docker run --name web0 --link db1 webapp/webapp:3.0

和Web應用程序將被鏈接到數據庫。但是,正如我所說的 - 鏈接開關很快就會被移除。

我會使用碼頭組合,而不是,這將爲您建立一個網絡。然而;您將需要下載docker爲您的系統撰寫。 https://docs.docker.com/compose/install/#prerequisites

和示例設置是這樣的:

文件名是base.yml

version: "2" services: webserver: image: "moodlehq/moodle-php-apache:7.1 depends_on: - db volumes: - "/var/www/html:/var/www/html" - "/home/some_user/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf" environment: MOODLE_DOCKER_DBTYPE: pgsql MOODLE_DOCKER_DBNAME: moodle MOODLE_DOCKER_DBUSER: moodle MOODLE_DOCKER_DBPASS: "[email protected]" HTTP_PROXY: "${HTTP_PROXY}" HTTPS_PROXY: "${HTTPS_PROXY}" NO_PROXY: "${NO_PROXY}" db: image: postgres:9 environment: POSTGRES_USER: moodle POSTGRES_PASSWORD: "[email protected]" POSTGRES_DB: moodle HTTP_PROXY: "${HTTP_PROXY}" HTTPS_PROXY: "${HTTPS_PROXY}" NO_PROXY: "${NO_PROXY}"

這將命名爲網絡的通用名稱,我不記得了頂我的請指出該名稱是什麼,除非使用--name開關。

IE docker-compose --name setup1 up base.yml

注:如果您使用--name開關,您將需要使用它的時候曾經叫搬運工撰寫,所以docker-compose --name setup1 down是這樣的話,你可以有網絡服務器和數據庫的一個以上的情況下,在這種情況下,docker compose知道你想要運行命令的實例是什麼;而且你也可以有更多的一次運行。非常適合CI/CD,如果您在同一臺服務器上並行運行測試。

碼頭工人組成也有相同的命令搬運工人所以 docker-compose --name setup1 exec webserver do_some_command

最好的部分是,如果你想改變分貝的或類似的東西進行單元測試,你可以包含一個額外的.yml文件到了命令它會覆蓋任何具有相似名稱的項目,我認爲它是一個關鍵=>值替換。

例如:

db.yml

version: "2" services: webserver: environment: MOODLE_DOCKER_DBTYPE: oci MOODLE_DOCKER_DBNAME: XE db: image: moodlehq/moodle-db-oracle

然後調用docker-compose --name setup1 up base.yml db.yml

這將覆蓋分貝。用不同的設置。當需要從每個容器連接到這些服務時,使用服務下的名稱集,在這種情況下,使用webserver和db。

我認爲這可能實際上是一個更有用的設置在你的情況。因爲您可以在yml文件中設置所需的所有變量,並在需要啓動時爲docker撰寫命令。所以更多的啓動它,並忘記它的設置。

注意:我沒有使用--port命令,因爲公開端口對於容器 - >容器通信不是必需的。僅當您希望主機連接到容器或來自主機外的應用程序時才需要它。如果公開該端口,則該端口對主機允許的所有通信開放。因此,在端口80上公開網頁與在物理主機上啓動網絡服務器相同,並允許外部連接(如果主機允許)。另外,如果您想要一次運行多個Web應用程序,出於任何原因,然後公開端口80將會阻止您運行其他Web應用程序,如果您也試圖暴露該端口。因此,對於CI/CD,最好不要公開ports,並且如果使用docker與--name開關組合,則所有容器都將位於其自己的網絡上,因此它們不會相互衝突。所以你幾乎有一個容器的容器。

2

您必須通過主機的IP來訪問數據庫,或者如果你想通過本地主機訪問它:1521,然後運行網絡服務器一樣 -

docker run --net=host --name oracle-wls wls-image:latest 

See here

+0

作爲主機IP的實際工作情況將如何根據運行的機器容器而發生變化。 – Vik

+1

只有當機器有靜態IP或DNS時纔有效,否則按第二種方法進行。 – xitter

+0

我似乎有問題。我的確切運行命令是:docker run --name ora-tools-wls -it -p 7001:7001 orawls 這個工程,讓我訪問我的服務器上運行的這個容器http:// localhost:7001/console 但是,從服務器訪問數據庫需要精確的IP才能到達另一個運行數據庫的容器。 如果我 搬運工運行--name去ORA-工具-WLS - 它-p 7001:7001 --network =「主機」 orawls 那麼服務器能夠與本地主機訪問數據庫的IP正如你所說,但訪問主機瀏覽器中的服務器失敗。 – Vik

相關問題