本文主要介绍DockerCompose多容器部署的实现,通过示例代码进行了详细介绍,对大家的学习或工作有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。
一、wordpress部署这里以wordpress的部署为例介绍DockerCompose。wordpress的部署需要wordpress和mysql的映像:
(一)准备环境1.拉wordpress图片
[root@docker-node1/]#dockerpullwordpress2.拉mysql图像
[root@docker-node1/]#dockerpullmysql3.镜像列表
[root@docker-node1/]#dockerimagels REPOSITORYTAGIMAGEIDCREATEDSIZE wordpresslatest0947f14b932b25hoursago540MB mysqllatest791b6e40940c43hoursago465MB (二)运行镜像1.运行mysql图像
root@docker-node1/]#dockerrun-d--namemysql-vmysql-data:/var/lib/mysql-eMYSQL_ROOT_PASSWORD=root-eMYSQL_DATABASE=wordpressmysql b6e7a57a5fcec79f436d3f65240adf833340b4a9640e3b4f9282870078fb8e57在上面的命令中,-v指定存储卷,MYSQL_ROOT_PASSWORD设置数据库密码,MYSQL_DATABASE指定创建的数据库的名称。详情请参考https://hub.docker.com/_/mysql.
已启动的容器:
[root@docker-node1/]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES b6e7a57a5fcemysql"docker-entrypoint.s…"6minutesagoUp6minutes3306/tcp,33060/tcpmysql2.启动wordpress图片
[root@docker-node1/]#dockerrun--namewordpress-eWORDPRESS_DB_HOST=mysql:3306--linkmysql-p8080:80-dwordpress 6cf0c0fc2ef332728a3ea2bf2dbee65299441b26751d5c64f0a66b329f2679f6在上面的命令中,WORDPRESS_DB_HOST是要连接的数据库,指定的mysql容器是刚刚创建的。这里没有WORDPRESS_DB_USER、WORDPRESS_DB_PASSWORD等环境信息,因为默认是mysql容器的用户名和密码。详情见https://hub.docker.com/_/wordpress。
然后检查容器信息:
[root@docker-node1/]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 6cf0c0fc2ef3wordpress"docker-entrypoint.s…"3minutesagoUp3minutes0.0.0.0:8080->80/tcpwordpress b6e7a57a5fcemysql"docker-entrypoint.s…"20minutesagoUp20minutes3306/tcp,33060/tcpmysql目前两个容器都是up的,终于可以访问主机的8080端口了。
二、DockerCompose从以上部署可以看出,存在以下问题:
那么有没有一种类似于批处理的方式,不需要这么繁琐的过程呢?这需要DockerCompose。
(一)DockerCompose简介1.什么是DockerCompose?
DockerCompose是一个工具。
这个工具可以通过yml文件定义多容器应用程序。
使用一个命令,您可以根据yml文件的定义创建和管理多个容器。
2.docker-compose.yml文件
DockerCompose中的重要文件是docker-compose.yml,其中包含了三个重要的概念,即服务、网络和卷。
服务
服务是一个容器,可以来自dockerhub的镜像,也可以来自本地Dockerfile创建的镜像;服务的启动类似于docker运行。当我们使用dockerrun时,我们可以指定参数network和volume,同样,我们也可以为服务指定network和volume。
例如:
services: db: image:postgres:9.4 volumes: -"db-data:/var/lib/postgresql/data" networks: -back-tier上面的yml文件定义了一个服务,它实际上相当于下面的命令:
dockerrun-d--networkback-tier-vdb-data:/var/lib/postgresql/datapostgres:9.4网络
networks: back-tier: driver:bridge上面的yml文件定义了一个网络,它实际上相当于下面的命令:
dockernetworkcreate-dbridgeback-tier卷
volumes: db-data:上面的yml文件中定义了一个卷,它实际上相当于下面的命令:
dockervolumecreatedb-data (二)DockerCompose环境准备DockerCmpose是一个工具,所以需要安装。有关安装详情,请参考https://docs.docker.com/compose/install/.
1.下载可执行文件。
sudocurl-L"https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname-s)-$(uname-m)"-o/usr/local/bin/docker-compose2.设置权限
sudochmod+x/usr/local/bin/docker-compose3.检查版本。
[root@docker-node1~]#docker-compose--version docker-composeversion1.24.1,build46678964.docker-compose中的常用命令
[root@docker-node1compose-wordpress]#docker-compose--help Defineandrunmulti-containerapplicationswithDocker. Usage: docker-compose[-f<arg>...][options][COMMAND][ARGS...] docker-compose-h|--help Options: -f,--fileFILESpecifyanalternatecomposefile (default:docker-compose.yml) -p,--project-nameNAMESpecifyanalternateprojectname (default:directoryname) --verboseShowmoreoutput --log-levelLEVELSetloglevel(DEBUG,INFO,WARNING,ERROR,CRITICAL) --no-ansiDonotprintANSIcontrolcharacters -v,--versionPrintversionandexit -H,--hostHOSTDaemonsockettoconnectto --tlsUseTLS;impliedby--tlsverify --tlscacertCA_PATHTrustcertssignedonlybythisCA --tlscertCLIENT_CERT_PATHPathtoTLScertificatefile --tlskeyTLS_KEY_PATHPathtoTLSkeyfile --tlsverifyUseTLSandverifytheremote --skip-hostname-checkDon'tcheckthedaemon'shostnameagainstthe namespecifiedintheclientcertificate --project-directoryPATHSpecifyanalternateworkingdirectory (default:thepathoftheComposefile) --compatibilityIfset,Composewillattempttoconvertkeys inv3filestotheirnon-Swarmequivalent Commands: buildBuildorrebuildservices bundleGenerateaDockerbundlefromtheComposefile configValidateandviewtheComposefile createCreateservices downStopandremovecontainers,networks,images,andvolumes eventsReceiverealtimeeventsfromcontainers execExecuteacommandinarunningcontainer helpGethelponacommand imagesListimages killKillcontainers logsViewoutputfromcontainers pausePauseservices portPrintthepublicportforaportbinding psListcontainers pullPullserviceimages pushPushserviceimages restartRestartservices rmRemovestoppedcontainers runRunaone-offcommand scaleSetnumberofcontainersforaservice startStartservices stopStopservices topDisplaytherunningprocesses unpauseUnpauseservices upCreateandstartcontainers versionShowtheDocker-Composeversioninformationdocker-排版
用于启动服务创建容器和执行yml文件。
docker-compose-d
在后台执行容器服务
docker-撰写ps
显示正在运行的容器。
docker-撰写停止
停止正在运行的容器服务。
docker-向下合成
停止容器服务,并删除容器、映像、网络和存储卷。
docker-合成图像
显示通过docker-composeup创建的容器服务的镜像列表。
docker-composeexec容器(名称)bash
进入一个容器,就可以在容器里面 *** 作。
(三)DockerCompose实战1、wordpress
编写docker-compose.yml文件。
version:'3'#docker-compose.yml版本 services:#定义多个容器服务 wordpress:#wordpress容器名称 image:wordpress#镜像来源 ports:#端口映射 -8080:80 environment:#环境变量 WORDPRESS_DB_HOST:mysql#连接的数据库,就是下面mysql容器的名称 WORDPRESS_DB_PASSWORD:root#数据库密码 networks:#使用的网络,是下面networks中定义的my-bridge -my-bridge mysql:#mysql容器名称 image:mysql#mysql镜像 command:--default-authentication-plugin=mysql_native_password#解决数据库密码加密问题 environment:#环境变量 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在服务中启动容器
[root@docker-node1compose-wordpress]#ls docker-compose.yml [root@docker-node1compose-wordpress]#docker-composeup通过docker-composeup启动容器。默认情况下,该命令将执行当前目录中的docker-compose.yml文件。也可以把这个命令完整地写成docker-compose-fdocker-compose.ymlup。
2、烧瓶网
创建三个新文件:app.pydocker-compose.ymldockerfile。
[root@docker-node1compose-flask]#ls app.pydocker-compose.ymlDockerfile编写app.py文件
fromflaskimportFlask fromredisimportRedis importos app=Flask(__name__) redis=Redis(host=os.environ.get('REDIS_HOST'),port=6379) @app.route('/') defhello(): return'HelloWorld' if__name__=="__main__": app.run(host="0.0.0.0",port=5000,debug=True)编写Dockerfile文件
编写docker-compose.yml文件。
version:"3" services: redis: image:redis web: build: context:. dockerfile:Dockerfile ports: -8080:5000 environment: REDIS_HOST:redis启动容器服务
[root@docker-node1compose-flask]#docker-composeup访问服务
(四)水平扩展和负载均衡1、标度
flask的应用部署已经通过上面的DockerCompose完成,当前运行的容器是:
[root@docker-node1compose-flask]#docker-composeps NameCommandStatePorts --------------------------------------------------------------------------------------- compose-flask_redis_1docker-entrypoint.shredis...Up6379/tcp compose-flask_web_1pythonapp.pyUp0.0.0.0:8080->5000/tcp使用docker-compose-help命令,您可以看到有一个scale参数:
[root@docker-node1compose-flask]#docker-compose--help scaleSetnumberofcontainersforaservice这意味着可以启用多个应用程序容器:
[root@docker-node1compose-flask]#docker-composeup--scaleweb=3-d但显然这会出错。为什么?因为三个容器的端口映射是一样的,所以剩下的两个应用容器难免会报错端口占用。此时,您需要修改docker-compose.yml文件来删除web应用程序的端口配置:
version:"3" services: redis: image:redis web: build: context:. dockerfile:Dockerfile ports:#去掉这一项 -8080:5000 environment: REDIS_HOST:redis就是这样。
[root@docker-node1compose-flask]#docker-composeup--scaleweb=3-d Recreatingcompose-flask_web_1... Recreatingcompose-flask_web_1...done Recreatingcompose-flask_web_2...done Recreatingcompose-flask_web_3...done查看容器:
[root@docker-node1compose-flask]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES d0ae3307eb9ecompose-flask_web"pythonapp.py"51secondsagoUp46seconds5000/tcpcompose-flask_web_1 67483b8decd3compose-flask_web"pythonapp.py"52secondsagoUp47seconds5000/tcpcompose-flask_web_2 741766d49902compose-flask_web"pythonapp.py"52secondsagoUp47seconds5000/tcpcompose-flask_web_3 be3800004658redis"docker-entrypoint.s…"5hoursagoUp6minutes6379/tcpcompose-flask_redis_1但是很明显,这只能在容器中访问,因为端口没有映射,那么接下来该怎么办呢?
接下来我们可以这样做,使用HAProxy的一个容器接收请求,然后通过端口转发到不同的web服务器,这样就解决了以下问题:
2.水平扩展和负载平衡
文件结构
[root@docker-node1compose-flask]#ls app.pydocker-compose.ymlDockerfile编写app.py
fromflaskimportFlask fromredisimportRedis importos app=Flask(__name__) redis=Redis(host=os.environ.get('REDIS_HOST'),port=6379) @app.route('/') defhello(): return'HelloWorld' if__name__=="__main__": app.run(host="0.0.0.0",port=80,debug=True)写Dockerfile文件
FROMpython:2.7 COPY./app/ WORKDIR/app/ RUNpipinstallflaskredis EXPOSE80 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奔跑
[root@docker-node1compose-flask]#docker-composeup-d Creatingnetwork"compose-flask_default"withthedefaultdriver Creatingcompose-flask_web_1...done Creatingcompose-flask_redis_1...done Creatingcompose-flask_lb_1...done您可以看到启动了三个容器,即:
[root@docker-node1compose-flask]#docker-composeps NameCommandStatePorts --------------------------------------------------------------------------------------------------- compose-flask_lb_1/sbin/tini--dockercloud-...Up1936/tcp,443/tcp, 0.0.0.0:8080->80/tcp compose-flask_redis_1docker-entrypoint.shredis...Up6379/tcp compose-flask_web_1pythonapp.pyUp5000/tcp我们看到目前只有一个web应用程序,可以启动多个来处理请求:
[root@docker-node1compose-flask]#docker-composeup--scaleweb=5-d compose-flask_redis_1isup-to-date Startingcompose-flask_web_1...done Creatingcompose-flask_web_2...done Creatingcompose-flask_web_3...done Creatingcompose-flask_web_4...done Creatingcompose-flask_web_5...done compose-flask_lb_1isup-to-date可以看到,web应用程序被直接启动到五个容器中,以共享来自HAProxy的请求。
这就是本文关于DockerCompose多容器部署的实现。有关DockerCompose多容器部署的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)