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

Docker下的disconf實戰全文連接

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

細說搭建過程

在前兩章中,咱們利用遠程或本地的鏡像,快速體驗了本地啓動disconf的過程,本章咱們一塊兒來分析和梳理整個定製和搭建過程,瞭解這些後,咱們就能根據本身的須要來定製本地的disconf環境了。html

如下兩點請注意mysql

  1. 本機環境已經安裝了maven,而且把maven的bin目錄配置到環境變量PATH下;
  2. 編譯編譯disconf源碼時,要用到官方shell腳本,因此本次實踐的操做系統建議用linux或mac,若是用windows,有三種方法:一個是把shell改爲bat腳本,一個是用虛擬機的linux,還有一種是用在docker上搭建一個maven容器,把disconf源碼放在這個容器下編譯;

先分析再實戰

首先把disconf環境依賴的全部server都列出來:linux

  1. redis<無需定製,用官方鏡像>
  2. zookeeper<無需定製,用官方鏡像>
  3. mysql<<font color="red">定製</font>,建立庫,表,導入初始化數據>
  4. tomcat<<font color="red">定製</font>,包含業務war包,路徑配置>
  5. nginx<<font color="red">定製</font>,配置動靜分離,包含靜態web資源>

下一步,是理清各個server之間的依賴關係(例如tomcat上的業務要鏈接mysql數據庫),依賴關係以下,搞清楚了這個就知道link參數怎麼寫了:nginx

這裏寫圖片描述

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

git clone git@github.com:knightliao/disconf.git

下載完畢,打開文件夾,內容以下圖:github

這裏寫圖片描述

接下來咱們開始實戰把,實戰一共五個步驟,依次是: 定製mysql鏡像 -> 定製tomcat鏡像 -> 定製nginx鏡像 -> 編寫docker-compose腳本 -> docker-compose啓動web

定製mysql鏡像###

mysql定製:目的是讓容器在建立時自動執行sql腳本,建立庫和表,並導入初始化數據,在docker上實現數據庫腳本自動執行的方法能夠參照《讓docker中的mysql啓動時自動執行sql》一文,這裏簡單說一下步驟:redis

  1. 打開disconf源碼文件夾,在disconf/disconf-web/sql目錄下找到如下四個文件:

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

  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腳本文件docker

  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 <zq2599@gmail.com>

#定義工做目錄
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. 建立兩個文件夾,分別設置到<font color="red">ONLINE_CONFIG_PATH</font>和<font color="red">WAR_ROOT_PATH</font>這兩個環境變量中,環境變量的設置方式在不一樣的操做系統下各不相同,我用的是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

<font color="red">/Users/zq2599/temp/201705/03/005/online-resources</font>和<font color="red">/Users/zq2599/temp/201705/03/005/war</font>都是剛剛新建的文件夾;

  1. 打開disconf的源文件的子目錄disconf-web/profile/rd,裏面的文件以下圖:

這裏寫圖片描述

把這些文件所有複製到<font color="red">ONLINE_CONFIG_PATH</font>變量對應的目錄下,在這個目錄下依次修改jdbc-mysql.properties,redis-config.properties,zoo.properties這三個文件:

jdbc-mysql.properties的改動以下圖,主要是數據url改爲一個固定的名字mysqlhost,這個在docker run的時候要和link參數中的別名一致,還有就是數據庫的用戶名密碼:

這裏寫圖片描述

redis-config.properties的改動以下圖,主要是host參數,也要和docker run時候的link參數的別名對齊,<font color="red">注意,這裏要配置兩個redis</font>

這裏寫圖片描述

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

這裏寫圖片描述

把application-demo.properties文件更名爲application.properties

好了,修改參數的事情就算作完了,有了這些和link參數一致的host配置,tomcat在運行的時候就能鏈接上對應的容器了。

如今咱們用maven來編譯和打包disconf的源碼,用終端進入disconf源碼的disconf-web子目錄,執行如下命令開始編譯和打包:

sh deploy/deploy.sh

執行完畢後,在環境變量<font color="red">WAR_ROOT_PATH</font>對應的目錄下,能夠看到編譯和打包的結果,以下圖:

這裏寫圖片描述

新建一個名叫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 <zq2599@gmail.com>

#定義工做目錄
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. 在環境變量<font color="red">WAR_ROOT_PATH</font>對應的目錄下,有個html文件夾以下圖紅框位置,這是web工程所有靜態文件,把這個文件夾複製到剛纔新建的nginx目錄下:

這裏寫圖片描述

  1. 在nginx文件夾下新增Dockerfile文件,內容以下:
# Docker image of disconf nginx
# VERSION 0.0.1
# Author: bolingcavalry

#基礎鏡像使用nginx:stable
FROM nginx:stable

#做者
MAINTAINER BolingCavalry <zq2599@gmail.com>

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

歡迎關注個人公衆號

在這裏插入圖片描述

相關文章
相關標籤/搜索