基于Docker-Compose部署应用

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Docker Compose安装

  • 下载Docker Compose

    1. curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  • 修改文件权限为可执行

    1. chmod +x /usr/local/bin/docker-compose
  • 查看Docker Compose 版本

    正常显示版本说明安装成功

  1. docker-compose --version

Docker Compose 使用

Docker Compose 使用需要先编写docker-compose.yml文件来编排容器的环境,然后通过Docker Compose命令来执行docker-compose.yml文件。

使用Dockerfile定义应用程序环境,一般需要修改初始镜像行为时才需要使用,Dockerfile文件可以在docker-compose.yml文件中引入,也可以不使用Dockerfile文件直接编写docker-compose.yml文件

使用docker-compose.yml定义需要部署的应用程序服务,以便执行脚本一次性部署

使用docker-compose up命令将所有应用服务一次性部署起来

Docker Compose Yml文件常用指令

docker-compose.yml文件是用来编排一组容器的的文件,在这个文件中将多个镜像编排在一起组成一个服务,通过docker-compose命令就可以启动编排的所有容器,实现一键启动所有服务。

举个例子:

SpringWeb项目需要连接Myql数据库,所以我们除了部署项目以外还需要安装Mysql数据库。采用Dockerfile的方式,需要分别编写SpringWeb和mysql两个dockerfile文件来分别执行,需要执行两次。采用Docker Compose的方式,我们只需要将SpringWeb和mysql的编排写进docker-compose.yml文件,执行这一个编排文件即可部署和安装好我们的应用,避免多次执行dockerfile文件。

  • images 指定运行的镜像名称

    1. # 运行的是mysql5.7的镜像
    2. image: mysql:5.7
  • container_name 指定容器的名称

    1. # 容器名称为mysql
    2. container_name: mysql
  • ports指定宿主机和容器的端口映射

    1. # 将宿主机的3306端口映射到容器的3306端口
    2. # 宿主机端口:容器开放端口
    3. ports:
    4. - 3306:3306
  • volumes 将宿主机的目录挂载到容器目录

    1. # 将宿主机文件挂载到myql容器中
    2. # 宿主机目录:容器中的目录
    3. volumes:
    4. - /mydata/mysql/log:/var/log/mysql
    5. - /mydata/mysql/data:/var/lib/mysql
    6. - /mydata/mysql/conf:/etc/mysql
  • environment 配置环境变量

    1. # 设置mysqlroot帐号密码的环境变量
    2. environment:
    3. - MYSQL_ROOT_PASSWORD=root
  • external_links 链接其他容器

    1. # 容器名称:别名
    2. # 表示在当前容器中可以用别名的方式访问对应的容器
    3. external_links:
    4. - mysql:database

