docker-compose 實用示例

簡單來說, docker compose就是一鍵啟動/關閉多個容器的工具, 它能夠幫你解決容器之間依賴的問題, 哪個先啟動, 依賴哪個容器等.

當開發(fā)的系統(tǒng)越來越復雜, 開發(fā)環(huán)境和部署都沒那么簡單的時候, 可以試試docker compose.

下面會把我實際經(jīng)驗中的一個例子簡化出來空幻,一步步教大家如何搭建docker compose柔逼,對踩過的坑進行總結(jié)铸磅,希望對docker能有更深的了解.

1. 搭建環(huán)境背景

以我目前在做的一個用python開發(fā)的web應用為例, 需要搭建一個依賴mysql, localstack, presto, celery, python flask等多項docker容器.

2. 配置文件

通過官網(wǎng)的介紹, 創(chuàng)建docker-compose.yml, 配置上面提到的幾個services.

version: '3'
services:
  mysql:
    # mysql 鏡像
    image: registry.docker-cn.com/library/mysql:latest
    environment:
      # 初始化mysql環(huán)境變量
      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在我的另外一篇文章中有寫如何制作鏡像 http://www.reibang.com/p/bb5181008cd7
    image: presto:v0.180
    ports:
      - "8888:8888"

  web:
    # 這個鏡像可以根據(jù)代碼中依賴的包進行build, 節(jié)省每次安裝的時間
    image: python-web-base:v0.1
    command: bash /base/sbin/docker_compose_web_entrypoint.sh
    # 暴露端口號, 成功啟動之后可以通過 http://localhost:8081 進行訪問
    ports:
      - "8081:8081"
    # 環(huán)境變量的設置
    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中 https://github.com/yamyamyuo/docker/tree/master/docker-compose

3. 遇到的坑

3.1 host name問題

配置mysql的時候由于不知道docker-compose中網(wǎng)絡通信是怎么樣的, 就用localhost:3306 或者127.0.0.1:3306去連mysql, 總是報錯, 無法連接該mysql. 發(fā)現(xiàn)原來在docker-compose環(huán)境下, 不管是mysql還是其他servers如presto, 想要連接這些服務, 都要用這些服務的名字進行連接. 如下所示

version: '3'
services:
  mysql:
    ...
  presto:
    ...
  localstack:
    ...

可以連接的服務的名稱分別為mysql, prestolocalstack. 于是我在環(huán)境變量中export這些HOST name, 方便我在程序中去判斷是否存在這些環(huán)境變量, 如果有的話就連接這個hostname.

3.2 服務啟動的先后順序

當mysql還沒有成功啟動, celery會一直報錯, 并不斷地重復連接mysql, 于是我想設置這些服務的啟動先后順序, 用了docker compose的 depens_on, 但是depens_on只是表達服務之間的依賴關系, 并不會按照次序來啟動service.

depends_on does not wait for db and redis to be “ready” before starting web - only until they have been started. If you need to wait for a service to be ready, see Controlling startup order for more on this problem and strategies for solving it.

看來如果想讓web或者celery服務等mysql啟動完畢后再啟動, 需要一個wait-for-it腳本的幫忙. 這個人寫的腳本還比較清晰簡單的: https://github.com/yamyamyuo/wait-for-it
可以在command添加一個腳本, 腳本中使用wait-for-it去輪詢依賴的services, 一旦services啟動成功, web 和 celery就可以繼續(xù)進行啟動了.

3.3 暴露端口號

服務對外暴露的端口號不要忘記填寫, 否則其他docker container無法找到該服務. 注意事項:
當通過HOST:CONTAINER 格式來映射端口號的時候, 低于60的端口號會有錯誤提示, 因為YAML解析格式例如 xx:yy的數(shù)字是基于base-60的. 因此強烈建議用雙引號把 "HOST:CONTAINER" 括起來.

3.4 volumes

為了能夠持久化和共享容器中的數(shù)據(jù), Docker提出了volume的概念. Volume可以讓容器中的聯(lián)合文件系統(tǒng), 以目錄或文件的形式存于宿主機上.
我最初遇到的一個問題是celery service 通過異步的方式執(zhí)行一些任務, 任務結(jié)束后會把結(jié)果寫到本地文件, web service 查詢的時候會到本地文件中查看是否有相關結(jié)果. 這個時候volume排上用場. 只要把容器內(nèi)用到的文件地址映射到宿主機, 同時讓webcelery service 都共享該volume即可.

以上就是本次docker compose遇到的一些問題, 如有問題可以留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末展箱,一起剝皮案震驚了整個濱河市豌汇,隨后出現(xiàn)的幾起案子再菊,更是在濱河造成了極大的恐慌浓瞪,老刑警劉巖姥闭,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贪染,居然都是意外死亡缓呛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門杭隙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哟绊,“玉大人,你說我怎么就攤上這事痰憎∑彼瑁” “怎么了攀涵?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洽沟。 經(jīng)常有香客問我以故,道長,這世上最難降的妖魔是什么裆操? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任怒详,我火速辦了婚禮,結(jié)果婚禮上踪区,老公的妹妹穿的比我還像新娘昆烁。我一直安慰自己,他們只是感情好缎岗,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布静尼。 她就那樣靜靜地躺著,像睡著了一般传泊。 火紅的嫁衣襯著肌膚如雪鼠渺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天或渤,我揣著相機與錄音系冗,去河邊找鬼。 笑死薪鹦,一個胖子當著我的面吹牛掌敬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播池磁,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼奔害,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了地熄?” 一聲冷哼從身側(cè)響起华临,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎端考,沒想到半個月后雅潭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡却特,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年扶供,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裂明。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡椿浓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扳碍,我是刑警寧澤提岔,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站笋敞,受9級特大地震影響碱蒙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夯巷,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一振亮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鞭莽,春花似錦、人聲如沸麸祷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阶牍。三九已至喷面,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間走孽,已是汗流浹背惧辈。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留磕瓷,地道東北人盒齿。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像困食,于是被迫代替她去往敵國和親边翁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評論 25 707
  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件硕盹?Google Compute Engi...
    ahohoho閱讀 15,511評論 15 147
  • 以下原文轉(zhuǎn)載于(https://docs.docker.com/docker-for-mac/)(想找中文版的最新...
    Veekend閱讀 7,548評論 0 17
  • 向來都 身俗心也俗 還好是 身硬心尚不硬 費勁 吃力 會抖 會酸 會麻 小小痛感 僵硬中還能覺知 可重新認識自己
    靜軒茶香閱讀 110評論 1 3
  • 對神的認識 公義的神瘩例,第4節(jié)啊胶,第8節(jié),說按公義審判人垛贤,也就是說神不會放過任何一個罪人焰坪,任何一個,只要犯罪了都要受到...
    UncleTea閱讀 1,437評論 0 0