天天看點

docker如何建立一個運作背景程序的容器并同時提供shell終端

隻看标題還不是很明顯,本文實作docker的這樣一種比較常用的功能:通過<code>docker run</code>啟動一個容器後,容器中已經運作了一個背景程序(這裡以監聽80端口的nginx為例),同時進入一個shell終端可供操作,而不受限于隻能在前台運作nginx與運作shell終端之間的一種。這個例子實作了,那麼其他類似的運作多任務docker就可以以此類推。另外本文還提供了一種在docker容器内部安裝軟體(<code>vim</code>)的方法,對于定制自己需要的鏡像大有幫助。

使用官方image啟動一個容器,名字nginx_dist,把host的目錄(包含剛才的html)映射到容器中nginx server的root,綁定80端口:

此時通過浏覽器通路主機<code>http://host_ip:port/</code>就可以看到結果了:

docker如何建立一個運作背景程式的容器并同時提供shell終端

熟悉一下docker的指令。

這裡有個未解決的問題,能否有辦法在上面已經啟動的container的基礎上執行指令?官方沒有這樣的支援。

目前隻能重新啟動一個容器(停止上面的<code>nginx_dist</code>容器)

但此時nginx服務是停止的,并沒有在背景運作,通路<code>http://host_ip:port/</code>無效。為了後面編輯配置檔案友善,我們先把<code>vim</code>安裝好。

容器内部的網絡與容器外部是相同的,并與host具有相同的dns,是以可以使用公網軟體(<code>cat /etc/apt/sources.list</code>)鏡像源來安裝。

實作這一步的方法有許多種,比如

也就是用第4步的方法先啟動到<code>/bin/bash</code>,再手動運作<code>/usr/sbin/nginx -c /etc/nginx/nginx.conf</code>或<code>service nginx start</code>,很容易想到,但太麻煩。

将裝好vim的容器送出成新的image,然後通過<code>dockerfile</code>來自定義要啟動哪些服務。關于<code>dockerfile</code>後面我也會寫文章來單獨介紹其文法。

最後一條<code>docker run</code>之後就會自動進入<code>bash</code>終端,同時發現<code>nginx</code>服務也啟動了,可以通過<code>vim</code>來編輯配置檔案。

儲存後直接ctrl+d退出,在<code>start</code>就可以通路了,如果要進入終端就<code>attach</code>,如果需要可以<code>commit</code>成一個鏡像。

<a href="http://air.googol.im/2014/03/28/supervisor-with-docker-to-manage-processes.html" target="_blank">在docker裡使用(支援鏡像繼承的)supervisor管理程序</a>

從上面的操作中可以看出,<code>start</code>是可以保留<code>run</code>啟動時的參數如<code>-v</code>、<code>-p</code>,而<code>commit</code>之後如果沒在<code>dockerfile</code>中指定,下次啟動依然需要帶上目錄、端口的映射參數。

另外提一點, <code>docker run -i -t seanlook/nginx:bash_vim</code>啟動便會同時進入一個shell界面(但沒有啟動nginx),因為它的“前身”容器是在shell互動界面下<code>run</code>來的,但也沒有保留<code>-v</code>、<code>-p</code>指定的映射關系。

繼續閱讀