容器間共享檔案
Docker 的容器和外部環境是相對隔離的,並且容器是一次性的,執行結束後並不會有任何的持久化的檔案或者資料。所以當我們需要做應用資料的持久化,或者保留應用的日誌檔案時,我們需要用到 Docker 提供的一些方法來把外部系統的目錄對映到容器的目錄,從而達到把我們需要的持久化資料存放在特定位置的目的。
對於 docker run
命令,我們可以使用 docker run -v [host-src]:[container-dest][:<options>]
來指定目錄的對映。其中,host-src
是系統目錄,container-dest
是要對映到的容器裡的目錄,options
是可選的配置選項,通常是許可權配置,例如 ro
只讀,或者 rw
可讀可寫等。
假設我們要把 /var/tmp
對映到容器中的 /var/tmp
,我們可以這麼做:
docker run -v /var/tmp:/var/tmp:rw -it ubuntu bash
更多的相關內容可以參考:mount volume
所以,你可以通過把一個系統目錄對映到多個容器中去,通過這種方式在系統和多個容器中共享檔案和目錄。
更加有趣的時,Docker 可以執行一個容器,然後使用 --link
來連線到現有執行的一個容器中,去獲取某些需要的資料或者檔案,例如 reliable-master 中用到資料匯出指令碼:mongo-dump.sh
建立一個自己的映象
建立一個目錄,然後新建一個 Dockerfile
檔案,Docker 在建立映象時要基於這個檔案的配置,我們看下這個檔案應該有哪些內容:
FROM: docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortune
CMD /usr/games/fortune -a | cowsay
FROM
表示即將建立的映象基於哪一個映象來建立,假設你要建立一個 node 應用的映象,那麼你可能是 FROM: node:latest
。
RUN
表示在建立映象時,執行後邊的命令來更新映象的相關內容,很多情況下是用於安裝你應用相關的依賴,所以 apt-get
用得很多。
CMD
,表示容器執行映象時預設執行的命令,當我們上邊這個映象建立後,使用 run 時,會在映象載入好了之後在容器環境中執行 /user/games/fortune -a | cowsay
。一個映象只能有一個 CMD
配置,如果有多個,預設是使用最後一個。
寫好 Dockerfile
檔案之後,在該目錄下執行 docker build -t docker-whale .
。
-t
用於指定映象的名稱,通常我們會使用 <組織名>/<應用名>
來作為映象名稱,可以參考 Docker Hub 上現有的映象。
接下來就可以看到 Docker 開始建立映象,結束之後,如果沒報錯資訊,那麼你可以使用 docker images
檢視到你剛才建立的映象。
現在很多的專案都會帶上 Dockerfile
檔案,例如 docker-node 等,所以你可以嘗試去了解這些專案的 Dockerfile
檔案,看看是如何構建映象的。
關於 Dockerfile
詳細的說明可以參考官網文件:Dockerfile reference。
由於 Docker 特殊的檔案分層以及容器建立的步驟,良好地編寫 Dockerfile
可以讓容器執行地更加高效,推薦這一篇文章 How to optimize your dockerfile。
使用 Docker Compose
Docker Compose 的安裝這裡不贅述了,根據官網文件很容易便可以安裝好:https://docs.docker.com/compose/install/
由於 Docker Compose 是一個很有用,並且相對常用的東西,所以在這簡單提及一下,Docker Compose 是可以把多個容器連線到一起統一管理的工具,我們先來看下是怎麼使用的。
可以看下官網提供的 Demo ,瞭解一下 Docker Compose 使用起來是怎麼樣的。
首先,我們需要建立一個 docker-compose.yml
檔案,例如官網給出的 wordpress 例子:
version: '2'
services:
web:
build: .
command: php -S 0.0.0.0:8000 -t /code/wordpress/
ports:
- "8000:8000"
depends_on:
- db
volumes:
- .:/code
db:
image: orchardup/mysql
environment:
MYSQL_DATABASE: wordpress
一個 docker-compose.yml
大致的內容如上,一個主要的服務名稱,然後便是這個這個服務對應的容器相關的配置,例如容器名稱,構建的目錄,埠對映,容器連線,對外的環境變數,目錄對映,執行命令等。整個配置檔案相對清晰易懂。
在這個檔案中,可以編寫多個服務的配置,然後在該目錄下執行 docker-compose up
便可以執行這個檔案配置的相關服務,而無須手動地一個個去啟動需要的容器,同時,這個配置檔案管理各個容器之間的關係也相對容易。更多詳細內容請參考官方文件 compose file。
官方提供了很多例子來說明如何使用 Docker Compose 來構建需要多個容器配合的應用,例如 wordpress,django 等,通常我們要建立一個 Web 應用,是離不開資料庫,快取,web 系統本身等多個服務支撐,Docker Compose 可以幫助我們更好地使用多個容器來建立和管理複雜的系統。