1. 程式人生 > >Docker搭建disconf環境,三部曲之三:細說搭建過程

Docker搭建disconf環境,三部曲之三:細說搭建過程

Docker下的disconf實戰全文連結

  1. 《Docker搭建disconf環境,三部曲之一:極速搭建disconf》;
  2. 《Docker搭建disconf環境,三部曲之二:本地快速構建disconf映象》;
  3. 《Docker搭建disconf環境,三部曲之三:細說搭建過程》;
  4. 《Docker下使用disconf:極速體驗》;
  5. 《Docker下使用disconf:細說demo開發》;

細說搭建過程

在前兩章中,我們利用遠端或本地的映象,快速體驗了本地啟動disconf的過程,本章我們一起來分析和梳理整個定製和搭建過程,瞭解這些後,我們就能根據自己的需要來定製本地的disconf環境了。

以下兩點請注意

  1. 本機環境已經安裝了maven,並且把maven的bin目錄配置到環境變數PATH下;
  2. 編譯編譯disconf原始碼時,要用到官方shell指令碼,所以本次實踐的作業系統建議用linux或mac,如果用windows,有三種方法:一個是把shell改成bat指令碼,一個是用虛擬機器的linux,還有一種是用在docker上搭建一個maven容器,把disconf原始碼放在這個容器下編譯;

先分析再實戰

首先把disconf環境依賴的所有server都列出來:

  1. redis<無需定製,用官方映象>
  2. zookeeper<無需定製,用官方映象>
  3. mysql<定製,建立庫,表,匯入初始化資料>
  4. tomcat<定製,包含業務war包,路徑配置>
  5. nginx<定製,配置動靜分離,包含靜態web資源>

下一步,是理清各個server之間的依賴關係(例如tomcat上的業務要連線mysql資料庫),依賴關係如下,搞清楚了這個就知道link引數怎麼寫了:

server的關係已經理清了,接下來就要開始定製mysql,tomcat,nginx這些映象了,首先是準備材料,disconf是個開源的應用,我們可以在git上下載最新的原始碼,執行命令:

git clone [email protected]:knightliao/disconf.git

下載完畢,開啟資料夾,內容如下圖:

接下來我們開始實戰把,實戰一共五個步驟,依次是: 定製mysql映象 -> 定製tomcat映象 -> 定製nginx映象 -> 編寫docker-compose指令碼 -> docker-compose啟動

定製mysql映象

mysql定製:目的是讓容器在建立時自動執行sql指令碼,建立庫和表,並匯入初始化資料,在docker上實現資料庫指令碼自動執行的方法可以參照《讓docker中的mysql啟動時自動執行sql》一文,這裡簡單說一下步驟:

  1. 開啟disconf原始碼資料夾,在disconf/disconf-web/sql目錄下找到以下四個檔案:

0-init_table.sql
1-init_data.sql
201512/20151225.sql
20160701/20160701.sql

  1. 新建一個目錄mysql,把上面提到的四個sql檔案複製到這個目錄下,再新建一個名為install_data.sh的指令碼,內容如下:
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $WORK_PATH/$FILE_0;
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2; 
source $WORK_PATH/$FILE_3; 

內容很簡單,就是自動登入mysql,密碼是docker啟動的時候傳入的環境變數,然後執行四個sql指令碼檔案

  1. 在mysql目錄下新建Dockerfile檔案,內容如下:
# Docker image of disconf mysql
# VERSION 0.0.1
# Author: bolingcavalry

#基礎映象使用daocloud.io/library/mysql:8
FROM daocloud.io/library/mysql:8

#作者
MAINTAINER BolingCavalry <[email protected]>

#定義工作目錄
ENV WORK_PATH /usr/local/work

#定義會被容器自動執行的目錄
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定義sql檔名
ENV FILE_0 0-init_table.sql
ENV FILE_1 1-init_data.sql
ENV FILE_2 20151225.sql
ENV FILE_3 20160701.sql

