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

  • 2019 年 10 月 3 日
  • 筆記

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系統的使用吧,體驗一下動態配置給業務帶來的便利。

歡迎關注我的公眾號

在这里插入图片描述

Tags: