docker-compose 實用示例
簡單來說, docker compose就是一鍵啟動/關閉多個容器的工具, 它能夠幫你解決容器之間依賴的問題, 哪個先啟動, 依賴哪個容器等.
當開發的系統越來越複雜, 開發環境和部署都沒那麼簡單的時候, 可以試試docker compose.
下面會把我實際經驗中的一個例子簡化出來,一步步教大家如何搭建docker compose,對踩過的坑進行總結,希望對docker能有更深的瞭解.
1. 搭建環境背景
以我目前在做的一個用python開發的web應用為例, 需要搭建一個依賴mysql, , , , python flask等多項docker容器.
2. 配置檔案
透過, 建立docker-compose.yml
, 配置上面提到的幾個services.
version: '3'services: mysql: # mysql 映象 image: registry.docker-cn.com/library/mysql:latest environment: # 初始化mysql環境變數 MYSQL_DATABASE: test MYSQL_ROOT_PASSWORD: "123456" # 暴露埠號 ports: - "3306:3306" localstack: image: atlassianlabs/localstack:latest environment: # localstack主要是為了模擬aws s3, 方便單元測試 AWS_ACCESS_KEY_ID: unit-test-user AWS_SECRET_ACCESS_KEY: unit-test-user AWS_DEFAULT_REGION: cn-north-1 AWS_DEFAULT_OUTPUT: text SERVICES: s3 ports: - "4572:4572" presto: # presto在我的另外一篇文章中有寫如何製作映象 image: presto:v0.180 ports: - "8888:8888" web: # 這個映象可以根據程式碼中依賴的包進行build, 節省每次安裝的時間 image: python-web-base:v0.1 command: bash /base/sbin/docker_compose_web_entrypoint.sh # 暴露埠號, 成功啟動之後可以透過 進行訪問 ports: - "8081:8081" # 環境變數的設定 environment: S3_PORT: 4572 S3_HOST: localstack AWS_ACCESS_KEY_ID: unit-test-user AWS_SECRET_ACCESS_KEY: unit-test-user AWS_DEFAULT_REGION: cn-north-1 AWS_DEFAULT_OUTPUT: text # 在docker-compose中, 想要在web service中訪問 # mysql, localstack or presto, 需要給一個hostname, # hostname跟service name一致. PRESTO_HOST: presto MYSQL_HOST: mysql MYSQL_DATABASE: test MYSQL_ROOT_PASSWORD: "123456" depends_on: - mysql - localstack - presto volumes:# code base - .:/base# query result shared volume: /tmp/ - /tmp:/tmp celery: image: python-web-base:v0.1 command: bash /base/sbin/docker_compose_celery_entrypoint.sh environment: C_FORCE_ROOT: "true" PRESTO_HOST: presto MYSQL_HOST: mysql MYSQL_DATABASE: test MYSQL_ROOT_PASSWORD: "123456" AWS_ACCESS_KEY_ID: unit-test-user AWS_SECRET_ACCESS_KEY: unit-test-user AWS_DEFAULT_REGION: cn-north-1 AWS_DEFAULT_OUTPUT: text depends_on: - mysql - presto - localstack volumes:# code base - .:/base# query result shared volume: /tmp/ - /tmp:/tmp
完整的程式碼我放到了github中
3. 遇到的坑
3.1 host name問題
配置mysql的時候由於不知道docker-compose中網路通訊是怎麼樣的, 就用localhost:3306 或者127.0.0.1:3306去連mysql, 總是報錯, 無法連線該mysql. 發現原來在docker-compose環境下, 不管是mysql還是其他servers如presto, 想要連線這些服務, 都要用這些服務的名字進行連線. 如下所示
version: '3'services: mysql: ... presto: ... localstack: ...
可以連線的服務的名稱分別為mysql
, presto
和localstack
. 於是我在環境變數中export這些HOST name, 方便我在程式中去判斷是否存在這些環境變數, 如果有的話就連線這個hostname.
3.2 服務啟動的先後順序
當mysql還沒有成功啟動, celery會一直報錯, 並不斷地重複連線mysql, 於是我想設定這些服務的啟動先後順序, 用了docker compose的 , 但是depens_on只是表達服務之間的依賴關係, 並不會按照次序來啟動service.
depends_on
does not wait fordb
andredis
to be “ready” before startingweb
- only until they have been started. If you need to wait for a service to be ready, see for more on this problem and strategies for solving it.
看來如果想讓web
或者celery
服務等mysql
啟動完畢後再啟動, 需要一個wait-for-it
指令碼的幫忙. 這個人寫的指令碼還比較清晰簡單的:
可以在command
新增一個指令碼, 指令碼中使用wait-for-it
去輪詢依賴的services, 一旦services啟動成功, web 和 celery就可以繼續進行啟動了.
3.3 暴露埠號
服務對外暴露的埠號不要忘記填寫, 否則其他docker container無法找到該服務. 注意事項:
當透過HOST:CONTAINER
格式來對映埠號的時候, 低於60的埠號會有錯誤提示, 因為YAML解析格式例如 xx:yy
的數字是基於base-60的. 因此強烈建議用雙引號把 "HOST:CONTAINER" 括起來.
3.4 volumes
為了能夠持久化和共享容器中的資料, Docker提出了volume的概念. Volume可以讓容器中的聯合檔案系統, 以目錄或檔案的形式存於宿主機上.
我最初遇到的一個問題是celery
service 透過非同步的方式執行一些任務, 任務結束後會把結果寫到本地檔案, web
service 查詢的時候會到本地檔案中檢視是否有相關結果. 這個時候volume排上用場. 只要把容器內用到的檔案地址對映到宿主機, 同時讓web
和celery
service 都共享該volume即可.
以上就是本次docker compose遇到的一些問題, 如有問題可以留言~
作者:小熊說_BruinTalk
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2001/viewspace-2805939/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Docker-compose實戰Docker
- [譯] 實用 ProGuard 規則示例
- Android MVP模式--簡單實用示例 BMIAndroidMVP模式
- Linux 中 17 個 tar 命令實用示例Linux
- Docker-Compose實現Mysql主從DockerMySql
- 用 docker-compose 搭建一個 rabbitmq 叢集DockerMQ
- 用 let's Encrypt 實現 HTTPS 示例( fasthttp 與net/http)HTTPAST
- 微服務實戰 – docker-compose實現mysql+springboot+angular微服務DockerMySqlSpring BootAngular
- Linux 下 cut 命令的 4 個基礎實用的示例Linux
- .NET Core容器化之多容器應用部署(Docker-Compose)Docker
- IDEA的Docker外掛實戰(Docker-compose篇)IdeaDocker
- SpringBoot應用篇之FactoryBean及代理實現SPI機制示例Spring BootBean
- 自用 docker-composeDocker
- docker-compose教程Docker
- docker-compose部署ELKDocker
- docker-compose 安裝Docker
- Docker-Compose基礎Docker
- docker-compose安裝Docker
- Docker-Compose學習Docker
- docker-compose 編排Docker
- 利用itchat搭建微信機器人詳解(附三個實用示例)機器人
- 分散式 PostgreSQL 叢集(Citus)官方示例 - 多租戶應用程式實戰分散式SQL
- 原始碼開放:WebSocket應用示例原始碼Web
- 用Java拆分字串示例和技巧 -DreamixJava字串
- Spring中實現策略模式示例Spring模式
- 採用docker-compose和consul-template實現nginx自動發現自動註冊-微服務治理DockerNginx微服務
- vue 實現原理及簡單示例實現Vue
- 超實用!阿里雲應用——Air780EP低功耗4G模組AT開發示例阿里AI
- Docker-compose networks 的例子Docker
- docker-compose部署redis,flaskDockerRedisFlask
- docker-compose 使用例項Docker
- docker-compose安裝lokiDockerLoki
- docker-compose建立haproxy教程Docker
- docker-compose 部署參考Docker
- 使用 makefile 管理 docker-composeDocker
- 一個簡單的 indexedDB 應用示例Index
- Hive 高階應用開發示例(一)Hive
- 採用libpq連結lightdb示例程式