Docker部署apollo的教程以及我踩的坑

                                 apollo的Docker化以及我踩的坑

首先阅读本文需要掌握的知识点:mysql、docker、apollo、linux的常用命令。

  • 环境准备

1.1 Linux

我使用的时cenos7操作系统,这个安装就不说了,要么用服务器要么用虚拟机。

1.2 Docker

我使用的版本是version19.03.5,安装和配置的详情请看我前面的文章Docker的入门理解、Docker安装与配置、Docker常用命令。

1.3 MySql

MySql数据库,可docker化,我使用docker化的mysql,这里有个小坑,坑了我一天时间。下面介绍Docker化mysql的安装。

 

获取镜像命令:

 

(原Docker镜像官方仓库,有可能网络会卡住)

docker pull mysql

 

或者

 

(网易云的Docker镜像仓库)

docker pull hub.c.163.com/library/mysql:latest

 

启动mysql镜像命令:

docker pull hub.c.163.com/library/mysql:latest

 pull后面跟的是镜像名或者id

1.4 Apollo(携程阿波罗)

首先从github上下载apollo项目

开源地址:https://github.com/ctripcorp/apollo

1.4.1 初始化数据库

下载后得到一个这样的项目结构

Docker部署apollo的教程以及我踩的坑_第1张图片

                                              图1

        连接刚刚docker化的mysql数据库。

        把项目中路径为scripts/db/docker-quick-start/sql/apolloconfigdb.sql和scripts/db/docker-quick-start/sql/apolloportaldb.sql(图1中红色框)的两个sql文件里的代码复制或者导入到你的数据库管理软件中执行,执行后得到ApolloConfigDB和ApolloPortalDB两个数据库。

Docker部署apollo的教程以及我踩的坑_第2张图片

可修改图中红框地址为你的eureka注册中心地址

Docker部署apollo的教程以及我踩的坑_第3张图片

        这里可修改环境的名字和个数,用逗号分隔,例如:dev,fat,uat,pro

       

 网络策略(来自官网)

        分布式部署的时候,apollo-configservice和apollo-adminservice需要把自己的IP和端口注册到Meta Server(apollo-configservice本身)。

        Apollo客户端和Portal会从Meta Server获取服务的地址(IP+端口),然后通过服务地址直接访问。

        所以如果实际部署的机器有多块网卡(如docker),或者存在某些网卡的IP是Apollo客户端和Portal无法访问的(如网络安全限制),那么我们就需要在apollo-configservice和apollo-adminservice中做相关限制以避免Eureka将这些网卡的IP注册到Meta Server。

        如下面这个例子就是对于apollo-configservice,把docker0和veth.* 的网卡在注册到Eureka时忽略掉。

spring:
  application:
      name: apollo-configservice
  profiles:
    active: ${apollo_profile}
  cloud:
    inetutils:
      ignoredInterfaces:
        - docker0
        - veth.*

        在apollo-configservice\src\main\resources\application.yml和apollo-adminservice\src\main\resources\application.yml里加入这个忽略规则。

        随后双击编辑build.sh执行文件(图1中黄色框)。

Docker部署apollo的教程以及我踩的坑_第4张图片

                                                                                                    图2

        修改图2中红框的数据,第一个为ApolloConfigDB数据的连接信息,第二个为ApolloPortalDB数据的连接信息。第三个为各个环境下对应的configservice服务地址。我这里测试只设了一个dev测试地址,所以只改了一个dev的。

        使用windows下使用cmd命令或者直接在idea的Terminal下进入到项目中的scripts目录下执行可执行文件build.sh(或者打开文件夹双击执行也行)。

        等待执行完后把项目中apollo-adminservice、apollo-configservice、apollo-portal三个文件夹通过文件传输工具传入虚拟机的cenos7操作系统中

