dockerfile mysql例子_docker-compose 实用示例
簡(jiǎn)單來(lái)說(shuō), docker compose就是一鍵啟動(dòng)/關(guān)閉多個(gè)容器的工具, 它能夠幫你解決容器之間依賴(lài)的問(wèn)題, 哪個(gè)先啟動(dòng), 依賴(lài)哪個(gè)容器等.
當(dāng)開(kāi)發(fā)的系統(tǒng)越來(lái)越復(fù)雜, 開(kāi)發(fā)環(huán)境和部署都沒(méi)那么簡(jiǎn)單的時(shí)候, 可以試試docker compose.
下面會(huì)把我實(shí)際經(jīng)驗(yàn)中的一個(gè)例子簡(jiǎn)化出來(lái),一步步教大家如何搭建docker compose,對(duì)踩過(guò)的坑進(jìn)行總結(jié),希望對(duì)docker能有更深的了解.
1. 搭建環(huán)境背景
以我目前在做的一個(gè)用python開(kāi)發(fā)的web應(yīng)用為例, 需要搭建一個(gè)依賴(lài)mysql, localstack, presto, celery, python flask等多項(xiàng)docker容器.
2. 配置文件
通過(guò)官網(wǎng)的介紹, 創(chuàng)建docker-compose.yml, 配置上面提到的幾個(gè)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"
#?暴露端口號(hào)
ports:
-?"3306:3306"
localstack:
image:?atlassianlabs/localstack:latest????environment:
#?localstack主要是為了模擬aws?s3,?方便單元測(cè)試
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在我的另外一篇文章中有寫(xiě)如何制作鏡像?https://www.jianshu.com/p/bb5181008cd7
image:?presto:v0.180
ports:
-?"8888:8888"
web:
#?這個(gè)鏡像可以根據(jù)代碼中依賴(lài)的包進(jìn)行build,?節(jié)省每次安裝的時(shí)間
image:?python-web-base:v0.1
command:?bash?/base/sbin/docker_compose_web_entrypoint.sh????#?暴露端口號(hào),?成功啟動(dòng)之后可以通過(guò)?http://localhost:8081?進(jìn)行訪問(wèn)
ports:
-?"8081:8081"
#?環(huán)境變量的設(shè)置
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中訪問(wèn)
#?mysql,?localstack?or?presto,?需要給一個(gè)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
3. 遇到的坑
3.1 host name問(wèn)題
配置mysql的時(shí)候由于不知道docker-compose中網(wǎng)絡(luò)通信是怎么樣的, 就用localhost:3306 或者127.0.0.1:3306去連mysql, 總是報(bào)錯(cuò), 無(wú)法連接該mysql. 發(fā)現(xiàn)原來(lái)在docker-compose環(huán)境下, 不管是mysql還是其他servers如presto, 想要連接這些服務(wù), 都要用這些服務(wù)的名字進(jìn)行連接. 如下所示version:?'3'services:
mysql:
...
presto:
...
localstack:
...
可以連接的服務(wù)的名稱(chēng)分別為mysql, presto 和localstack. 于是我在環(huán)境變量中export這些HOST name, 方便我在程序中去判斷是否存在這些環(huán)境變量, 如果有的話就連接這個(gè)hostname.
3.2 服務(wù)啟動(dòng)的先后順序
當(dāng)mysql還沒(méi)有成功啟動(dòng), celery會(huì)一直報(bào)錯(cuò), 并不斷地重復(fù)連接mysql, 于是我想設(shè)置這些服務(wù)的啟動(dòng)先后順序, 用了docker compose的 depens_on, 但是depens_on只是表達(dá)服務(wù)之間的依賴(lài)關(guān)系, 并不會(huì)按照次序來(lái)啟動(dòng)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.
看來(lái)如果想讓web或者celery服務(wù)等mysql啟動(dòng)完畢后再啟動(dòng), 需要一個(gè)wait-for-it腳本的幫忙. 這個(gè)人寫(xiě)的腳本還比較清晰簡(jiǎn)單的: https://github.com/yamyamyuo/wait-for-it
可以在command添加一個(gè)腳本, 腳本中使用wait-for-it去輪詢(xún)依賴(lài)的services, 一旦services啟動(dòng)成功, web 和 celery就可以繼續(xù)進(jìn)行啟動(dòng)了.
3.3 暴露端口號(hào)
服務(wù)對(duì)外暴露的端口號(hào)不要忘記填寫(xiě), 否則其他docker container無(wú)法找到該服務(wù). 注意事項(xiàng):
當(dāng)通過(guò)HOST:CONTAINER 格式來(lái)映射端口號(hào)的時(shí)候, 低于60的端口號(hào)會(huì)有錯(cuò)誤提示, 因?yàn)閅AML解析格式例如 xx:yy的數(shù)字是基于base-60的. 因此強(qiáng)烈建議用雙引號(hào)把 "HOST:CONTAINER" 括起來(lái).
3.4 volumes
為了能夠持久化和共享容器中的數(shù)據(jù), Docker提出了volume的概念. Volume可以讓容器中的聯(lián)合文件系統(tǒng), 以目錄或文件的形式存于宿主機(jī)上.
我最初遇到的一個(gè)問(wèn)題是celery service 通過(guò)異步的方式執(zhí)行一些任務(wù), 任務(wù)結(jié)束后會(huì)把結(jié)果寫(xiě)到本地文件, web service 查詢(xún)的時(shí)候會(huì)到本地文件中查看是否有相關(guān)結(jié)果. 這個(gè)時(shí)候volume排上用場(chǎng). 只要把容器內(nèi)用到的文件地址映射到宿主機(jī), 同時(shí)讓web和celery service 都共享該volume即可.
以上就是本次docker compose遇到的一些問(wèn)題, 如有問(wèn)題可以留言~
作者:小熊說(shuō)_BruinTalk
鏈接:https://www.jianshu.com/p/46db38b94200
總結(jié)
以上是生活随笔為你收集整理的dockerfile mysql例子_docker-compose 实用示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 炫龙定制笔记本电脑(炫龙笔记本做系统)
- 下一篇: 数据库考研SQL操作