在前兩章中,咱們利用遠程或本地的鏡像,快速體驗了本地啓動disconf的過程,本章咱們一塊兒來分析和梳理整個定製和搭建過程,瞭解這些後,咱們就能根據本身的須要來定製本地的disconf環境了。html
如下兩點請注意mysql
首先把disconf環境依賴的全部server都列出來:linux
下一步,是理清各個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定製:目的是讓容器在建立時自動執行sql腳本,建立庫和表,並導入初始化數據,在docker上實現數據庫腳本自動執行的方法能夠參照《讓docker中的mysql啓動時自動執行sql》一文,這裏簡單說一下步驟:redis
0-init_table.sql 1-init_data.sql 201512/20151225.sql 20160701/20160701.sqlsql
#!/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
# 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
docker build -t conf_mysql:0.0.1 .
msql鏡像構建成功
構建tomcat鏡像時最重要的就是war包的生成,步驟以下:
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>都是剛剛新建的文件夾;
把這些文件所有複製到<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 "%r" %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鏡像###
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文件夾;
# 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
docker build -t conf_nginx:0.0.1 .
nginx鏡像構建成功!
新增一個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系統的使用吧,體驗一下動態配置給業務帶來的便利。