首頁 > 易卦

Docker學習筆記|Docker Compose環境變數及服務依賴和健康檢查

作者:由 視聽觀察室 發表于 易卦日期:2022-02-13

docker環境變數怎麼寫

環境變數引數environment

docker-compose。yml 檔案

其中有

environment

引數用來配置環境變數,

${REDIS_PASSWORD}

變數需要在

docker-compose。yml

同目錄下的

。env

檔案中設定從而傳參

Docker學習筆記|Docker Compose環境變數及服務依賴和健康檢查

v

、、ersion:

“3。8”

services:

flask:

build:

context: 。/flask

dockerfile: Dockerfile

image: flask-demo:latest

environment:

-

REDIS_HOST

=

redis-server

-

REDIS_PASS

=

networks:

-

backend

-

frontend

redis-server:

image: redis:latest

command: redis-server

——requirepass

networks:

-

backend

nginx:

image: nginx:stable-alpine

ports:

-

8000

:80

depends_on:

-

flask

volumes:

-

。/nginx/nginx。conf:/etc/nginx/conf。d/default。conf:ro

-

。/var/log/nginx:/var/log/nginx

networks:

-

frontend

networks:

backend:

frontend:

。evn

檔案

Docker學習筆記|Docker Compose環境變數及服務依賴和健康檢查

REDIS_PASSWORD=ABC123

驗證環境變數傳參結果

使用

docker-compose config

命令

Docker學習筆記|Docker Compose環境變數及服務依賴和健康檢查

Docker學習筆記|Docker Compose環境變數及服務依賴和健康檢查

指定env檔案

使用

docker-compose ——env-file <檔名>

docker-compose ——env-file myenv up -d

docker-compose ——env-file myenv config

——evn-file

必須緊跟在

docker-compose

Docker Compose-服務依賴和健康檢查

Docker學習筆記|Docker Compose環境變數及服務依賴和健康檢查

一、docker compose 服務依賴

使用depends_on關鍵字

version:

services:

flask:

build:

-

REDIS_HOST

=

-

REDIS_PASS

=

healthcheck:

test: [

“CMD”

“curl”

“-f”

“localhost:5000”

interval: 30s

timeout: 3s

retries:

3

start_period: 40s

-

redis-server

networks:

-

backend

-

frontend

networks:

-

backend

nginx:

ports:

-

8000

:80

flask:

condition: service_healthy

volumes:

-

-

networks:

-

frontend

networks:

backend:

frontend:

二、docker compose 健康檢查

Docker學習筆記|Docker Compose環境變數及服務依賴和健康檢查

健康檢查是容器執行狀態的高階檢查,主要是檢查容器所執行的程序是否能正常的對外提供“服務”,比如一個數據庫容器,我們不光 需要這個容器是up的狀態,我們還要求這個容器的資料庫程序能夠正常對外提供服務,這就是所謂的健康檢查。

容器的健康檢查

容器本身有一個健康檢查的功能,但是需要在Dockerfile裡定義,或者在執行docker container run 的時候,透過下面的一些引數指定

Docker學習筆記|Docker Compose環境變數及服務依賴和健康檢查

——

health

-

cmd

string

Command

to

run

to

check

health

——

health

-

interval

duration

Time

between

running

the

check

ms

|

s

|

m

|

h

) (

default

0

s

——

health

-

retries

int

Consecutive

failures

needed

to

report

unhealthy

——

health

-

start

-

period

duration

Start

period

for

the

container

to

initialize

before

starting

health

-

retries

countdown

ms

|

s

|

m

|

h

) (

default

0

s

——

health

-

timeout

duration

Maximum

time

to

allow

one

check

to

示例原始碼

我們以下面的這個flask容器為例,相關的程式碼如下

PS

C

\

Users

\

Peng

Xiao

\

code

-

demo

\

compose

-

env

\

flask

>

dir

目錄

C

\

Users

\

Peng

Xiao

\

code

-

demo

\

compose

-

env

\

flask

Mode

LastWriteTime

Length

Name

——

——————-

————

——

-

a

——

2021

/

7

/

13

15

52

448

app

py

-

a

——

2021

/

7

/

14

0

32

471

Dockerfile

PS

C

\

Users

\

Peng

Xiao

\

code

-

demo

\

compose

-

env

\

flask

>

more

\

app

py

from

flask

import

Flask

from

redis

import

StrictRedis

import

os

import

socket

app

=

Flask

__name__

redis

=

StrictRedis

host

=

os

environ

get

‘REDIS_HOST’

‘127。0。0。1’

),