#定義shell檔名
ENV INSTALL_DATA_SHELL install_data.sh

#建立資料夾
RUN mkdir -p $WORK_PATH

#把資料庫初始化資料的檔案複製到工作目錄下
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/
COPY ./$FILE_2 $WORK_PATH/
COPY ./$FILE_3 $WORK_PATH/

#把要執行的shell檔案放到/docker-entrypoint-initdb.d/目錄下,容器會自動執行這個shell
COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/

#給執行檔案增加可執行許可權
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL
  1. 開啟終端在mysql目錄下執行以下命令,構建msql映象:
docker build -t conf_mysql:0.0.1 .

msql映象構建成功

定製tomcat映象

構建tomcat映象時最重要的就是war包的生成,步驟如下:

  1. 建立兩個資料夾,分別設定到ONLINE_CONFIG_PATH和WAR_ROOT_PATH這兩個環境變數中,環境變數的設定方式在不同的作業系統下各不相同,我用的是mac,配置方式是在~/.bash_profile檔案中加入以下內容(寫完記得執行source ~/.bash_profile使環境變數在當前命令列視窗生效):
ONLINE_CONFIG_PATH=/Users/zq2599/temp/201705/03/005/online-resources
WAR_ROOT_PATH=/Users/zq2599/temp/201705/03/005/war
export ONLINE_CONFIG_PATH
export WAR_ROOT_PATH

/Users/zq2599/temp/201705/03/005/online-resources和/Users/zq2599/temp/201705/03/005/war都是剛剛新建的資料夾;

  1. 開啟disconf的原始檔的子目錄disconf-web/profile/rd,裡面的檔案如下圖:

把這些檔案全部複製到ONLINE_CONFIG_PATH變數對應的目錄下,在這個目錄下依次修改jdbc-mysql.properties,redis-config.properties,zoo.properties這三個檔案:

jdbc-mysql.properties的改動如下圖,主要是資料url改成一個固定的名字mysqlhost,這個在docker run的時候要和link引數中的別名一致,還有就是資料庫的使用者名稱密碼:

redis-config.properties的改動如下圖,主要是host引數,也要和docker run時候的link引數的別名對齊,注意,這裡要配置兩個redis

zoo.properties的配置如下圖,主要是host引數,也要和docker run時候的link引數的別名對齊:

把application-demo.properties檔案改名為application.properties

好了,修改引數的事情就算做完了,有了這些和link引數一致的host配置,tomcat在執行的時候就能連線上對應的容器了。

現在我們用maven來編譯和打包disconf的原始碼,用終端進入disconf原始碼的disconf-web子目錄,執行以下命令開始編譯和打包:

sh deploy/deploy.sh

執行完畢後,在環境變數WAR_ROOT_PATH對應的目錄下,可以看到編譯和打包的結果,如下圖:

新建一個名叫tomcat的資料夾,把上圖中的disconf-web.war複製到這個資料夾下,再在這裡新增一個server.xml檔案,內容如下,用來指定tomcat服務的根路徑對應的應用:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        <Context path="" docBase="/usr/local/tomcat/webapps/disconf-web" debug="0" reloadable="true" crossContext="true"/>        
      </Host>
    </Engine>
  </Service>
</Server>

這個配置資訊和官方tomcat中的server.xml檔案相比,其實只增加了下面這一個節點的內容:

<Context path="" docBase="/usr/local/tomcat/webapps/disconf-web" debug="0" reloadable="true" crossContext="true"/>

在tomcat資料夾下新增Dockerfile檔案,內容如下:

# Docker image of disconf tomcat
# VERSION 0.0.1
# Author: bolingcavalry

#基礎映象使用tomcat:7.0.77-jre8
FROM tomcat:7.0.77-jre8

#作者
MAINTAINER BolingCavalry <[email protected]>

#定義工作目錄
ENV TOMCAT_BASE /usr/local/tomcat


