docker-compse hello world

前言

最近根據(jù)公司安排部署了一些服務(wù)吵血,一火車(chē)的jar包手動(dòng)部署就......懂得都懂。并且服務(wù)器還是Windows Server 就直接原地爆炸。好在還可以使用批處理坦弟。于是就有了如下批處理腳本。

@echo off

start cmd /c "java -jar register.jar"
choice /t 20 /d y /n >nul
start cmd /c "jar -jar gateway.jar"
choice /t 15 /d y /n >nul
for %%i in (*.jar) do (
    if not %%i==register (
        if not %%i==gateway (
            start cmd /c "title %%i && java -jar %%i"
        )
    )
)
pause

此時(shí)我就想起當(dāng)年用docker時(shí)也順便看了點(diǎn)docker-compose官地,一顆熱愛(ài)學(xué)習(xí)的心霎時(shí)間就按耐不住了酿傍。不如就再看一遍吧,萬(wàn)一以后用到了呢

安裝

執(zhí)行一下命令下載docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

給下載的docker-compose賦予執(zhí)行權(quán)限

sudo chmod +x /usr/local/bin/docker-compose

Docker-compse Hello world

創(chuàng)建任意一個(gè)文件夾存放驱入,docker-compose.yml(docker-compose 使用yml作為配置文件格式) Dockerfile .env以及其他文件赤炒。

使用官方示例的一個(gè)flask+redis 應(yīng)用,首先準(zhǔn)備web服務(wù)器代碼

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

準(zhǔn)備依賴(lài)文件,這里可選修改Dockerfile文件的pip安裝指令以去除該文件亏较。requirements.txt

flask
redis

編寫(xiě)Dockerfile

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
#這里如果不使用requirements.txt,使用兩個(gè)RUN
#RUN pip install flask
#RUN pip install redis
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

編寫(xiě)docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

以上步驟都沒(méi)問(wèn)題后使用docker-compse up【構(gòu)建】啟動(dòng)所有容器莺褒,首次啟動(dòng)會(huì)很慢,可能會(huì)下載并安裝包括但不限于ssl,gcc等依賴(lài)雪情。尤其是gcc安裝較慢遵岩,耐心等待。

出現(xiàn)如下界面則表示啟動(dòng)成功

# ....為省略非關(guān)鍵內(nèi)容,實(shí)際日志行數(shù)遠(yuǎn)大于以下內(nèi)容
Recreating docker-compose_web_1 ... done
Starting docker-compose_redis_1 ... done
....
redis_1  | 1:M 03 Apr 2021 13:38:27.747 * Running mode=standalone, port=6379.
....
redis_1  | 1:M 03 Apr 2021 13:38:27.748 * Ready to accept connections
....
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

啟動(dòng)成功后訪(fǎng)問(wèn)http://ip:5000會(huì)出現(xiàn)一下內(nèi)容

Hello World! I have been seen 2 (注釋?zhuān)涸L(fǎng)問(wèn)幾次頁(yè)面就是幾) times.

綁定掛載點(diǎn)

修改docker-compose.yml 增加掛載點(diǎn)

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
    #將宿主機(jī)當(dāng)前目錄與容器內(nèi)/code目錄綁定尘执,功能與docker run的-vc參數(shù)一致
      - .:/code
    environment:
    # 設(shè)置容器內(nèi)環(huán)境變量舍哄,功能與Dockerfile ENV指令以及docker run的-e參數(shù)一致
      FLASK_ENV: development
  redis:
    image: "redis:alpine"

我對(duì)Flask框架并不熟悉,不過(guò)從官方文章中表示Flask應(yīng)該會(huì)根據(jù)FLASK_ENV: development這個(gè)環(huán)境變量選擇開(kāi)啟開(kāi)發(fā)模式(類(lèi)似于熱跟新的功能)

然后在當(dāng)前目錄修改app.py中的內(nèi)容誊锭。因?yàn)橛?code>- .:/code所以直接在宿主機(jī)修改

return 'Hello from Docker-compose! I have been seen {} times.\n'.format(count)

保存后再瀏覽http://ip:5000會(huì)發(fā)現(xiàn)網(wǎng)頁(yè)內(nèi)容已經(jīng)發(fā)生變化

Hello Docker-compose! I have been seen 6 times.

profiles

profiles聲明

docker-compose 中包含許多服務(wù)表悬,我們可以通過(guò)使用profiles屬性來(lái)控制是否啟動(dòng)某項(xiàng)服務(wù)。profiles屬性的值是數(shù)組形式的丧靡,例如我將為redis屬性增加一個(gè)名為alming的profile

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
    #將宿主機(jī)當(dāng)前目錄與容器內(nèi)/code目錄綁定蟆沫,功能與docker run的-vc參數(shù)一致
      - .:/code
    environment:
    # 設(shè)置容器內(nèi)環(huán)境變量,功能與Dockerfile ENV指令以及docker run的-e參數(shù)一致
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
    profiles: alming

然后再啟動(dòng)它窘行,會(huì)發(fā)現(xiàn)redis服務(wù)并未啟動(dòng)

