多开软件容器

多开软件容器,第1张

DockerCompose多容器部署的实现

本文主要介绍DockerCompose多容器部署的实现,通过示例代码进行了详细介绍,对大家的学习或工作有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。

一、wordpress部署

这里以wordpress的部署为例介绍DockerCompose。wordpress的部署需要wordpress和mysql的映像:

(一)准备环境

1.拉wordpress图片

[root@docker-node1/]#dockerpullwordpress

2.拉mysql图像

[root@docker-node1/]#dockerpullmysql

3.镜像列表

[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/tcpmysql

2.启动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-compose

    2.设置权限

    sudochmod+x/usr/local/bin/docker-compose

    3.检查版本。

    [root@docker-node1~]#docker-compose--version docker-composeversion1.24.1,build4667896

    4.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-Composeversioninformation

    docker-排版

    用于启动服务创建容器和执行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文件

    FROMpython:2.7 COPY./app/ WORKDIR/app/ RUNpipinstallflaskredis EXPOSE5000 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

    启动容器服务

    [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多容器部署的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/zz/774266.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存