一、Docker Compose 概述
Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您能夠使用Compose文件來配置應用程序的服務。而後,使用單個命令,您能夠從配置中建立並啓動全部服務。python
Compose很是適合開發,測試和登臺環境以及CI工做流程。linux
(1)官方文檔git
(2)使用Compose基本上是一個三步過程github
- 定義您的應用程序環境,Dockerfile以即可以在任何地方進行復制。
- 定義構成應用程序的服務,docker-compose.yml以便它們能夠在隔離環境中一塊兒運行。
- 最後,運行docker-compose up和Compose將啓動並運行整個應用程序。
(3)一個 docker-compose.yml 文件案例:web
1
2
3
4
5
6
7
8
9
10
11
|
version:
'2'
services:
web:
build: .
ports:
-
"5000:5000"
volumes:
- .:
/code
redis:
image: redis
|
有關Compose文件的詳細信息,請參閱 Compose文件參考。redis
(4)Compose具備管理應用程序整個生命週期的命令:docker
- 啓動,中止和重建服務
- 查看正在運行的服務的狀態
- 流式傳輸運行服務的日誌輸出
- 在服務上運行一次性命令
二、Docker Compose 安裝
2.1 安裝條件
(1)前提flask
Docker Compose 依靠Docker Engine 進行任何有意義的工做,所以請確保您已在本地或遠程安裝Docker Engine,具體取決於您的設置。vim
要以非root用戶身份運行Compose,請參閱以非root用戶身份管理Docker。
(2)安裝系統(主要講linux、pip安裝)
- Linux
- Mac
- Windows
- 備用安裝選項(使用pip安裝/安裝爲容器)
2.2 在Linux系統上安裝Compose
(1)下載安裝
在gitlab https://github.com/docker/compose/releases 上查詢適合本身的版本
我這裏下載的是1.23.2 版本
1
|
$
sudo
curl -L https:
//github
.com
/docker/compose/releases/download/1
.23.2
/docker-compose-Linux-x86_64
-o
/usr/local/bin/docker-compose
|
(2)添加執行權限
1
|
$
chmod
+x
/usr/local/bin/docker-compose
|
(3)安裝完成,查詢版本
1
2
|
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
|
2.3 備用安裝選項(使用pip安裝/安裝爲容器)
2.3.1 使用pip安裝
能夠使用pypi安裝Compose pip。若是你安裝使用pip,咱們建議你使用 virtualenv,由於許多操做系統都有python系統包與docker-compose依賴項衝突。請參閱virtualenv教程以開始使用。
1
|
$ pip
install
docker-compose
|
若是你沒有使用virtualenv
1
|
$
sudo
pip
install
docker-compose
|
注:須要6.0或更高版本的pip。
2.3.2 安裝爲容器
Compose也能夠在一個容器內運行,來自一個小的bash腳本包裝器。要將compose安裝爲容器,請運行此命令。若是此示例已過時,請務必將版本號替換爲所需的版本號:
1
2
|
$
sudo
curl -L --fail https:
//github
.com
/docker/compose/releases/download/
{{site.compose_version}}
/run
.sh -o
/usr/local/bin/docker-compose
$
sudo
chmod
+x
/usr/local/bin/docker-compose
|
2.4 其餘系統安裝(略)
2.4.1 在macOS上安裝Compose
Docker Desktop for Mac和Docker Toolbox已經包含Compose和其餘Docker應用程序,所以Mac用戶無需單獨安裝Compose。Docker安裝說明以下:
2.4.2 在Windows系統上安裝Compose
Docker Desktop for Windows和Docker Toolbox已經包含Compose和其餘Docker應用程序,所以大多數Windows用戶不須要單獨安裝Compose。Docker安裝說明以下:
若是您直接在Microsoft Windows Server 2016上運行Docker守護程序和客戶端(使用適用於Windows Server 2016的Docker EE,則須要安裝Docker Compose。爲此,請按照下列步驟操做
2.5 Docker Compose 升級
若是從Compose 1.2或更早版本升級,請在升級Compose後刪除或遷移現有容器。這是由於,從版本1.3開始,Compose使用Docker標籤來跟蹤容器,而且須要從新建立容器以添加標籤。
若是Compose檢測到沒有標籤建立的容器,它將拒絕運行,所以您最終不會使用兩組。若是要繼續使用現有容器(例如,由於它們具備要保留的數據卷),能夠使用Compose 1.5.x使用如下命令遷移它們:
1
|
docker-compose migrate-to-labels
|
或者,若是您不擔憂保留它們,能夠將它們刪除。撰寫只是建立新的。
1
|
docker container
rm
-f -
v
myapp_web_1 myapp_db_1 ...
|
2.6 Docker Compose 卸載
正常系統安裝卸載:
1
|
sudo
rm
/usr/local/bin/docker-compose
|
pip安裝卸載:
1
|
pip uninstall docker-compose
|
三、一個完整的Docker Compose 運用演示
3.1 compose 準備
(1)建立compose 工做目錄
1
2
|
[root@along ~]
# mkdir composetest
[root@along ~]
# cd composetest/
|
(2)建立一個app.py文件,後面在項目目錄中調用文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
[root@along composetest]
# vim app.py
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)
if
__name__ ==
"__main__"
:
app.run(host=
"0.0.0.0"
, debug=True)
|
注:redis是應用程序網絡上redis容器的主機名。咱們使用Redis的默認端口6379。
(3)建立requirements.txt 項目目錄中調用的另外一個文件
1
2
3
|
[root@along composetest]
# vim requirements.txt
flask
redis
|
3.2 建立Dockerfile,用於啓動一個簡單的容器
建立一個名爲的文件Dockerfile
1
2
3
4
5
6
|
[root@along composetest]
# vim Dockerfile
FROM python:3.4-alpine
ADD .
/code
WORKDIR
/code
RUN pip
install
-r requirements.txt
CMD [
"python"
,
"app.py"
]
|
注:從Python 3.4映像開始構建映像。詳細的dockerfile用法詳見:Docker系列07—Dockerfile 詳解
- 將當前目錄添加.到/code映像中的路徑中。
- 將工做目錄設置爲/code。
- 安裝Python依賴項。
- 將容器的默認命令設置爲python app.py。
3.3 在Compose文件中定義服務
建立docker-compose.yml項目目錄中調用的文件
1
2
3
4
5
6
7
8
9
|
[root@along composetest]
# vim docker-compose.yml
version:
'3'
services:
web:
build: .
ports:
-
"5000:5000"
redis:
image:
"redis:alpine"
|
此Compose文件定義了兩個服務,web和redis。該web服務:
- 使用從Dockerfile當前目錄中構建的圖像。
- 將容器上的公開端口5000轉發到主機上的端口5000。咱們使用Flask Web服務器的默認端口5000。
該redis服務使用從Docker Hub註冊表中提取的公共 Redis映像。
3.4 使用Compose構建並運行您的應用程序
(1)在項目目錄中,啓動應用程序 docker-compose up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@along composetest]
# docker-compose up
Recreating composetest_web_1 ...
done
Starting composetest_redis_1 ...
done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 15 Jan 2019 07:03:23.107
# oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 15 Jan 2019 07:03:23.107
# Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 15 Jan 2019 07:03:23.107
# Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Running mode=standalone, port=6379.
redis_1 | 1:M 15 Jan 2019 07:03:23.108
# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 15 Jan 2019 07:03:23.108
# Server initialized
redis_1 | 1:M 15 Jan 2019 07:03:23.108
# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 15 Jan 2019 07:03:23.108
# WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 15 Jan 2019 07:03:23.108 * DB loaded from disk: 0.000 seconds
redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Ready to accept connections
|
(2)瀏覽器查詢http://192.168.130.102:5000/,驗證
(3)刷新頁面,數字應該增長
(4)另開一個終端,查看鏡像驗證
1
2
3
4
5
|
[root@along harbor]
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest ca6d50ca9694 About a minute ago 77.2MB
redis alpine b42dc832c855 3 weeks ago 40.9MB
python 3.4-alpine bb81744a76cf 3 weeks ago 65.8MB
|
(5)關閉服務
在新開的終端docker-compose down,或者在啓動應用程序的原始終端中按CTRL + C來中止應用程序。
3.5 修改compose 配置,添加存儲卷
1
2
3
4
5
6
7
8
9
10
11
|
[root@along composetest]
# vim docker-compose.yml
version:
'3'
services:
web:
build: .
ports:
-
"5000:5000"
volumes:
- .:
/code
redis:
image:
"redis:alpine"
|
注:新volumes密鑰將主機上的項目目錄(當前目錄)/code安裝到容器內,容許您動態修改代碼,而無需重建映像。
3.6 測試存儲卷
(1)從新啓動compose
1
2
3
4
5
6
7
8
9
|
[root@along composetest]
# docker-compose up
Recreating composetest_web_1 ...
done
Starting composetest_redis_1 ...
done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 15 Jan 2019 07:03:23.107
# oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 15 Jan 2019 07:03:23.107
# Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 15 Jan 2019 07:03:23.107
# Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Running mode=standalone, port=6379.
... ...
|
(2)在宿主機的存儲捲上,修改代碼
1
2
|
[root@along composetest]
# vim app.py
return
'Hello World! I am along! I have been seen {} times.\n'
.
format
(count)
|
將Hello World! 郵件更改成Hello World! I am along!
(3)再在瀏覽器刷新,驗證成功
3.7 docker-compose 其餘命令
(1)在後臺運行服務,-d(用於「分離」模式)
1
2
3
|
[root@along composetest]
# docker-compose up -d
Starting composetest_web_1 ...
done
Starting composetest_redis_1 ...
done
|
(2)使用docker-compose ps以查看當前正在運行的內容
1
2
3
4
5
|
[root@along composetest]
# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
composetest_redis_1 docker-entrypoint.sh redis ... Up 6379
/tcp
composetest_web_1 python app.py Up 0.0.0.0:5000->5000
/tcp
|
(3)docker-compose run命令容許您爲服務運行一次性命令。例如,要查看web服務可用的環境變量 :
1
2
3
4
5
6
7
8
9
|
[root@along composetest]
# docker-compose run web env
PATH=
/usr/local/bin
:
/usr/local/sbin
:
/usr/local/bin
:
/usr/sbin
:
/usr/bin
:
/sbin
:
/bin
HOSTNAME=3848578f8fff
TERM=xterm
LANG=C.UTF-8
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
PYTHON_VERSION=3.4.9
PYTHON_PIP_VERSION=18.1
HOME=
/root
|
(4)中止服務
1
2
3
|
[root@along composetest]
# docker-compose stop
Stopping composetest_web_1 ...
done
Stopping composetest_redis_1 ...
done
|
(5)使用該down 命令徹底刪除容器。加--volumes 參數還能夠刪除Redis容器使用的數據卷
1
2
3
4
5
|
[root@along composetest]
# docker-compose down --volumes
Removing composetest_web_run_18e4bbaa4b33 ...
done
Removing composetest_web_1 ...
done
Removing composetest_redis_1 ...
done
Removing network composetest_default
|