Docker部署apollo的教程以及我踩的坑_第5张图片

        随后把三个文件夹各自对应的路径/apollo-adminservice/target、/apollo-configservice/target、/apollo-portal/target中的zip包拷贝到对应目录分别为/apollo-adminservice/src/main/docker、/apollo-configservice/src/main/docker、/apollo-portal/src/main/docker中。

Docker部署apollo的教程以及我踩的坑_第6张图片

Docker部署apollo的教程以及我踩的坑_第7张图片

然而这里还有一个要注意的点,毕竟8080端口太常用,所以我希望把三个服务的端口都改一改,所以这里需要把每个服务对应的Dockerfile文件里对应的端口都改一下。

Docker部署apollo的教程以及我踩的坑_第8张图片

像这样,把8070改为9070,另外的两个Dockerfile也改一下。

随后到刚刚的apollo-adminservice、apollo-configservice、apollo-portal三个文件夹的同级目录下创建一个docker-compose.yml文件:

Docker部署apollo的教程以及我踩的坑_第9张图片

文件内容是:

version: "3"

services:
  apollo-configservice:                                         ##容器服务名
    container_name: apollo-configservice                        ##容器名
    build: apollo-configservice/src/main/docker/                ##Dockerfile路径
    image: apollo-configservice:1.6.0                           ##镜像名
    ports:
      - "9080:9080"    
    volumes:
      - "/opt/logs/100003171:/opt/logs/100003171"    ##将/opt/logs/100003171目录挂载到宿主机的/opt/logs/100003171方便在宿主机上查看日志
    environment:
      - spring_datasource_url=jdbc:mysql://192.168.241.10:3306/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username=root
      - spring_datasource_password=123456
      - eureka.instance.ip-address=192.168.241.10
      
    restart: always

  apollo-adminservice:
    container_name: apollo-adminservice
    build: apollo-adminservice/src/main/docker/
    image: apollo-adminservice:1.6.0
    ports:
      - "9090:9090"
    depends_on:
      - apollo-configservice
    volumes:
      - "/opt/logs/100003172:/opt/logs/100003172"
    environment:
      - spring_datasource_url=jdbc:mysql://192.168.241.10:3306/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username=root
      - spring_datasource_password=123456
      - eureka.instance.ip-address=192.168.241.10
      
    restart: always

  apollo-portal:
    container_name: apollo-portal
    build: apollo-portal/src/main/docker/
    image: apollo-portal:1.6.0
    ports:
      - "9070:9070"
    depends_on:
      - apollo-adminservice
    volumes:
      - "/opt/logs/100003173:/opt/logs/100003173"
    environment:
      - spring_datasource_url=jdbc:mysql://192.168.241.10:3306/ApolloPortalDB?characterEncoding=utf8
      - spring_datasource_username=root
      - spring_datasource_password=123456
      
    restart: always

在此目录下执行命令:

docker-compose up -d

利用docker compose命令直接一步做到构建三个镜像,docker运行三个镜像(也可以一个个来自己构建和运行,通过他自带的那个Dockerfile一个命令就能构建镜像)。

docker compose需要安装,安装方法就不说了,忘了,请移步自行百度。

Docker部署apollo的教程以及我踩的坑_第10张图片

构建和启动成功!!

随后在我高兴了不到一分钟,发现这三个apollo的docker容器都停了!

        查看日志发现报错just quit unexpectedly, please check logs under /opt/logs/100003171 and /tmp for more information!

        然后再进入对应目录查看运行日志发现原因是连不上数据库?我数据库明明都开了,在我windows上都能通过数据库管理软件连上去进行建表操作,所以排除了数据库没运行起来的可能。

        辗转反侧,到处查资料,发现原因是需要关闭linux防火墙。。。

命令:

systemctl stop firewalld.service

然后再重新启动镜像,运行成功,值得一提的是,一个个运行镜像的话按照configservice、adminservice、portal顺序启动。

Docker部署apollo的教程以及我踩的坑_第11张图片

Docker部署apollo的教程以及我踩的坑_第12张图片

运行成功!

你可能感兴趣的:(Docker,linux,apollo)