Docker進階使用1

YatHo發表於2017-06-15

容器間共享檔案

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 來構建需要多個容器配合的應用,例如 wordpressdjango 等,通常我們要建立一個 Web 應用,是離不開資料庫,快取,web 系統本身等多個服務支撐,Docker Compose 可以幫助我們更好地使用多個容器來建立和管理複雜的系統。

相關文章