~/docker/compose$ docker-compose -f docker-compose-profiles.yml up
Starting compose_web_1 ... done
Attaching to compose_web_1
web_1    |  * Serving Flask app 'app.py' (lazy loading)
web_1    |  * Environment: development
web_1    |  * Debug mode: on
web_1    |  * Running on all addresses.
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |  * Running on http://172.18.0.2:5000/ (Press CTRL+C to quit)
web_1    |  * Restarting with stat
web_1    |  * Debugger is active!
web_1    |  * Debugger PIN: 132-905-791

這里涉及另一個(gè)關(guān)于docker-compse CLI 的知識(shí)點(diǎn)饥追,即通過(guò)指定compose文件啟動(dòng) 使用-f參數(shù)

激活profiles

想要啟動(dòng)帶有profile的服務(wù)有多種方法,第一種就是使用--profile 參數(shù)罐盔,啟動(dòng)命令如下

docker-compose --profile alming -f docker-compose-profiles.yml up

第二種方式是配置COMPOSE_PROFILES環(huán)境變量但绕,例如執(zhí)行以下命令添加環(huán)境便令

export COMPOSE_PROFILES=alming

隨后執(zhí)行docker-compose -f docker-compose-profiles.yml up即使不指定profile參數(shù),也會(huì)啟動(dòng)標(biāo)有alming profiles的服務(wù)

tips

如果profiles是數(shù)組那么惶看,僅需滿(mǎn)足其中一個(gè)profile服務(wù)即可生效

環(huán)境變量

.env文件

docker-compse 默認(rèn)會(huì)讀取.env文件中聲明的環(huán)境變量捏顺。.env文件以KEY=VALUE的格式存儲(chǔ)環(huán)境變量。

例如有如下.env環(huán)境變量文件

MY_PROFILE=al

然后在compose文件中引用

 redis:
    image: "redis:alpine"
    profiles: ["${MY_PROFILE}"]

這樣${MY_PROFILE}在運(yùn)行時(shí)就會(huì)被替換為al,可以使用 docker-compose config 驗(yàn)證一下纬黎,該指令用于查看和驗(yàn)證compse文件幅骄。結(jié)果如下

~/docker/compose$ docker-compose -f docker-compose-env.yml config
services:
  redis:
    image: redis:alpine
    profiles:
    - al
  web:
    build:
      context: /home/ubuntu/docker/compose
    environment:
      FLASK_ENV: development
    ports:
    - published: 5000
      target: 5000
    volumes:
    - /home/ubuntu/docker/compose:/code:rw
version: '3.9'

同樣 -f用于指定compse文件

優(yōu)先級(jí)問(wèn)題

compse文件同樣識(shí)別命令行環(huán)境變量參數(shù)和 shell環(huán)境變量等多種配置方式其優(yōu)先級(jí)順序如下

  1. Compose file
  2. Shell environment variables
  3. Environment file
  4. Dockerfile
  5. Variable is not defined

指定env文件

docker-compse 默認(rèn)識(shí)別當(dāng)前目錄下.env文件,如env文件不在當(dāng)前目錄或名稱(chēng)非.env那么可以通過(guò)--env-file參數(shù)指定 env 文件

docker-compose -f docker-compose-env.yml --env-file al-env config

多compose文件

docker-compse可指定多compose 文件啟動(dòng)本今。其中各屬性既有疊加又有覆蓋拆座。使用時(shí)再說(shuō)把QAQ


最后 大幻夢(mèng)森羅萬(wàn)象狂氣斷罪眼\ (???) /

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冠息,隨后出現(xiàn)的幾起案子挪凑,更是在濱河造成了極大的恐慌,老刑警劉巖逛艰,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躏碳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡散怖,警方通過(guò)查閱死者的電腦和手機(jī)菇绵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镇眷,“玉大人咬最,你說(shuō)我怎么就攤上這事∑樱” “怎么了丹诀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)翁垂。 經(jīng)常有香客問(wèn)我铆遭,道長(zhǎng),這世上最難降的妖魔是什么沿猜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任枚荣,我火速辦了婚禮,結(jié)果婚禮上啼肩,老公的妹妹穿的比我還像新娘橄妆。我一直安慰自己,他們只是感情好祈坠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布害碾。 她就那樣靜靜地躺著,像睡著了一般赦拘。 火紅的嫁衣襯著肌膚如雪慌随。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天躺同,我揣著相機(jī)與錄音阁猜,去河邊找鬼。 笑死蹋艺,一個(gè)胖子當(dāng)著我的面吹牛剃袍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捎谨,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼民效,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涛救?” 一聲冷哼從身側(cè)響起畏邢,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎州叠,沒(méi)想到半個(gè)月后棵红,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咧栗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年逆甜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片致板。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡交煞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斟或,到底是詐尸還是另有隱情素征,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站御毅,受9級(jí)特大地震影響根欧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜端蛆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一凤粗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧今豆,春花似錦嫌拣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至插掂,卻和暖如春灰瞻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背燥筷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工箩祥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肆氓。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓袍祖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谢揪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕉陋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354