Docker Compose常用命令

  • 执行Docker-compose文件

    -f 指定docker compose 文件,默认为docker-compose.yml -d表示后台运行

  1. docker-compose -f docker-compose-evn.yml up -d
  • 仅重启修改过的容器

    1. docker-compose --compatibility up -d
  • 停止所有容器

    1. docker-compose stop
  • 列出所有容器信息

    1. docker-compose ps

    Docker Compose部署应用

    Docker Compose将所管理的容器分为三层,工程、服务及容器。docker-compose.yml中定义所有服务组成了一个工程,services节点下即为服务,服务之下为容器。容器与容器直之间可以以服务名称为域名进行访问。

  • docker-compose.yml文件

    1. version: '3'
    2. services:
    3. #指定服务名称
    4. db:
    5. #指定服务使用的镜像
    6. image: mysql:5.7
    7. #指定容器名称
    8. container_name: mysql
    9. #指定服务运行的端口号
    10. ports:
    11. - 3306:3306
    12. #指定容器中需要挂载的文件
    13. volumes:
    14. - /mydata/mysql/log:/var/log/mysql
    15. - /mydata/mysql/data:/var/lib/mysql
    16. - /mydata/mysql/conf:/etc/mysql
    17. #指定容器环境变量
    18. environment:
    19. - MYSQL_ROOT_PASSWORD=root
    20. privileged: true
    21. #指定服务名称
    22. myspring-compose:
    23. #指定服务使用的镜像
    24. image: spring/my-spring:0.0.5-SNAPSHOT
    25. build:
    26. Dockerfile
    27. #指定容器名称
    28. container_name: myspring
    29. #指定服务运行的端口
    30. ports:
    31. - 8080:8080
    32. # 指定使用localhost域名访问db这个容器
    33. links:
    34. - db:localhost
    35. #指定容器中需要挂载的文件
    36. volumes:
    37. - /etc/localtime:/etc/localtime
    38. - /mydata/app/myspring/logs:/var/logs
    39. privileged: true
  • 执行Docker-compose文件

    1. docker-compose -f docker-compose.yml up -d
    1. [root@localhost mall]# docker-compose -f docker-compose.yml up -d
    2. WARNING: Found orphan containers (kibana, logstash, mongo, rabbitmq, elasticsearch, nginx, redis) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
    3. Creating myspring ... done
    4. Creating mysql-compose ... done
  • 查看容器 ```properties [root@localhost mall]# docker-compose ps Name Command State Ports


myspring java -jar /my-spring-0.0.5 … Up 0.0.0.0:8080->8080/tcp
mysql-compose docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp

  1. <a name="NeaBm"></a>
  2. ### Docker Compose 安装RocketMQ
  3. - docker-compose.yml 文件
  4. ```yaml
  5. version: '3.5'
  6. services:
  7. rmqnamesrv:
  8. image: foxiswho/rocketmq:server
  9. container_name: rmqnamesrv
  10. ports:
  11. - 9876:9876
  12. volumes:
  13. - ./data/logs:/opt/logs
  14. - ./data/store:/opt/store
  15. networks:
  16. rmq:
  17. aliases:
  18. - rmqnamesrv
  19. rmqbroker:
  20. image: foxiswho/rocketmq:broker
  21. container_name: rmqbroker
  22. ports:
  23. - 10909:10909
  24. - 10911:10911
  25. volumes:
  26. - ./data/logs:/opt/logs
  27. - ./data/store:/opt/store
  28. - ./data/brokerconf/broker.conf:/etc/rocketmq/broker.conf
  29. environment:
  30. NAMESRV_ADDR: "rmqnamesrv:9876"
  31. JAVA_OPTS: " -Duser.home=/opt"
  32. JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m"
  33. command: mqbroker -c /etc/rocketmq/broker.conf
  34. depends_on:
  35. - rmqnamesrv
  36. networks:
  37. rmq:
  38. aliases:
  39. - rmqbroker
  40. rmqconsole:
  41. image: styletang/rocketmq-console-ng
  42. container_name: rmqconsole
  43. ports:
  44. - 8080:8080
  45. environment:
  46. JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
  47. depends_on:
  48. - rmqnamesrv
  49. networks:
  50. rmq:
  51. aliases:
  52. - rmqconsole
  53. networks:
  54. rmq:
  55. name: rmq
  56. driver: bridge
  • broker.conf配置文件 ```properties

    Licensed to the Apache Software Foundation (ASF) under one or more

    contributor license agreements. See the NOTICE file distributed with

    this work for additional information regarding copyright ownership.

    The ASF licenses this file to You under the Apache License, Version 2.0

    (the “License”); you may not use this file except in compliance with

    the License. You may obtain a copy of the License at

    #

    http://www.apache.org/licenses/LICENSE-2.0

    #

    Unless required by applicable law or agreed to in writing, software

    distributed under the License is distributed on an “AS IS” BASIS,

    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    See the License for the specific language governing permissions and

    limitations under the License.

所属集群名字

brokerClusterName=DefaultCluster

broker 名字,注意此处不同的配置文件填写的不一样,如果在 broker-a.properties 使用: broker-a,

在 broker-b.properties 使用: broker-b

brokerName=broker-a

0 表示 Master,> 0 表示 Slave

brokerId=0

nameServer地址,分号分割

namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876

启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.0.120:10909> failed

解决方式1 加上一句 producer.setVipChannelEnabled(false);,解决方式2 brokerIP1 设置宿主机IP,不要使用docker 内部IP

brokerIP1=192.168.0.253

在发送消息时,自动创建服务器不存在的topic,默认创建的队列数

defaultTopicQueueNums=4

是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!这里仔细看是 false,false,false

autoCreateTopicEnable=true

是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭

autoCreateSubscriptionGroup=true

Broker 对外服务的监听端口

listenPort=10911

删除文件时间点,默认凌晨4点

deleteWhen=04

文件保留时间,默认48小时

fileReservedTime=120

commitLog 每个文件的大小默认1G

mapedFileSizeCommitLog=1073741824

ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整

mapedFileSizeConsumeQueue=300000

destroyMapedFileIntervalForcibly=120000

redeleteHangedFileInterval=120000

检测物理文件磁盘空间

diskMaxUsedSpaceRatio=88

存储路径

storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store

commitLog 存储路径

storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog

消费队列存储

storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue

消息索引存储路径

storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index

checkpoint 文件存储路径

storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint

abort 文件存储路径

abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort

限制的消息大小

maxMessageSize=65536

flushCommitLogLeastPages=4

flushConsumeQueueLeastPages=2

flushCommitLogThoroughInterval=10000

flushConsumeQueueThoroughInterval=60000

Broker 的角色

- ASYNC_MASTER 异步复制Master

- SYNC_MASTER 同步双写Master

- SLAVE

brokerRole=ASYNC_MASTER

刷盘方式

- ASYNC_FLUSH 异步刷盘

- SYNC_FLUSH 同步刷盘

flushDiskType=ASYNC_FLUSH

发消息线程池数量

sendMessageThreadPoolNums=128

拉消息线程池数量

pullMessageThreadPoolNums=128

  1. - 执行docker-compose.yml 文件
  2. ```shell
  3. docker-compose -f docker-compose.yml up -d