Docker環境建立 與小技巧 - Docker系列第2集

在Docker系列第一篇 Docker介紹 說明了Docker與基本的指令,這集則是介紹 Docker環境建立 ,包含container管理小技巧,以及常用的功能如port forwarding或是使用volumn及設置環境變數等。

1. Container管理小技巧

1.1 自動移除容器

只要使用docker run 啟動容器,就算該容器已經停止,容器仍然會存在,時間久了容器會很難管理

若每次測試後都要手動刪除容器十分麻煩,故可以在啟動時加入--rm的參數

docker run --rm -t -i ubuntu:14.04 /bin/echo 'Hello world'
 
執行完畢後再透過docker ps -a檢查,會發現該容器執行完畢後自動刪除了。

1.2 背景執行容器

以下是啟動一個Image為ubuntu:14.04的容器,並執行bash指令

docker run --rm -d -t -i --name test ubuntu:14.04 bash


透過-d的參數,讓docker在背景執行

透過--name test,將容器名稱設為test,方便後續容器的辨認與操作

-t -i參數可參考上篇文章 Docker介紹與基本指令說明

若要怎麼進到容器裡進行操作,則可以執行指令:

docker attach test


test為容器的名稱,執行之後就會進到容器內,可以發現執行指令後,進到了容器的操作介面CLI。

若要離開,則在CLI中,先按Ctrl + P,再按Ctrl + Q

若沒有在容器的CLI介面中但想看容器內的log,則可以使用:

docker logs test
 
若加上--folow或是-f指令,容器的log只要有更新,畫面就會更新。

1.3 強制移除容器

若容器狀態是Up時,必須先停止容器後再移除,倘若不想那麼麻煩,可以強制移除容器。

docker rm -f test
 

2. Docker環境建立

2.1 Port Forwarding

每個容器都有自己的port,Port Forwarding可以應用在任何有開port的Server,例如MySQL、Postgres、Redis等等。

若要讓host能夠連線到容器的port,必須在run容器時,另外用--publish或-p選項設定port forwarding,以下範例將host的8080 port轉接到該容器的80 port

docker run -d -p 8080:80 httpd
 

使用curl測試確認連線成功

curl http://localhost:8080
可以使用docker ps檢視,在PORTS欄位會顯示port forward的資訊
 

若再開啟一個容器也是8080:80,則會出現port is already allocated.的訊息,代表有Port衝突了。

2.2 Volumn

每個容器都是獨立的,使用docker run建議的容器,每次都會跟全新灌好的一樣

若需要讓每個容器都存取到同一個資料夾,需要使用Bind Mount,將host的資料夾或檔案,綁定到容器裡的某個資料夾或檔案,綁定後就能夠在容器中看到host的檔案。將下列指令替換成你電腦中的某個資料路徑

docker run -d -it -v ${path}:/usr/local/apache2/htdocs -p 8080:80 httpd
 
在host資料夾中新增一個test.html,隨意打些字
再使用 curl http://localhost:8080/test.html 即會顯示檔案的內容
 
即便刪除該容器再重新run一次,並綁定到同一個資料夾,仍會顯示一樣的內容,不管在host或是在容器內修改檔案,都會修改到host內的檔案。

2.3 Network

有了Docker後,開Server相當容易,但像是網頁的架構,需要網頁伺服器與後端連線,此時就須將兩個容器連結在一起,方法有兩種,可以使用--link參數,或是使用Network元件。

先run起web的容器,再使用busybox執行wegt指令連線到網站,其中使用的--link參數,可以給定web或是web:alias,alias是別名。

docker run -d -it --name web -p 8080:80 httpd
docker run --rm --link web:alias busybox wget -q -O - http://web/


另外值得需要注意的是,原本的網址localhost變為web,主因是容器名稱即為domain name,另外port號是docker內部連線,只需要使用容器內預設的80即可。

根據上面的範例,會發現--link的用法有先後順序的關係,若第一個建立的容器想連接到第二個容器,則建議使用Docker的Network用法

使用docker network建立一個my-net的網路,就可以透過網路直接使用容器的名稱連線

# Terminal 1
docker network create my-net
docker run --rm --name web -p 8080:80 --network my-net httpd
 
# Terminal 2
docker run --rm --network my-net busybox wget -q -O - web
 

2.4 環境變數

有一種情況,當我們要使用一個Image開啟很多容器時,每個容器需要不同的DB連線設定,可以用volume共享設定檔,但當容器一多會相當難管理,建議直接設定環境變數,使用-e或--environment選項。

docker run --rm busybox env
docker run --rm -e DB_HOST=mysql busybox env


可以執行這兩個指令比較一下輸出,其中busybox取得環境變數的指令是env,會發現第二個指令,在busybox的環境變數多了一行DB_HOST=mysql

這個-e選項可以給定多個,啟動percona容器,建立一個mysql的一個database叫做some,並設定ROOT的密碼為pass,這邊的兩個環境變數會在Docker Hub容器的文件中可以找到

# Terminal 1
docker run --rm -it --name db -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=some
# Terminal 2
docker run --rm -it --link db percona mysql -hdb -uroot -ppass
show databases;

 

3. 結論

謝謝各位讀者看到這裡,以上介紹了Docker的環境設定以及container管理小技巧,接下來的文章會再繼續透往 Docker實務應用 的方向邁進唷,敬請期待。

若你有任何覺得好用的套件或是任何建議,也歡迎您在下方留言告訴我以及分享給其他人唷

若你覺得文章對你很有幫助,歡迎在網頁右方填入你的email訂閱本站唷

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。