###### tags: `教學` `Docker` `volume` `學習筆記` # Docker and Container 008 - Compose [TOC] --- ## 1. Docker Compose >- 負責管理service(container)、network、volume >- 組合多個 container 成為一個完整服務的工具 >- Docker Compose 最終結果是啟動 container,底層一樣會使用 docker run 指令,因此 Docker Compose 的設定參數會與 docker run 的選項和參數非常相似 ### Compose 1. 服務(service):定義 各容器的組態,定義內容將以命令列參數的方式 傳給 docker run 命令。 1. container 2. image 3. Dockerfile 1. 網路(network):將定義內容傳給 docker network create 命令 。 1. none 3. bridge 4. container 5. host 3. 卷(volume):將定義內容傳給 docker volume create 命令。 1. container空間 5. VM Linux空間 6. host空間 ### YAML檔案格式 * YAML:"YAML Ain't a Markup Language"(YAML不是一種標記語言)的遞迴縮寫。不是標註語言,而是一種 **適用於所有語言,人性化的資料序列標準**。 - 在YAML中,字串`不一定要用雙引號`標示。另外,在`縮排中空白字元的數目`並不是非常重要,`只要相同階層的元素左側對齊就可以了`(不過`**不能使用TAB**`字元)。 - 型態很多種,詳見[語言的構成元素(wiki)](https://zh.wikipedia.org/wiki/YAML)、[YAML 語法— ansible中文權威指南1.0.1 documentation](https://chusiang.github.io/ansible-docs-translate/YAMLSyntax.html)、[14. 延伸補充 - YAML](https://ithelp.ithome.com.tw/articles/10206454) - YAML 與 JSON 的差異在那? * 在 YAML 的官網中,指出 YAML 是 JSON 的超集,因此,YAML 支援 JSON 的格式。 * 實務上,JSON 與 YAML 應用的場景不盡相同。JSON 大多用於資料傳輸,YAML 大多用於組態設定,所以不用刻意去區分兩者間的差異。 * docker-compose.yml中哪些部分屬於「非」Docker本身設定: *  ### 安裝Docker compose * `$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose` * `$ sudo chmod +x /usr/local/bin/docker-compose` * `$ docker-compose --version` ## 2. 實作練習 docker compose service - `$ cat Dockerfile`,確認檔案內容 - `$ touch docker-compose.yml`,建立一個yml檔案 ```dockerfile= version: "3.7" services: myweb: build: context: . args: whoami: "Tony" image: kihifung/myweb:latest ports: - "8085:80" ``` -  - 在service的部份,可以設定多個container,從myweb以下的都是service - `$ cat docker-compose.yml`,查看yml檔的內容 - `$ docker-compose build --no-cache`,建立映像檔 - --no-cache:Do not use cache when building the image. - `$ docker images`,查看映像檔 - `$ docker-compose up -d`,運行compose - `$ docker container ls` -  -  - `$ docker-compose down`,關掉所有的container -  ### docker-compose.yml 結構 ```dockerfile version: "3.8" services: npm: image: node:14-alpine stdin_open: true tty: true working_dir: /source volumes: .:/source ``` * image 是指 IMAGE 參數 * stdin_open 是 --interactive 選項;tty 是 --tty 選項 * working_dir 是 Container 應用 有提到的 --workdir 選項 * volumes 是使用 volume 同步程式有提過的 --volume 選項 --- ## 3. docker compose networks - `$ docker-compose down`,關掉所有的container - `$ docker-compose up -d`,運行compose - `$ docker container ls` - `$ docker network ls` -  - 會自動生成一個 [資料夾]_default的bridge,並將先前建立的container都放在裡面 - `$ docker network inspect b17e25cc6448`,檢視內容物 - `$ docker-compose down` ### docker compose networks > 在docker-compose.yml裡面,service跟network同高度同位階 - 編輯docker-compose.yml檔案 - `$ cat docker-compose.yml` - `$ docker-compose build --no-cache` - `$ docker-compose up -d`,運行compose - `$ docker network inspect dockertest_mybridge001`,查看包含幾個container - `$ docker network inspect dockertest_mybridge002`,查看包含幾個container - host版本的docker-compose.yml ```dockerfile= version: "3.7" services: myweb6: build: context: . args: whoami: "Jimmy" image: uopsdod/myweb6:latest network_mode: "host" ``` --- ## 4. docker compose volumes >- 使用檔案:Dockerfile, docker-compose.yml >- 使用volume可讓修改後的內容,不因容器關閉而流失 >- 建立一個container來使用volume - `$ docker-compose down`,先卸載所有的container - `$ docker volume ls`,查看現有的volume - 在docker-compose.yml裡新增: ```dockerfile= services: myweb5: image: kihifung/myweb:latest ports: - "8089:80" networks: - mybridge002 volumes: - mainpage-vol002:/var/www/localhost/htdocs ... volumes: mainpage-vol002: ``` - `$ docker-compose build --no-cache`,建立映像檔 - `$ docker-compose up -d`,-d在背景執行(daemon) - `$ docker volume ls`,查看現有的volume - `$ docker container ls`,查看現有的container -  - `$ ip a`,查看ip,加上port號,即可在瀏覽器查看 -  - `$ docker exec -it faf290586d37 /bin/sh`,修改容器內容 - ls,查看容器內容 - cat index.html,列出index.html的內容 - echo "I made this change long time ago." >> index.html - cat index.html,看看是否修改 -  -  - `$ docker-compose down`,將剛剛修改的container關掉 - `$ docker-compose up -d`,重新開啟container - `http://192.168.103.129:8089/`,確認修改內容是否還留著 --- ## 回顧 - 什麼是docker compose - compose與service, volume, network之間的關係 ## 課後測驗 ### Q8:Dockerfile與Docker Compose有何不同? **Dockerfile**是一個簡單的文字檔,其中**包含使用者可以呼叫組裝映像檔的指令**,而**Docker Compose是用於定義和運行多個容器的Docker生態系相關工具**。 Docker Compose是在docker-compose.yml檔案中定義其構成的應用系統服務,藉此讓它們可以在單一隔離環境中一起運行,只需執行「`$ docker-compose up`」一行指令,就能運行好一組應用程式。 若將build指令新增到專案底下的docker-compose.yml檔案中,Docker Compose便可使用其Dockerfile,**Docker工作流程應該是為每個映像檔建立合適的Dockerfile,然後使用Compose透過build指令來組合那些映像檔**。 ### Q9:可以在Docker Compose文件中使用JSON檔取代YAML檔嗎? 當然,**YAML檔是JSON的父集合(Superset)**,因此任何JSON文件應該都是有效的YAML檔,欲在Compose中使用JSON檔案,需要特別地指定檔案的名稱,例如: - `$ docker-compose -f docker-compose. json up` **可以使用json檔取代yaml當作Compose定義檔,使用json檔來配合Compose**,指定其特定檔名來使用,例如: - `$ docker-compose -f docker-compose .json up` --- ## 參考資料、延伸閱讀 - [Docker Compose 建置 Web service 起步走入門教學 ](https://blog.techbridge.cc/2018/09/07/docker-compose-tutorial-intro/) - [Docker 初探:基本指令與簡單介紹 Dockerfile 和 docker-compose](https://askie.today/docker-dockerfile-dockercompose-intro/) - [使用 Docker Compose 摻在一起做懶人包](https://ithelp.ithome.com.tw/articles/10243618) - [使用 Docker-Compose 啟動多個 Docker Container](https://ithelp.ithome.com.tw/articles/10194183) --- - [回到目錄](https://hackmd.io/@Hualiteq/r1lye3M3d)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up