#複製配置檔案
COPY ./server.xml $TOMCAT_BASE/conf/

#複製war包
COPY ./disconf-web.war $TOMCAT_BASE/webapps/

#給配置檔案增加讀許可權
RUN chmod a+xr $TOMCAT_BASE/conf/server.xml

#刪除預設的ROOT檔案件
RUN rm -rf $TOMCAT_BASE/webapps/ROOT

看的出Dockerfile做的事情並不多,就是複製war包,複製server.xml,刪除預設的ROOT應用資料夾這些事情;

現在開啟終端在tomcat目錄下執行以下命令,構建tomcat映象:

docker build -t conf_tomcat:0.0.1 .

tomcat映象構建成功!

構建nginx映象

  1. 新建一個nginx目錄,在裡面新增一個nginx.conf檔案,內容如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;


    upstream disconf {  
        server tomcathost:8080;  
    }  
  
    server {  
        listen   80;  
        server_name localhost;  
        access_log logs/disconf_access.log;  
        error_log logs/disconf_error.log;  
  
        location / {  
            root /usr/local/work/html;  
            if ($query_string) {  
                expires max;  
            }  
        }  
  
        location ~ ^/(api|export) {  
            proxy_pass_header Server;  
            proxy_set_header Host $http_host;  
            proxy_redirect off;  
            proxy_set_header X-Real-IP $remote_addr;  
            proxy_set_header X-Scheme $scheme;  
            proxy_pass http://disconf;  
        }  
    }  

}

主要的配置有三點:

