2014-07-11 60 views
14

我想運行託管簡單的Web應用程序的碼頭容器,但我不明白如何設計/運行圖像作爲服務器。例如:如何啓動碼頭容器作爲服務器

docker run -d -p 80:80 ubuntu:14.04 /bin/bash 

這將啓動並立即關閉容器。相反,我們可以交互式地啓動它:

docker run -i -p 80:80 ubuntu:14.04 /bin/bash 

這可以工作,但現在我必須爲運行的每個容器打開交互式shell?我寧願啓動它並讓它在後臺運行。一個黑客會使用不會返回命令:

docker run -d -p 80:80 {image} tail -F /var/log/kern.log 

但現在我無法連接到外殼了,檢查是怎麼回事,如果應用程序是演戲了。

有沒有辦法在後臺啓動容器(就像我們會爲虛擬機做的那樣),以允許從主機連接/分離shell的方式?或者我完全忽略了這一點?

+0

您可以從主機上掛載一個文件夾到/ var/log,以便輕鬆訪問容器的日誌:docker run -d -p 80:80 -v/tmp/log:/ var/log {image}/foregroundapp – jchysk

回答

19

docker run的最後一個參數是要在容器中運行的命令。當你運行docker run -d -p 80:80 ubuntu:14.04 /bin/bash時,你在容器中運行bash,僅此而已。實際上,您希望在容器中運行Web應用程序並保持該容器的活動狀態,因此您應該執行docker run -d -p 80:80 ubuntu:14.04 /path/to/yourapp

但是您的應用程序可能依賴於某些配置才能運行。如果它從環境變量中讀取其配置,則可以使用參數docker run-e key=value參數。如果您的應用程序需要一個配置文件,您應該首先使用Dockerfile來設置配置。

This article提供了一個很好的在容器中運行節點應用程序的完整示例。

+0

我認爲問題在於我的應用程序已經被deamonised(它使用來自ubuntu的標準apache2在容器中)。 – Jeroen

+0

啊,所以你只需要在前臺運行apache作爲你的命令。 –

+0

嗯,我有我所有的環境變量設置,並確保我的應用程序將運行您描述的方式。但是,如果我在運行docker容器時需要手動啓動我的應用程序,Dockerfile的意義何在。我想把所有的步驟放在docker文件中,並且只有我的映像用戶需要做的就是啓動它。 –

7

碼頭工的用戶傾向於假設一個容器是一個完整的虛擬機,而碼頭設計的概念更關注最佳容器化,而不是模擬容器內的虛擬機。

兩者都是正確的,但有些實現細節一開始並不容易熟悉。我試圖用一種更容易理解的方式總結一些實施差異。

  1. SSH

SSH是去一個Linux VM(或容器)內的最直接的方式,但安裝了SSH服務器的許多dockerized模板不具備的。我相信這是因爲容器優化&的安全原因。

  • 搬運工附上如果工作作爲外的現成
  • 搬運工連接是很方便的。然而至於寫作它並不穩定 - https://github.com/docker/docker/issues/8521。可能與SSH建立關聯,但不確定它何時完全修復。

    https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/

    由泊塢推薦

  • 搬運工推薦做法(nsenter和等)
  • 一些替代(或最佳做法在某種意義上)這一做法基本上分離從容器中取出可變元素並將它們映射到碼頭主機中的某些位置,以便它們可以從容器外部操作和/或保持。在生產環境中可能是一種很好的做法,但現在不是現在,當更多與碼頭相關的項目圍繞開發和分段環境時。

  • bash命令行
  • 「搬運工EXEC - 它{容器ID} bash的」 雲是非常方便的和實際的工具來獲得在機器。

  • 一些基本

    • 「搬運工運行」 創建一個新的容器中,使得先前的改變將不被保存。
    • 「docker start」將啓動一個現有容器,以便以前的更改仍將位於容器中,但是您需要在許多具有相同圖像標識的容器中找到正確的容器標識。如果需要,需要「docker commit」來壓縮版本。
    • Ctrl-C將退出時停止容器。您將在最後附加「&」,以便容器可以運行後臺並在按Enter鍵時提供提示。
  • 4

    原來的問題,你可以尾巴一些文件,比如你提到的,要保持進程運行。

    要達到的,而不是 「附加」 的殼,你有兩個選擇:

    1. docker exec -it <container_id> /bin/bash

    或者

  • 運行ssh守護進程在容器中,port將ssh和ssh映射到容器。
  • +0

    這不是我想要做的。當然,我可以登錄容器並運行我的服務器......但這不是我的目標。容器必須從我的服務器開始運行,不需要任何額外的步驟。每次啓動時我都不想登錄容器並啓動我的服務器。這應該是自動的。 –

    +0

    @StanSokolov看起來像你想知道的。服務器以容器作爲守護進程啓動。後來如果你想登錄到shell,你有上面兩個選項。 –

    +0

    你是對的。抱歉,是我的錯。 –

    相關問題