以下內(nèi)容轉(zhuǎn)載于Breeze
原博客地址:https://www.cnblogs.com/breezey/
九贮懈、Docker-Compose
1匀泊、Docker Compose介紹
Docker Compose是一個(gè)定義和運(yùn)行多容器應(yīng)用的單機(jī)編排工具。通過Docker Compose你可以使用一個(gè)單一的YAML文件來配置多個(gè)應(yīng)用服務(wù)朵你,通過一條命令各聘,就可以將所有配置的服務(wù)全部啟動(dòng)起來。
使用Docker Compose的三個(gè)步驟:
- 使用Dockerfile定義環(huán)境抡医,這樣可以確保其在任意地方運(yùn)行
- 使用docker-compose.yml文件定義服務(wù)躲因,這樣它們就可以在獨(dú)立環(huán)境中一起運(yùn)行
- 運(yùn)行docker-compose up使用docker-compose啟動(dòng)所有應(yīng)用
Docker Compose可以管理應(yīng)用的整個(gè)生命周期:
- 啟動(dòng)、停止忌傻、重建服務(wù)
- 查看服務(wù)的運(yùn)行狀態(tài)
- 流式輸出服務(wù)日志
- 對服務(wù)執(zhí)行一次性命令
2大脉、Docker Compose安裝
二進(jìn)制安裝:
下載地址:https://github.com/docker/compose/releases
pip安裝:
pip install docker-compose
3、Docker Compose基本示例
3.1水孩、基本文件及目錄設(shè)置
- 創(chuàng)建一個(gè)目錄:
mkdir composetest
cd composetest
- 在上面的目錄中創(chuàng)建一個(gè)app.py文件镰矿,內(nèi)容如下:
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)
- 再創(chuàng)建一個(gè)pip.conf文件,內(nèi)容如下:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
3.2俘种、創(chuàng)建一個(gè)Dockerfile
仍然在composetest目錄中創(chuàng)建一個(gè)Dockerfile秤标,內(nèi)容如下:
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
3.3绝淡、通過docker-compose.yml定義服務(wù)
docker-compose.yml內(nèi)容如下:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
這個(gè)文件定義了兩個(gè)服務(wù):web和redis。
- web服務(wù)使用當(dāng)前目錄的Dockerfile進(jìn)行構(gòu)建抛杨,并且映射web服務(wù)的5000端口到宿主機(jī)5000端口够委。
- redis服務(wù)使用一個(gè)公共的redis鏡像。
3.4怖现、通過Docker Compose構(gòu)建并啟動(dòng)服務(wù)
docker-compose up
這個(gè)時(shí)候可以通過http://127.0.0.1:5000來訪問這個(gè)web服務(wù)。
3.5玉罐、 修改Compse文件屈嗤,添加一個(gè)掛載點(diǎn)
修改docker-compose.yml,內(nèi)容如下:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
添加了一個(gè)volumes配置項(xiàng)吊输,將當(dāng)前目錄掛載至web容器的/code目錄下饶号。
然后我們通過docker-compose up重新構(gòu)建應(yīng)用,再次訪問季蚂,會(huì)發(fā)現(xiàn)結(jié)果與上面完全相同茫船。
3.6、 更新應(yīng)用
我們修改本地的app.py扭屁,修改Hello World!
為Hello from Dokcer
算谈,如下:
return 'Hello from Docker! I have been seen {} times.\n'.format(count)
這個(gè)時(shí)候再次訪問http://127.0.0.1:5000,發(fā)現(xiàn)訪問內(nèi)容也隨之修改料滥。
這是因?yàn)樵谏厦嫖覀儗⒈镜啬夸洅燧d進(jìn)了容器然眼,我們修改本地的app.py就相當(dāng)于修改了容器內(nèi)的文件。
4葵腹、Docker Compose常用命令說明
在上面的一個(gè)簡單示例中高每,我們已經(jīng)使用了docker-compose up
來啟動(dòng)一個(gè)docker-compose.yml文件定義的服務(wù)。我們剛剛通過docker-compose up
雖然啟動(dòng)了服務(wù)践宴,當(dāng)是docker-compose指令卻在前臺(tái)執(zhí)行鲸匿,如果需要將其放入后臺(tái)運(yùn)行,可以使用-d
參數(shù):
docker-compose up -d
docker-compose up還可以使用--scale參數(shù)實(shí)現(xiàn)服務(wù)的擴(kuò)縮容:
[root@app composetest]# docker-compose up -d --scale web=2
Recreating composetest_web_1 ...
Recreating composetest_web_1 ... done
Creating composetest_web_2 ... done
還可以通過-f
選項(xiàng)指定compose文件:
[root@app tranning]# docker-compose -f test-compose.yml up -d
Creating network "tranning_default" with the default driver
Creating network "tranning_frontend" with the default driver
Creating network "tranning_backend" with the default driver
Creating tranning_visualizer_1 ... done
Creating tranning_redis_1 ... done
Creating tranning_worker_1 ... done
Creating tranning_db_1 ... done
Creating tranning_result_1 ... done
Creating tranning_vote_1 ... done
需要說明的是阻肩,如果使用自動(dòng)擴(kuò)容带欢,則web服務(wù)不能做端口映射,否則會(huì)出現(xiàn)端口沖突的情況
下面我們說一說其他常用的docker-compose命令:
- docker-compose ps
[root@app composetest]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
composetest_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
composetest_web_1 python app.py
- docker-compose stop
[root@app composetest]# docker-compose stop
Stopping composetest_redis_1 ... done
Stopping composetest_web_1 ... done
[root@app composetest]# docker-compose stop web
Stopping composetest_web_1 ... done
- docker-compose start
[root@app composetest]# docker-compose start
Starting web ... done
Starting redis ... done
[root@app composetest]# docker-compose start web
Starting web ... done
- docker-compose restart
[root@app composetest]# docker-compose restart
Restarting composetest_web_1 ... done
Restarting composetest_redis_1 ... done
- docker-compose run [command]
[root@app composetest]# docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=72ad8a0682b7
TERM=xterm
LANG=C.UTF-8
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
PYTHON_VERSION=3.4.9
PYTHON_PIP_VERSION=18.0
HOME=/root
- docker-compose down
[root@app composetest]# docker-compose down
Stopping composetest_redis_1 ... done
Stopping composetest_web_1 ... done
Removing composetest_redis_1 ... done
Removing composetest_web_1 ... done
Removing network composetest_default
通過--volumes還要以刪除自動(dòng)掛載的容器卷
- docker-compose build
默認(rèn)情況下磺浙,我們寫好了Dockerfile洪囤,第一次通過docker-compose啟動(dòng)的時(shí)候,會(huì)自動(dòng)完成構(gòu)建撕氧,但如果隨后Dockerfile發(fā)生了改動(dòng)瘤缩,再次通過docker-compose來啟動(dòng)實(shí)現(xiàn)更新的話,docker-compose不會(huì)再次自動(dòng)構(gòu)建鏡像伦泥,而是復(fù)用第一次生成的鏡像剥啤,如果希望鏡像能夠被重新構(gòu)建锦溪,需要單獨(dú)執(zhí)行docker-compose build
- docker-compose top
[root@app composetest]# docker-compose top
composetest_redis_1
UID PID PPID C STIME TTY TIME CMD
---------------------------------------------------------------
100 89653 89634 0 23:26 ? 00:00:00 redis-server
composetest_web_1
UID PID PPID C STIME TTY TIME CMD
--------------------------------------------------------------------------------
root 89635 89619 0 23:26 ? 00:00:00 python app.py
root 89742 89635 0 23:26 ? 00:00:00 /usr/local/bin/python app.py
- 其它
docker-compose rm # 通過這種方式也能刪除指定服務(wù),但不會(huì)刪除網(wǎng)絡(luò)和volumes
docker-compose kill # 強(qiáng)制殺死一個(gè)服務(wù)
docker-compose logs # 用于查看日志
5府怯、Docker Compose文件詳解
通過之前的示例刻诊,其實(shí)我們可以看到,所有服務(wù)的管理牺丙,都是依靠docker-compose.yml文件來實(shí)現(xiàn)的则涯。那么我們接下來就詳細(xì)說一說docker-compose.yml文件中的常用指令。
compose文件使用yml格式冲簿,docker規(guī)定了一些指令粟判,使用它們可以去設(shè)置對應(yīng)的東西,主要分為了四個(gè)區(qū)域:
- version:用于指定當(dāng)前docker-compose.yml語法遵循哪個(gè)版本
- services:服務(wù)峦剔,在它下面可以定義應(yīng)用需要的一些服務(wù)档礁,每個(gè)服務(wù)都有自己的名字、使用的鏡像吝沫、掛載的數(shù)據(jù)卷呻澜、所屬的網(wǎng)絡(luò)、依賴哪些其他服務(wù)等等惨险。
- networks:應(yīng)用的網(wǎng)絡(luò)羹幸,在它下面可以定義應(yīng)用的名字、使用的網(wǎng)絡(luò)類型等平道。
- volumes:數(shù)據(jù)卷睹欲,在它下面可以定義數(shù)據(jù)卷,然后掛載到不同的服務(wù)下去使用一屋。
version
用于指定當(dāng)前compose文件語法遵循哪個(gè)版本窘疮,下面這張表是不同的Compose文件版本兼容的Docker版本:
services
我們上面所說的所有服務(wù)的定義都是定義在services區(qū)域中,接下來冀墨,我們學(xué)習(xí)下services下常用的配置項(xiàng)
image
標(biāo)明image的ID闸衫,這個(gè)image ID可以是本地也可以是遠(yuǎn)程的,如果本地不存在诽嘉,compose會(huì)嘗試pull下來
示例:
image: ubuntu
image: hub.dz11.com/library/tomcat:8
build
該參數(shù)指定Dockerfile文件的路徑蔚出,compose會(huì)通過Dockerfile構(gòu)建并生成鏡像,然后使用該鏡像
示例:
build: /path/to/build/dir
command
重寫默認(rèn)的命令虫腋,或者說指定啟動(dòng)容器的命令
示例:
command: "/run.sh"
links
鏈接到其他服務(wù)中的容器骄酗,可以指定服務(wù)名稱和這個(gè)鏈接的別名,或者只指定服務(wù)名稱
示例:
links:
- db
- db:database
- redis
此時(shí)悦冀,在容器內(nèi)部趋翻,會(huì)在/etc/hosts文件中用別名創(chuàng)建幾個(gè)條目,如下:
172.17.2.100 db
172.17.2.100 database
172.17.2.100 redis
external_links
鏈接到compose外部啟動(dòng)的容器盒蟆,特別是對于提供共享和公共服務(wù)的容器踏烙。在指定容器名稱和別名時(shí)师骗,external_links遵循著和links相同的語義用法
示例:
external_links:
- redis_1
- project_db_1: mysql
- project_db_2: postgresql
ports
暴露端口,指定宿主機(jī)到容器的端口映射讨惩,或者只指定容器的端口辟癌,則表示映射到主機(jī)上的隨機(jī)端口
注:當(dāng)以 主機(jī):容器 的形式來映射端口時(shí),如果使容器的端口小于60荐捻,那可能會(huì)出現(xiàn)錯(cuò)誤黍少,因?yàn)閅AML會(huì)將 xx:yy這樣格式的數(shù)據(jù)解析為六十進(jìn)制的數(shù)據(jù),基于這個(gè)原因靴患,時(shí)刻記得要將端口映射明確指定為字符串
示例:
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose
暴露端口仍侥,但不需要建立與宿主機(jī)的映射,只是會(huì)向鏈接的服務(wù)提供
示例:
expose:
- "3000"
- "8000"
environment
加入環(huán)境變量鸳君,可以使用數(shù)組或者字典,只有一個(gè)key的環(huán)境變量可以在運(yùn)行compose的機(jī)器上找到對應(yīng)的值
示例:
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV: development
- SESSION_SECRET:
env_file
從一個(gè)文件中引入環(huán)境變量患蹂,該文件可以是一個(gè)單獨(dú)的值或者一個(gè)列表或颊,如果同時(shí)定義了environment,則environment中的環(huán)境變量會(huì)重寫這些值
示例:
env_file:
- env
cat env
RACK_ENV: development
depends_on
定義當(dāng)前服務(wù)啟動(dòng)時(shí)传于,依賴的服務(wù)囱挑,當(dāng)前服務(wù)會(huì)在依賴的服務(wù)啟動(dòng)后啟動(dòng)
depends_on:
- redis
deploy
該配置項(xiàng)在version 3里才引入,用于指定服務(wù)部署和運(yùn)行時(shí)相關(guān)的參數(shù)
version: '3'
services:
redis:
image: redis:alpine
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
下面是deploy中常用參數(shù)的說明
replicas
指定副本數(shù):
version: '3'
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
replicas: 6
restart_policy
指定重啟策略:
version: "3"
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure #重啟條件:on-failure, none, any
delay: 5s # 等待多長時(shí)間嘗試重啟
max_attempts: 3 #嘗試的次數(shù)
window: 120s # 在決定重啟是否成功之前等待多長時(shí)間
update_config
定義更新服務(wù)的方式沼溜,常用于滾動(dòng)更新
version: '3.4'
services:
vote:
image: dockersamples/examplevotingapp_vote:before
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2 # 一次更新2個(gè)容器
delay: 10s # 開始下一組更新之前平挑,等待的時(shí)間
failure_action:pause # 如果更新失敗,執(zhí)行的動(dòng)作:continue, rollback, pause系草,默認(rèn)為pause
max_failure_ratio: 20 # 在更新過程中容忍的失敗率
order: stop-first # 更新時(shí)的操作順序通熄,停止優(yōu)先(stop-first,先停止舊容器找都,再啟動(dòng)新容器)還是開始優(yōu)先(start-first唇辨,先啟動(dòng)新容器,再停止舊容器)能耻,默認(rèn)為停止優(yōu)先赏枚,從version 3.4才引入該配置項(xiàng)
resources
限制服務(wù)資源:
version: '3'
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
healthcheck
執(zhí)行健康檢查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] # 用于健康檢查的指令
interval: 1m30s # 間隔時(shí)間
timeout: 10s # 超時(shí)時(shí)間
retries: 3 # 重試次數(shù)
start_period: 40s # 啟動(dòng)多久后開始檢查
network_mode
網(wǎng)絡(luò)類型,可指定容器運(yùn)行的網(wǎng)絡(luò)類型
示例:
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
dns
自定義dns服務(wù)
示例:
dns: 8.8.8
dns:
- 223.5.5.5
- 223.6.6.6
networks
網(wǎng)絡(luò)決定了服務(wù)之間以及服務(wù)和外界之間如何去通信晓猛,在執(zhí)行docker-compose up的時(shí)候饿幅,docker會(huì)默認(rèn)創(chuàng)建一個(gè)默認(rèn)網(wǎng)絡(luò),創(chuàng)建的服務(wù)也會(huì)默認(rèn)的使用這個(gè)默認(rèn)網(wǎng)絡(luò)戒职。服務(wù)和服務(wù)之間栗恩,可以使用服務(wù)的名字進(jìn)行通信,也可以自己創(chuàng)建網(wǎng)絡(luò)帕涌,并將服務(wù)加入到這個(gè)網(wǎng)絡(luò)之中摄凡,這樣服務(wù)之間可以相互通信续徽,而外界不能夠與這個(gè)網(wǎng)絡(luò)中的服務(wù)通信,可以保持隔離性亲澡。
在networks中定義一個(gè)名為app_net钦扭,類型為driver的網(wǎng)絡(luò):
version: '2'
services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10
networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.168.238.254
volumes
version: "3.2"
services:
web:
image: nginx:alpine
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
db:
image: postgres:latest
volumes:
- "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
- "dbdata:/var/lib/postgresql/data"
volumes:
mydata:
dbdata:
6、Docker Compose案例實(shí)踐
1床绪、部署一個(gè)web集群
項(xiàng)目說明
這是一個(gè)典型的web項(xiàng)目客情,由一個(gè)haproxy容器加三個(gè)web容器組成。haproxy在前端充當(dāng)負(fù)載均衡器癞己,反向代理到后臺(tái)三個(gè)服務(wù)服務(wù)膀斋。
基本目錄結(jié)構(gòu)
首先創(chuàng)建一個(gè)compose-haproxy-web的目錄,然后在目錄里面痹雅,創(chuàng)建兩個(gè)子目錄:haproxy和web仰担。
在web目錄里包含三個(gè)文件: Dockerfile、index.py绩社、index.html
在haproxy目錄里包含一個(gè)文件: haproxy.cfg
目錄結(jié)構(gòu)如下:
compose-haproxy-web/
├── docker-compose.yml
├── haproxy
│ └── haproxy.cfg
└── web
├── Dockerfile
├── index.html
└── index.py
2 directories, 5 files
web目錄下的index.py提供一個(gè)簡單的http服務(wù)摔蓝,打印出訪問者的ip和實(shí)際的本地IP,內(nèi)容如下:
#!/usr/bin/python
#authors: yeasy.github.com
#date: 2013-07-05
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import socket
import fcntl
import struct
import pickle
from datetime import datetime
from collections import OrderedDict
class HandlerClass(SimpleHTTPRequestHandler):
def get_ip_address(self,ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
def log_message(self, format, *args):
if len(args) < 3 or "200" not in args[1]:
return
try:
request = pickle.load(open("pickle_data.txt","r"))
except:
request=OrderedDict()
time_now = datetime.now()
ts = time_now.strftime('%Y-%m-%d %H:%M:%S')
server = self.get_ip_address('eth0')
host=self.address_string()
addr_pair = (host,server)
if addr_pair not in request:
request[addr_pair]=[1,ts]
else:
num = request[addr_pair][0]+1
del request[addr_pair]
request[addr_pair]=[num,ts]
file=open("index.html", "w")
file.write("<!DOCTYPE html> <html> <body><center><h1><font color=\"blue\" face=\"Georgia, Arial\" size=8><em>HA</em></font> Webpage Visit Results</h1></center>");
for pair in request:
if pair[0] == host:
guest = "LOCAL: "+pair[0]
else:
guest = pair[0]
if (time_now-datetime.strptime(request[pair][1],'%Y-%m-%d %H:%M:%S')).seconds < 3:
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +": <font color=\"red\">"+str(request[pair][0])+ "</font> requests " + "from <<font color=\"blue\">"+guest+"</font>> to WebServer <<font color=\"blue\">"+pair[1]+"</font>></p>")
else:
file.write("<p style=\"font-size:150%\" >#"+ str(request[pair][1]) +": <font color=\"maroon\">"+str(request[pair][0])+ "</font> requests " + "from <<font color=\"navy\">"+guest+"</font>> to WebServer <<font color=\"navy\">"+pair[1]+"</font>></p>")
file.write("</body> </html>");
file.close()
pickle.dump(request,open("pickle_data.txt","w"))
if __name__ == '__main__':
try:
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
addr = len(sys.argv) < 2 and "0.0.0.0" or sys.argv[1]
port = len(sys.argv) < 3 and 80 or int(sys.argv[2])
HandlerClass.protocol_version = Protocol
httpd = ServerClass((addr, port), HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
except:
exit()
web目錄下index.html文件是一個(gè)空文件愉耙,在程序啟動(dòng)之后會(huì)用到贮尉。
web目錄下Dockerfile內(nèi)容如下:
FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py
haproxy目錄下的haproxy.cfg內(nèi)容如下:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen stats
bind 0.0.0.0:70
stats enable
stats uri /
frontend balancer
bind 0.0.0.0:80
mode http
default_backend web_backends
backend web_backends
mode http
option forwardfor
balance roundrobin
server weba weba:80 check
server webb webb:80 check
server webc webc:80 check
option httpchk GET /
http-check expect status 200
配置docker-compose
docker-compose.yml內(nèi)容如下:
version: '3'
services:
weba:
build: ./web
expose:
- 80
webb:
build: ./web
expose:
- 80
webc:
build: ./web
expose:
- 80
haproxy:
image: haproxy:latest
volumes:
- ./haproxy:/haproxy-override
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
links:
- weba
- webb
- webc
ports:
- "80:80"
- "70:70"
expose:
- "80"
- "70"
啟動(dòng)docker-compose:
docker-compose up -d
通過驗(yàn)證,我們可以看到服務(wù)正常部署朴沿,訪問http://127.0.0.1:80也可以完成服務(wù)的正常訪問猜谚。但是在前面,我們講過赌渣,weba和webb以及webc都是由同一個(gè)image創(chuàng)建而來魏铅,那么我們是否可以使用deploy配置項(xiàng),直接配置三副本呢锡垄?
我們驗(yàn)證一下沦零,修改docker-compose.yml內(nèi)容如下:
version: '3'
services:
web:
build: ./web
expose:
- 80
deploy:
replicas: 3
haproxy:
image: haproxy:latest
volumes:
- ./haproxy:/haproxy-override
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
external_links:
- compose-haproxy-web_web_1
- compose-haproxy-web_web_2
- compose-haproxy-web_web_3
ports:
- "80:80"
- "70:70"
expose:
- "80"
- "70"
執(zhí)行docker-compose up -d:
root@ubuntu:~/trainning/compose-haproxy-web# docker-compose up -d
WARNING: Some services (web) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.
compose-haproxy-web_web_1 is up-to-date
compose-haproxy-web_haproxy_1 is up-to-date
上面提示deploy不被支持,然后web也只啟動(dòng)了一個(gè)货岭。這是為什么呢路操?
因?yàn)閐eploy在使用的時(shí)候,有一些限制千贯,但你的compose文件中出現(xiàn)如下配置項(xiàng)時(shí)屯仗,deploy就無法使用:
- build
- cgroup_parent
- container_name
- devices
- tmpfs
- external_links
- links
- network_mode
- restart
- security_opt
- stop_signal
- sysctls
- userns_mode
2、使用Docker Compose一鍵部署zabbix
version: '3'
services:
mysql-server:
hostname: mysql-server
container_name: mysql-server
image: mysql:5.7
network_mode: host
volumes:
- /data/mysql5721/data:/var/lib/mysql
command: --character-set-server=utf8
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
zabbix-web-nginx-mysql:
hostname: zabbix-web-nginx-mysql
container_name: zabbix-web-nginx-mysql
image: zabbix/zabbix-web-nginx-mysql:alpine-3.4.11
network_mode: host
depends_on:
- mysql-server
- zabbix-server
ports:
- 80:80
environment:
DB_SERVER_HOST: 127.0.0.1
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: 123456
ZBX_SERVER_HOST: 127.0.0.1
PHP_TZ: Asia/Shanghai
zabbix-server:
hostname: zabbix-server-mysql
container_name: zabbix-server-mysql
image: zabbix/zabbix-server-mysql:alpine-3.4.11
depends_on:
- mysql-server
network_mode: host
ports:
- 10051:10051
environment:
DB_SERVER_HOST: 127.0.0.1
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix
MYSQL_ROOT_PASSWORD: 123456
zabbix-agent:
hostname: zabbix-agent
container_name: zabbix-agent
image: zabbix/zabbix-agent:alpine-3.4.11
network_mode: host
environment:
ZBX_HOSTNAME: monitor
ZBX_SERVER_HOST: 127.0.0.1