前言
最近根據(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í)順序如下
- Compose file
- Shell environment variables
- Environment file
- Dockerfile
- 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)象狂氣斷罪眼\ (???) /