Docker Compose多容器部署的實(shí)現(xiàn)
一、wordpress部署
這里先以wordpress的部署為例引出Docker Compose,wordpress的部署需要wordpress和mysql的鏡像:
(一)準(zhǔn)備環(huán)境
1、拉取wordpress鏡像
[root@docker-node1 /]# docker pull wordpress
2、拉取mysql鏡像
[root@docker-node1 /]# docker pull mysql
3、鏡像列表
[root@docker-node1 /]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE wordpress latest 0947f14b932b 25 hours ago 540MB mysql latest 791b6e40940c 43 hours ago 465MB
(二)運(yùn)行鏡像
1、運(yùn)行mysql鏡像
root@docker-node1 /]# docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql b6e7a57a5fcec79f436d3f65240adf833340b4a9640e3b4f9282870078fb8e57
上述命令中 -v指定存儲卷,MYSQL_ROOT_PASSWORD設(shè)置數(shù)據(jù)庫密碼,MYSQL_DATABASE指定創(chuàng)建數(shù)據(jù)庫的名稱,詳情參考:https://hub.docker.com/_/mysql
查看啟動的容器:
[root@docker-node1 /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b6e7a57a5fce mysql "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 3306/tcp, 33060/tcp mysql
2、啟動wordpress鏡像
[root@docker-node1 /]# docker run --name wordpress -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 -d wordpress 6cf0c0fc2ef332728a3ea2bf2dbee65299441b26751d5c64f0a66b329f2679f6
上述命令中WORDPRESS_DB_HOST是需要連接的數(shù)據(jù)庫,指定的就是剛剛創(chuàng)建的mysql容器,這里沒有輸入WORDPRESS_DB_USER、WORDPRESS_DB_PASSWORD的密碼等環(huán)境信息,因?yàn)槟J(rèn)的就是mysql容器的用戶名、密碼,詳情查看:https://hub.docker.com/_/wordpress。
然后查看容器信息:
[root@docker-node1 /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6cf0c0fc2ef3 wordpress "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp wordpress b6e7a57a5fce mysql "docker-entrypoint.s…" 20 minutes ago Up 20 minutes 3306/tcp, 33060/tcp mysql
目前兩個容器都已經(jīng)起來了,最后可以訪問主機(jī)的8080端口即可。
二、Docker Compose
從上面的部署上可以看出存在以下問題:
- 需要單獨(dú)拉取多個容器,一個個的部署
- 需要同時管理多個容器(包括啟動、停止等動作)
那么有沒有一種類似批處理的方式,不需要這么繁瑣的過程呢?這就需要Docker Compose了。
(一)Docker Compose簡介
1、什么是Docker Compose?
Docker Compose是一個工具
這個工具可以通過yml文件來定義多容器的應(yīng)用
通過一條命令就可以根據(jù)yml文件的定義去創(chuàng)建、管理多個容器
2、docker-compose.yml文件
Docker Compose中很重要的就是docker-compose.yml文件,這個文件包含了三個很重要的概念,分別是services、networks以及volumes。
services
一個service就是一個container,這個container可以從dockerhub的image來,也可以從本地的Dockerfile創(chuàng)建的image來;service的啟動類似于docker run,當(dāng)我們在使用docker run 是可以給其指定參數(shù)network和volume,同理也可以給service指定network和volume。
例如:
services: db: image:postgres:9.4 volumes: -"db-data:/var/lib/postgresql/data" networks: -back-tier
上面這個yml文件中定義了一個service,其實(shí)就相當(dāng)于下面這條命令:
docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4
networks
networks: back-tier: driver:bridge
上面這個yml文件中定義了一個network,其實(shí)就相當(dāng)于下面這條命令:
docker network create -d bridge back-tier
volumes
volumes: db-data:
上面這個yml文件中定義了一個volume,其實(shí)就相當(dāng)于下面這條命令:
docker volume create db-data
(二)Docker Compose環(huán)境準(zhǔn)備
Docker Cmpose是一個工具,所以是需要安裝的,安裝詳情參考:https://docs.docker.com/compose/install/。
1、下載可執(zhí)行文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2、設(shè)置權(quán)限
sudo chmod +x /usr/local/bin/docker-compose
3、查看版本
[root@docker-node1 ~]# docker-compose --version docker-compose version 1.24.1, build 4667896
4、docker-compose中的常用命令
[root@docker-node1 compose-wordpress]# docker-compose --help Define and run multi-container applications with Docker. Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml) -p, --project-name NAME Specify an alternate project name (default: directory name) --verbose Show more output --log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) --no-ansi Do not print ANSI control characters -v, --version Print version and exit -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certificate file --tlskey TLS_KEY_PATH Path to TLS key file --tlsverify Use TLS and verify the remote --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate --project-directory PATH Specify an alternate working directory (default: the path of the Compose file) --compatibility If set, Compose will attempt to convert keys in v3 files to their non-Swarm equivalent Commands: build Build or rebuild services bundle Generate a Docker bundle from the Compose file config Validate and view the Compose file create Create services down Stop and remove containers, networks, images, and volumes events Receive real time events from containers exec Execute a command in a running container help Get help on a command images List images kill Kill containers logs View output from containers pause Pause services port Print the public port for a port binding ps List containers pull Pull service images push Push service images restart Restart services rm Remove stopped containers run Run a one-off command scale Set number of containers for a service start Start services stop Stop services top Display the running processes unpause Unpause services up Create and start containers version Show the Docker-Compose version information
docker-compose up
用于啟動service創(chuàng)建容器,執(zhí)行yml文件
docker-compose -d
后臺執(zhí)行容器服務(wù)
docker-compose ps
顯示正在運(yùn)行的容器
docker-compose stop
停止正在運(yùn)行的容器服務(wù)
docker-compose down
停止容器服務(wù),并且移除容器(container)、鏡像(image)、網(wǎng)絡(luò)(network)以及存儲卷(volume)
docker-compose images
顯示通過docker-compose up創(chuàng)建的容器服務(wù)的鏡像列表
docker-compose exec container(Names) bash
進(jìn)入某個容器,可以在容器內(nèi)部進(jìn)行操作
(三)Docker Compose實(shí)戰(zhàn)
1、wordpress
編寫docker-compose.yml文件
version: '3' #docker-compose.yml版本 services: #定義多個容器服務(wù) wordpress: #wordpress容器名稱 image: wordpress #鏡像來源 ports: #端口映射 - 8080:80 environment: #環(huán)境變量 WORDPRESS_DB_HOST: mysql #連接的數(shù)據(jù)庫,就是下面mysql容器的名稱 WORDPRESS_DB_PASSWORD: root #數(shù)據(jù)庫密碼 networks: #使用的網(wǎng)絡(luò),是下面networks中定義的my-bridge - my-bridge mysql: #mysql容器名稱 image: mysql #mysql鏡像 command: --default-authentication-plugin=mysql_native_password #解決數(shù)據(jù)庫密碼加密問題 environment: #環(huán)境變量 MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress volumes: #定義存儲卷,就是下面volumes中定義的 - mysql-data:/var/lib/mysql networks: - my-bridge volumes: mysql-data: networks: my-bridge: driver: bridge
啟動services中的容器
[root@docker-node1 compose-wordpress]# ls docker-compose.yml [root@docker-node1 compose-wordpress]# docker-compose up
通過docker-compose up啟動容器,這個命令默認(rèn)執(zhí)行的就是當(dāng)前目錄下的docker-compose.yml文件,你也可以將這個命令寫完整就是docker-compose -f docker-compose.yml up
2、Flask Web
新建app.py docker-compose.yml Dockerfile三個文件
[root@docker-node1 compose-flask]# ls app.py docker-compose.yml Dockerfile
編寫app.py文件
from flask import Flask from redis import Redis import os app = Flask(__name__) redis = Redis(host=os.environ.get('REDIS_HOST'),port=6379) @app.route('/') def hello(): return 'Hello World' if __name__ == "__main__": app.run(host="0.0.0.0",port=5000,debug=True)
編寫Dockerfile文件
FROM python:2.7 COPY . /app/ WORKDIR /app/ RUN pip install flask redis EXPOSE 5000 CMD ["python","app.py"]
編寫docker-compose.yml文件
version: "3" services: redis: image: redis web: build: context: . dockerfile: Dockerfile ports: - 8080:5000 environment: REDIS_HOST: redis
啟動容器服務(wù)
[root@docker-node1 compose-flask]# docker-compose up
訪問服務(wù)
(四)水平擴(kuò)展和負(fù)載均衡
1、scale
在上面通過Docker Compose完成了flask的應(yīng)用部署,目前運(yùn)行的容器:
[root@docker-node1 compose-flask]# docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------- compose-flask_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp compose-flask_web_1 python app.py Up 0.0.0.0:8080->5000/tcp
通過docker-compose --help命令,可以看到有一個scale參數(shù):
[root@docker-node1 compose-flask]# docker-compose --help scale Set number of containers for a service
它的意思就是可以啟用多個應(yīng)用容器:
[root@docker-node1 compose-flask]# docker-compose up --scale web=3 -d
但是顯然這樣會出錯,為什么呢?因?yàn)槿齻€容器端口映射都是一樣的,必然剩下的兩個應(yīng)用容器會報端口占用的錯誤。此時需要修改一下docker-compose.yml文件將web應(yīng)用的端口那一項(xiàng)配置去掉:
version: "3" services: redis: image: redis web: build: context: . dockerfile: Dockerfile ports: #去掉這一項(xiàng) - 8080:5000 environment: REDIS_HOST: redis
這樣就可以了。
[root@docker-node1 compose-flask]# docker-compose up --scale web=3 -d Recreating compose-flask_web_1 ... Recreating compose-flask_web_1 ... done Recreating compose-flask_web_2 ... done Recreating compose-flask_web_3 ... done
查看容器:
[root@docker-node1 compose-flask]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d0ae3307eb9e compose-flask_web "python app.py" 51 seconds ago Up 46 seconds 5000/tcp compose-flask_web_1 67483b8decd3 compose-flask_web "python app.py" 52 seconds ago Up 47 seconds 5000/tcp compose-flask_web_2 741766d49902 compose-flask_web "python app.py" 52 seconds ago Up 47 seconds 5000/tcp compose-flask_web_3 be3800004658 redis "docker-entrypoint.s…" 5 hours ago Up 6 minutes 6379/tcp compose-flask_redis_1
但是顯然這樣只能在容器內(nèi)去訪問,因?yàn)槎丝跊]有映射出來,那么這樣接下來怎么做呢?
我們接下來可以這樣做,用一個HAProxy的容器來接收請求,然后通過端口轉(zhuǎn)發(fā)給不同的web服務(wù)器,這樣就解決以下問題:
- 外界不能訪問,只能容器內(nèi)訪問
- 負(fù)載均衡
2、水平擴(kuò)展和負(fù)載均衡
文件結(jié)構(gòu)
[root@docker-node1 compose-flask]# ls app.py docker-compose.yml Dockerfile
編寫app.py
from flask import Flask from redis import Redis import os app = Flask(__name__) redis = Redis(host=os.environ.get('REDIS_HOST'),port=6379) @app.route('/') def hello(): return 'Hello World' if __name__ == "__main__": app.run(host="0.0.0.0",port=80,debug=True)
編寫Dockerfile文件
FROM python:2.7 COPY . /app/ WORKDIR /app/ RUN pip install flask redis EXPOSE 80 CMD ["python","app.py"]
編寫docker-compose.yml文件
version: "3" services: redis: image: redis web: build: context: . dockerfile: Dockerfile environment: REDIS_HOST: redis lb: image: dockercloud/haproxy links: - web ports: - 8080:80 volumes: - /var/run/docker.sock:/var/run/docker.sock
運(yùn)行
[root@docker-node1 compose-flask]# docker-compose up -d Creating network "compose-flask_default" with the default driver Creating compose-flask_web_1 ... done Creating compose-flask_redis_1 ... done Creating compose-flask_lb_1 ... done
可以看到啟動了三個容器,分別為:
[root@docker-node1 compose-flask]# docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------------- compose-flask_lb_1 /sbin/tini -- dockercloud- ... Up 1936/tcp, 443/tcp, 0.0.0.0:8080->80/tcp compose-flask_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp compose-flask_web_1 python app.py Up 5000/tcp
我們看到web應(yīng)用目前只有一個,可以啟動多個來處理請求:
[root@docker-node1 compose-flask]# docker-compose up --scale web=5 -d compose-flask_redis_1 is up-to-date Starting compose-flask_web_1 ... done Creating compose-flask_web_2 ... done Creating compose-flask_web_3 ... done Creating compose-flask_web_4 ... done Creating compose-flask_web_5 ... done compose-flask_lb_1 is up-to-date
可以看到,直接將web應(yīng)用啟動了5個容器,分擔(dān)從HAProxy的請求。
到此這篇關(guān)于Docker Compose多容器部署的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Docker Compose多容器部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker安裝tomcat并部署Springboot項(xiàng)目war包的方法
這篇文章主要介紹了docker安裝tomcat并部署Springboot項(xiàng)目war包的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11ubuntu22通過docker安裝wechat啟動后無界面的問題及解決方法
這篇文章主要介紹了ubuntu22通過docker安裝wechat啟動后無界面的解決方法,通過微信創(chuàng)建腳本發(fā)現(xiàn)一系列問題,最終在小編的努力下順利解決,下面把解決過程分享給大家,需要的朋友可以參考下2022-07-07Docker中iptables規(guī)則在iptables重啟后丟失的完整過程
這篇文章主要給大家介紹了關(guān)于Docker中iptables規(guī)則在iptables重啟后丟失的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Docker具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05docker-compose如何實(shí)現(xiàn)滾動更新
這篇文章主要介紹了docker-compose如何實(shí)現(xiàn)滾動更新方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05docker寫一個Dockerfile文件的實(shí)現(xiàn)
Dockerfile 是一個用來構(gòu)建鏡像的文本文件,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說明,本文主要介紹了docker寫一個Dockerfile文件的實(shí)現(xiàn)2024-01-01三分鐘完成 ubuntu16.04初始化,Java,maven,docker環(huán)境的部署問題
這篇文章主要介紹了三分鐘完成 ubuntu16.04初始化,Java,maven,docker環(huán)境的部署問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-11-11Docker下安裝部署Clickhouse及其遠(yuǎn)程訪問方式
文章介紹了如何遠(yuǎn)程拉取和安裝ClickHouse Docker鏡像,配置和部署ClickHouse容器,并通過DataGrip遠(yuǎn)程訪問ClickHouse2024-11-11Docker安裝node-red、導(dǎo)入節(jié)點(diǎn)、部署查看的步驟詳解
Node-RED設(shè)計使用的場景是IoT,但是作為一個流編排引擎,顯然它能做的事情更多,比如使用容器化的方式進(jìn)行構(gòu)建、打包、部署等操作也是可行的,這篇文章繼續(xù)介紹Docker安裝node-red、導(dǎo)入節(jié)點(diǎn)、部署查看的相關(guān)知識,感興趣的朋友一起看看吧2022-01-01