將預設的/etc/nginx/conf.d/*.conf配置註釋掉;
增加tomcat的host資訊,“tomcathost”和後面docker run的link引數的別名保持一致;
動靜分離的配置,請求url中如果帶有api和export,nginx就把請求轉發到tomcathost:8080,其他的請求直接訪問nginx伺服器的/usr/local/work/html資料夾;

  1. 在環境變數WAR_ROOT_PATH對應的目錄下,有個html資料夾如下圖紅框位置,這是web工程全部靜態檔案,把這個資料夾複製到剛才新建的nginx目錄下:

  1. 在nginx資料夾下新增Dockerfile檔案,內容如下:
# Docker image of disconf nginx
# VERSION 0.0.1
# Author: bolingcavalry

#基礎映象使用nginx:stable
FROM nginx:stable

#作者
MAINTAINER BolingCavalry <[email protected]>

#定義工作目錄
ENV WORK_PATH /usr/local/work/html

#定義nginx配置檔案所在目錄
ENV NGINX_CONF_DIR /etc/nginx

#定義nginx配置檔名稱
ENV NGINX_CONF_FILE_NAME nginx.conf

#建立工作資料夾
RUN mkdir -p $WORK_PATH

#建立nginx日誌資料夾
RUN mkdir -p /etc/nginx/logs/

#複製nginx配置檔案
COPY ./$NGINX_CONF_FILE_NAME $NGINX_CONF_DIR/

#複製網頁的靜態資原始檔
COPY ./html $WORK_PATH/

#給配置檔案增加讀許可權
RUN chmod a+xr $NGINX_CONF_DIR/$NGINX_CONF_FILE_NAME
  1. 現在開啟終端在nginx目錄下執行以下命令,構建nginx映象:
docker build -t conf_nginx:0.0.1 .

nginx映象構建成功!

編寫docker-compose指令碼

新增一個docker-compose.yml檔案(位置無所謂),內容如下:

version: '2'
services:
  disconf_redis_1: 
    image: daocloud.io/library/redis
    restart: always
  disconf_redis_2: 
    image: daocloud.io/library/redis
    restart: always
  disconf_zookeeper: 
    image: zookeeper:3.3.6
    restart: always
  disconf_mysql: 
    image: conf_mysql:0.0.1
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    restart: always
  disconf_tomcat: 
    image: conf_tomcat:0.0.1
    links: 
      - disconf_redis_1:redishost001 
      - disconf_redis_2:redishost002
      - disconf_zookeeper:zkhost
      - disconf_mysql:mysqlhost
    restart: always
  disconf_nginx: 
    image: conf_nginx:0.0.1
    links: 
      - disconf_tomcat:tomcathost 
    ports: 
      - "80:80" 
    restart: always

按照我們最初梳理的依賴關係,啟動兩個redis官方映象,一個zookeeper官方映象,再啟動定製的msyql映象,然後tomcat啟動並通過link關聯redis,zookeeper,mysql等容器,最後是定製的nginx啟動,link關聯tomcat,並且nginx容器的80埠對映到當前電腦的80埠;

啟動所有容器

在docker-compose.yml檔案所在的目錄下,執行命令:

docker-compose up -d

終端會顯示正在啟動各個容器,如下圖,每個容器的名稱會被docker-compose加上字首和字尾:

tomcat的應用啟動需要一點時間,我們可以通過docker logs -f disconf_disconf_tomcat_1命令來檢視tomcat啟動日誌,disconf_disconf_tomcat_1是容器名稱,如上圖中的紅框所示。

啟動完畢後,在瀏覽器上輸入localhost,可以看見熟悉的disconf登入頁面,使用者名稱admin,密碼admin,登入進去試試吧:

至此,disconf環境搭建三部曲已經結束,從體驗到親手一步一步配置都經歷了,我們可以按照自己的要求為自己定製一個disconf環境了。

後面的文章中,我們一起來實戰一下disconf系統的使用吧,體驗一下動態配置給業務帶來的便利。

歡迎關注我的公眾號

相關推薦

Docker搭建disconf環境三部曲細說搭建過程

Docker下的disconf實戰全文連結 《Docker搭建disconf環境,三部曲之一:極速搭建disconf》; 《Docker搭建disconf環境,三部曲之二:本地快速構建disconf映象》; 《Docker搭建disconf環境,三部曲之三:細說搭建過程》; 《Docker下使用discon

Docker下dubbo開發三部曲本地環境搭建

在上一篇文章《Docker下dubbo開發,三部曲之一:極速體驗》中,我們快速體驗了dubbo服務的註冊、發現、呼叫,今天我們一起在本地製作一套這樣的環境,經過這次實戰,大家就可以根據實際需求對自己的環境量身定製了。 基礎架構 整個環境由四個容器組成,梳

maven構建docker映象三部曲推送到遠端倉庫(內網和阿里雲)

在上一章《maven構建docker映象三部曲之二:編碼和構建映象》的實戰中,我們將spring boot的web工程構建成docker映象並在本地啟動容器成功,今天我們把docker-maven-plugin外掛的推送功能也用上,這樣編譯、構建、推送都能一

Docker下MySQL主從三部曲binlog日誌引數實戰

本章是《Docker下MySQL主從三部曲》的終篇,前面的章節我們能夠製作映象來搭建主從同步環境,本章我們來觀察binlog引數MASTER_LOG_POS;關於從庫同步的設定在設定從庫同步的時候一般會使用以下SQL:CHANGE MASTER TO MASTER_HOST=

Docker下ELK三部曲K8S上的ELK和應用日誌上報

本章是《Docker下ELK三部曲》系列的終篇,前面章節已經詳述了ELK環境的搭建以及如何製作自動上報日誌的應用映象,今天我們把ELK和web應用釋出到K8S環境下,模擬多個後臺server同時上報日誌的場景; 前文連結 關於K8S 基礎結

自定義spring boot starter三部曲原始碼分析spring.factories載入過程

本文是《自定義spring boot starter三部曲》系列的終篇,前文中我們開發了一個starter並做了驗證,發現關鍵點在於spring.factories的自動載入能力,讓應用只要依賴starter的jar包即可,今天我們來分析Spring和Spring boot原始碼,瞭解s

Kubernetes下web服務的效能測試三部曲橫向擴容

本章是《Kubernetes下web服務的效能測試三部曲》系列的終篇,之前我們用AB和JMeter兩種工具壓測了k8s環境下的Tomcat,並通過調整記憶體和CPU來驗證縱向擴容的效果,本章我們來驗證橫向擴容對吞吐量的影響; 本文地址:http://blog.

Docker下的Spring Cloud三部曲細說Spring Cloud開發

本文是《Docker下的Spring Cloud三部曲》系列的第二篇,詳細講解上一篇例項中用到的eureka、provider、consumer等三個應用的開發過程; 環境資訊 回顧一下實戰環境,如下圖: 原始碼地址 上圖的eureka、

elasticsearch實戰三部曲搜尋操作

本文是《elasticsearch實戰三部曲》的終篇,作為elasticsearch的核心功能,搜尋的重要性不言而喻,今天的實戰都會圍繞搜尋展開; 系列文章連結 《elasticsearch實戰三部曲之一:索引操作》; 《elasticsearch實戰三部曲之二:文

spring4.1.8初始化原始碼學習三部曲AbstractApplicationContext.refresh方法

本章是《spring4.1.8初始化原始碼學習三部曲》系列的終篇,重點是學習AbstractApplicationContext類的refresh()方法; 我們先回顧ClassPathXmlApplicationContext類的初始化過程如下程式碼:

CDH5部署三部曲問題總結

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

Flink on Yarn三部曲提交Flink任務

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; 本文是

CDH+Kylin三部曲Kylin官方demo

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; 本文是《

CoProcessFunction實戰三部曲定時器和側輸出

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

Sql語法高級應用存儲過程

while 重新 begin dealloc scom 查詢信息 普通 not null lar 一、存儲過程概述   SQL Server中的存儲過程是使用T_SQL編寫的代碼段。它的目的在於能夠方便的從系統表中查詢信息,或者完成與更新數據庫表相關的管理任務和其他的系統管

效能優化將Dottrace過程加入持續整合

之前分享過一篇如何做介面效能分析的文章,但是整個分析過程有點繁瑣,需要寫一個控制檯程式呼叫被測介面,再預熱、啟動dottrace追蹤,最後才能得到我們想要的效能分析報告。如果有辦法一鍵生成效能分析報告,那就會省很多不必要的時間。這裡我們就藉助Jenkins自動化完成這一過程。 目標: 把Dottrace的效能

大數據搭建HDP環境個節點為例

com 新的 防火墻 cdh 實驗環境 只需要 包名 connector start (一)實驗環境l 實驗介質?CentOS-7-x86_64-Everything-1708.iso?jdk-8u144-linux-x64.tar.gz?ambari-2.6.0.0-ce

hadoop初識搭建hadoop環境(配置HDFSYarn及mapreduce 執行在yarn)上及種執行模式(本地模式偽分散式和分散式介)

--===============安裝jdk(解壓版)================== --root 使用者登入 --建立檔案層級目錄    /opt下分別 建 modules/softwares/datas/tools 資料夾 --檢視是否安裝jdk    rpm -

docker搭建linux叢集搭建mpi環境並使用MTT benchmark測試叢集效能

最近在研究docker,早些時候老闆讓做了一個open mpi的image,並在單機環境下,成功使用docker搭建了一個openmpi的叢集,可以跑一些hello world的例子,後來,在ubuntu環境下,使用openvswitch搭建了一個多host的叢

使用Docker搭建開發環境包括(nginx,redis,mysql,gitlab,nexus3,activemq,jenkins)

使用Docker搭建開發環境 自從玩了Docker,深深的被Docker迷住,做了這麼多年軟體,都沒想到軟體會發展到這種階段,使用容器隔離技術,將各個服務程序隔離。 記錄一下自己為新成立的部門使用Docker搭建開發環境的過程,這裡只是簡粗暴的記錄下執行命令