port

=

6379

password

=

os

environ

get

‘REDIS_PASS’

))

@app

route

‘/’

def

hello

():

redis

incr

‘hits’

return

f“Hello Container World! I have been seen {redis。get(‘hits’)。decode(‘utf-8’)} times and my hostname is {socket。gethostname()}。\n”

PS

C

\

Users

\

Peng

Xiao

\

code

-

demo

\

compose

-

env

\

flask

>

more

\

Dockerfile

FROM

python

3。9。5

-

slim

RUN

pip

install

flask

redis

&&

\

apt

-

get

update

&&

\

apt

-

get

install

-

y

curl

&&

\

groupadd

-

r

flask

&&

useradd

-

r

-

g

flask

flask

&&

\

mkdir

/

src

&&

\

chown

-

R

flask

flask

/

src

USER

flask

COPY

app

py

/

src

/

app

py

WORKDIR

/

src

ENV

FLASK_APP

=

app

py

REDIS_HOST

=

redis

EXPOSE

5000

HEALTHCHECK

——

interval

=

30

s

——

timeout

=

3

s

\

CMD

curl

-

f

localhost

5000

/

||

exit

1

CMD

“flask”

“run”

“-h”

“0。0。0。0”

上面Dockerfili裡的

HEALTHCHECK

就是定義了一個健康檢查。 會每隔30秒檢查一次,如果失敗就會退出,退出程式碼是

1

構建映象和建立容器

構建映象,建立一個bridge網路,然後啟動容器連到bridge網路

$

docker

image

build

-

t

flask

-

demo

$

docker

network

create

mybridge

$

docker

container

run

-

d

——

network

mybridge

——

env

REDIS_PASS

=

abc123

flask

-

demo

檢視容器狀態

$

docker

container

ls

CONTAINER

ID

IMAGE

COMMAND

CREATED

STATUS

PORTS

NAMES

059

c12486019

flask

-

demo

“flask run -h 0。0。0。0”

4

hours

ago

Up

8

seconds

health:

starting

5000

/

tcp

dazzling_tereshkova

也可以透過

docker container inspect 059

檢視詳情, 其中有有關health的

“Health”: {“Status”: “starting”,“FailingStreak”: 1,“Log”: [ {“Start”: “2021-07-14T19:04:46。4054004Z”,“End”: “2021-07-14T19:04:49。4055393Z”,“ExitCode”: -1,“Output”: “Health check exceeded timeout (3s)” }]}

經過3次檢查,一直是不通的,然後

health

的狀態會從

starting

變為

unhealthy

docker container

ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

059c12486019 flask-demo

“flask run -h 0。0。0。0”

4

hours ago Up

2

minutes (unhealthy)

5000

/tcp dazzling_tereshkova

啟動redis伺服器

啟動

redis

,連到

mybridge

上,

name=redis

, 注意密碼

$ docker container run -d ——network mybridge ——name redis redis:latest redis-server ——requirepass abc123

經過幾秒鐘,我們的

flask

變成了

healthy

$

docker

container

ls

CONTAINER

ID

IMAGE

COMMAND

CREATED

STATUS

PORTS

NAMES

bc4e826ee938

redis:

latest

“docker-entrypoint。s…”

18

seconds

ago

Up

16

seconds

6379

/

tcp

redis

059

c12486019

flask

-

demo

“flask run -h 0。0。0。0”

4

hours

ago

Up

6

minutes

healthy

5000

/

tcp

dazzling_tereshkova

docker-compose 健康檢查

示例程式碼下載(flask healthcheck)

本節原始碼

示例程式碼下載(flask + redis healthcheck)

本節原始碼