一、制作tomcat鏡像:
基本架構圖:
1、制作JDK鏡像
基於官方提供的centos7.2.1511基礎鏡像構建JDK和tomcat鏡像,先構建JDK鏡像,然后再基於JDK鏡像構建tomcat鏡像。
JDK下載路徑:https://www.oracle.com/technetwork/java/javase/downloads/index.html
選擇架構版本:
(1)先下載基礎centos鏡像
[root@centos-7 ~]# docker pull centos
(2)搭建JDK鏡像
[root@centos-7 ~]# mkdir /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -p # 先創建存放鏡像目錄
(3)切換到指定的centos系統目錄下,安裝一些常用命令
[root@centos-7 centos]# cd /opt/dockerfile/system/centos
(4)創建一個Dockerfile文件
[root@centos-7 centos]# cat Dockerfile FROM centos RUN yum install epel-release -y && yum install vim iotop bc gcc gcc-c++ glibc glibc-devel pcre \ pcre-devel openssl openssl-devel zip unzip zlib-devel net-tools \ lrzsz tree telnet lsof tcpdump wget libevent libevent-devel \ bc systemd-devel bash-completion traceroute -y && useradd nginx -u 2019 && useradd tomcat -u 2020 && rm -rf /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
(5)創建一個build腳本
[root@centos-7 centos]# cat build-command.sh #!/bin/bash docker build -t centos-base:7.6.1810 .
(6)執行腳本,創建一個安裝基礎命令的centos系統鏡像
[root@centos-7 centos]# bash build-command.sh
(7)查看創建好的centos系統鏡像
(8)切換到jdk目錄下,創建指定的jdk版本目錄,制作profile環境變量文件,並制作JDK鏡像
切換到指定的jdk目錄下,並將下載下來的jdk文件傳到/opt/dockerfile/web/jdk/8u92目錄下
[root@centos-7 dockerfile]# cd /opt/dockerfile/web/jdk/ [root@centos-7 jdk]# mkdir 8u92
創建profile文件
[root@centos-7 8u92]# cat profile #在當前目錄下創建profile環境變量文件 # /etc/profile # System wide environment and startup programs, for login setup # Functions and aliases go in /etc/bashrc # It's NOT a good idea to change this file unless you know what you # are doing. It's much better to create a custom.sh shell script in # /etc/profile.d/ to make custom changes to your environment, as this # will prevent the need for merging in future updates. pathmunge () { case ":${PATH}:" in *:"$1":*) ;; *) if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi esac } if [ -x /usr/bin/id ]; then if [ -z "$EUID" ]; then # ksh workaround EUID=`/usr/bin/id -u` UID=`/usr/bin/id -ru` fi USER="`/usr/bin/id -un`" LOGNAME=$USER MAIL="/var/spool/mail/$USER" fi # Path manipulation if [ "$EUID" = "0" ]; then pathmunge /usr/sbin pathmunge /usr/local/sbin else pathmunge /usr/local/sbin after pathmunge /usr/sbin after fi HOSTNAME=`/usr/bin/hostname 2>/dev/null` HISTSIZE=1000 if [ "$HISTCONTROL" = "ignorespace" ] ; then export HISTCONTROL=ignoreboth else export HISTCONTROL=ignoredups fi export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL # By default, we want umask to get set. This sets it for login shell # Current threshold for system reserved uid/gids is 200 # You could check uidgid reservation validity in # /usr/share/doc/setup-*/uidgid file if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then umask 002 else umask 022 fi for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$i" else . "$i" >/dev/null fi fi done unset i unset -f pathmunge export JAVA_HOME=/usr/local/jdk export TOMCAT_HOME=/apps/tomcat export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
創建Dockerfile文件和build腳本
[root@centos-7 8u92]# cat Dockerfile FROM centos-base:7.6.1810 MAINTAINER 96348122@qq.com ADD jdk-8u192-linux-x64.tar.gz /usr/local/src RUN ln -sv /usr/local/src/jdk1.8.0_192 /usr/local/jdk # 創建軟鏈接之前需要解壓文件,查看解壓后的目錄是什么,再進行軟鏈接 ADD profile /etc/profile ENV JAVA_HOME /usr/local/jdk ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/ ENV PATH $PATH:$JAVA_HOME/bin [root@centos-7 8u92]# cat build-command.sh #!/bin/bash docker build -t jdk-base:1.8.0.192 .
(9)執行命令,創建jdk鏡像:
[root@centos-7 8u92]# bash build-command.sh
(10)在容器中測試jdk鏡像:
[root@centos-7 8u92]# docker images #先查看創建好的jdk鏡像 REPOSITORY TAG IMAGE ID CREATED SIZE jdk-base 1.8.0.192 830c0d4f0279 6 minutes ago 903MB centos-base 7.6.1810 d12613615be1 23 minutes ago 507MB centos 7.6.1810 0f3e07c0138f 3 months ago 220MB centos latest 0f3e07c0138f 3 months ago 220MB You have new mail in /var/spool/mail/root [root@centos-7 8u92]# docker run -it --rm jdk-base:1.8.0.192 bash [root@a6be7a88a684 /]# java -version #然后看看java版本 java version "1.8.0_192" Java(TM) SE Runtime Environment (build 1.8.0_192-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
此時jdk鏡像制作完成
2、制作tomcat鏡像
tomcat下載:https://archive.apache.org/dist/tomcat/tomcat-8/
1、切換到創建的tomcat目錄下,並創建一個tomcat-base目錄
[root@centos-7 tomcat]#cd /opt/dockerfile/web/tomcat [root@centos-7 tomcat]# mkdir tomcat-base [root@centos-7 tomcat]# cd tomcat-base/
2、然后在tomcat-base目錄下創建Dockerfile和build腳本
[root@centos-7 tomcat-base]# cat Dockerfile # 創建Dockerfile文件 FROM jdk-base:1.8.0.192 MAINTAINER 2973707860@qq.com ADD apache-tomcat-8.5.37.tar.gz /apps RUN ln -sv /apps/apache-tomcat-8.5.37 /apps/tomcat [root@centos-7 tomcat-base]# cat build-command.sh # 創建build腳本 #!/bin/bash docker build -t tomcat-base:8.5.37 . # 執行的腳本是創建一個tomcat-base:8.5.37版本的tomcat
執行build-command.sh腳本
# bash build-command.sh
3、將Dockerfile、build腳本與要執行的tomcat腳本進行分離,因此在/opt/dockerfile/web/tomcat/目錄下創建一個目錄:tomcat-app1
[root@centos-7 tomcat]# mkdir tomcat-app1 [root@centos-7 tomcat]# cd tomcat-app1
4、如果宿主機安裝好了tomcat文件,然后修改里邊的sever.xml文件,指定index.html文件路徑。
vim /etc/tomcat/conf/server.xml #修改本地的server.xml文件並傳到此目錄下 <Host name="localhost" appBase="/data/tomcat/webapps" unpackWARs="true" autoDeploy="true"> # 指定存放代碼路徑到 /data/tomcat/webapps目錄下
5、創建一個index.html測試頁面
[root@centos-7 tomcat-app1]# cat index.html tomcat web app1 page [root@centos-7 tomcat-app1]# tar zcvf code.tar.gz index.html #並將指定的代碼進行壓縮 index.html
6、創建Dockerfile文件和run_tomcat.sh腳本
[root@centos-7 tomcat-app1]# cat Dockerfile # 創建Dockerfile文件 FROM tomcat-base:8.5.37 maintainer 2973707860@qq.com ADD code.tar.gz /data/tomcat/webapps/app1 # webapps默認下面訪問的是ROOT目錄下的文件,如果創建的是ROOT目錄,訪問網頁時,不需要指定ROOT目錄,都是缺省路徑,如果訪問app1目錄代碼,需要將代碼放在app1目錄下 ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh ADD server.xml /apps/tomcat/conf RUN chown -R tomcat.tomcat /apps/apache-tomcat-8.5.37 /apps/tomcat /data/tomcat # 修改tomcat相關文件的權限 EXPOSE 8080 8443 CMD ["/apps/tomcat/bin/run_tomcat.sh"] #調用run_tomcat.sh腳本
[root@centos-7 tomcat-app1]# cat run_tomcat.sh # 創建run_tomcat.sh腳本 #!/bin/bash source /etc/profile echo "1.2.1.3 www.google.net" >> /etc/hosts # 可以修改 su - tomcat -c "/apps/tomcat/bin/catalina.sh start" #以后台運行 #su - tomcat -c "/apps/tomcat/bin/catalina.sh run" #以前台運行 tail -f /etc/hosts # 為了測試拉起容器,執行腳本時,可以運行起tomcat,沒有此命令,就會運行完容器又會退出tomcat服務 [root@centos-7 tomcat-app1]# cat build-command.sh # 創建build腳本 #!/bin/bash docker build -t tomcat-app1:v1 .
7、執行build-command.sh腳本
# chmod +x run_tomcat.sh # 給腳本加上執行權限 # bash build-command.sh
8、創建的tomcat-app1目錄下的文件:
[root@centos-7 tomcat-app1]# ls build-command.sh code.tar.gz Dockerfile index.html run_tomcat.sh server.xml
9、啟動docker容器里的tomcat-app1:v1的鏡像
[root@centos-7 tomcat-app1]# docker images #查看所有的鏡像 REPOSITORY TAG IMAGE ID CREATED SIZE tomcat-app1 v1 98e44ecbf074 2 hours ago 931MB tomcat-base 8.5.37 21ab497620f2 2 hours ago 917MB jdk-base 1.8.0.192 830c0d4f0279 3 hours ago 903MB centos-base 7.6.1810 d12613615be1 3 hours ago 507MB centos 7.6.1810 0f3e07c0138f 3 months ago 220MB centos latest 0f3e07c0138f 3 months ago 220MB [root@centos-7 tomcat-app1]# docker run -it --rm -p 8080:8080 tomcat-app1:v1 bash # 映射8080端口,才能啟動tomcat服務 [root@95a92b580338 /]# su - tomcat -c "/apps/tomcat/bin/catalina.sh start" # 啟動tomcat服務 Using CATALINA_BASE: /apps/tomcat Using CATALINA_HOME: /apps/tomcat Using CATALINA_TMPDIR: /apps/tomcat/temp Using JRE_HOME: /usr/local/jdk Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar Tomcat started.
10、查看測試頁面,此時就可以訪問了
此時JAVA業務鏡像制作成功!!!!
如果想創建第二個服務怎么辦?
答:方法很簡單,只需要將tomcat-app1目錄復制一份,修改里邊的build-command.sh、index.html文件即可
[root@centos-7 tomcat-app1]# pwd /opt/dockerfile/web/tomcat/tomcat-app1 [root@centos-7 tomcat-app1]# cd .. [root@centos-7 tomcat]# ls tomcat-app1 tomcat-base [root@centos-7 tomcat]# cp -r tomcat-app1/ tomcat-app2 # 復制 tomcat-app1為tomcat-app2 [root@centos-7 tomcat]# cd tomcat-app2
修改index.html文件
# vim index.html tomcat web app2 page
修改build-command.sh文件,修改后執行此腳本創建的tomcat鏡像就是tomcat-app2:v1
#!/bin/bash docker build -t tomcat-app2:v1 .
將index.html文件打包
[root@centos-7 tomcat-app2]# tar -zcvf code.tar.gz index.html index.html
執行build-command.sh腳本
# basn build-command.sh
進入容器啟動tomcat-app2:v1鏡像,啟動tomcat服務
[root@59113590db18 /]# su - tomcat -c "/apps/tomcat/bin/catalina.sh start" Using CATALINA_BASE: /apps/tomcat Using CATALINA_HOME: /apps/tomcat Using CATALINA_TMPDIR: /apps/tomcat/temp Using JRE_HOME: /usr/local/jdk Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar Tomcat started.
訪問網頁測試效果,訪問成功!!!
此時不同的tomcat鏡像制作成功!!!!
實戰二、源碼編譯安裝haproxy
1、官網下載haproxy源碼包:https://www.haproxy.org/
[root@centos-7 haproxy]# cd /opt/dockerfile/web/haproxy #切換到此目錄下 [root@centos-7 haproxy]# cat Dockerfile #創建Dockerfile文件 FROM centos-base:7.6.1810 #從上面創建好的centos基礎鏡像進行調用 MAINTAINER liu 2973707860@qq.com ADD haproxy-1.8.17.tar.gz /usr/local/src #解壓下載的haproxy包 RUN yum groupinstall "development tools" -y # 安裝開發包組 RUN yum install systemd-devel -y && cd /usr/local/src/haproxy-1.8.17 && make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy && cp haproxy /usr/sbin/ && mkdir /usr/local/haproxy/run ADD haproxy.cfg /etc/haproxy/haproxy.cfg # 添加自己需要修改的配置文件 ADD run_haproxy.sh /usr/bin/run_haproxy.sh # 指定腳本放在哪個目錄下 EXPOSE 80 9999 CMD ["/usr/bin/run_haproxy.sh"] [root@centos-7 haproxy]# cat built-command.sh #創建built-command.sh腳本 #!/bin/bash docker build -t centos-haproxy:v1.8.17 . #創建centos-haproxu:v1.8.17tag的鏡像 [root@centos-7 haproxy]# #!/bin/bash [root@centos-7 haproxy]# cat run_haproxy.sh #創建run_haproxy.sh腳本 #!/bin/bash haproxy -f /etc/haproxy/haproxy.cfg # 執行此腳本,運行haproxy tail -f /etc/hosts
2、需要將指定的配置文件都存放在此目錄下
[root@centos-7 haproxy]# pwd /opt/dockerfile/web/haproxy [root@centos-7 haproxy]# ls built-command.sh Dockerfile haproxy-1.8.17.tar.gz haproxy.cfg run_haproxy.sh #指定需要的文件
3、執行build-command.sh腳本,創建haproxy鏡像
# chmod +x run_haproxy.sh #將 run_haproxu,sh加上執行權限,否則無法在容器里運行鏡像 # bash build-command.sh
4、運行docker容器里的鏡像
[root@centos-7 haproxy]# docker run -it --rm -p 80:80 -p 9999:9999 centos-haproxy:v1.8.17 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 a0dcecc6a36a
5、進行網頁測試
此時haproxy源碼編譯的鏡像完成!!!
實戰三、實現一次構建,到處運行的鏡像
架構圖:
環境准備:
類型 | IP地址 | 服務器角色 |
A | 192.168.7.100 | tomcat-app1 |
B | 192.168.7.101 | tomcat-app2 |
C | 192.168.7.102 | HAProxy調度器 |
1、在A主機將以上的實驗tomcat、haproxy鏡像導出來
[root@centos-7 ~]# docker save tomcat-app1:v1 > /opt/tomcat-app1.tar.gz [root@centos-7 ~]# docker save tomcat-app2:v1 > /opt/tomcat-app2.tar.gz [root@centos-7 ~]# docker save centos-haproxy:v1 > /opt/haproxy.tar.gz
2、導出來的鏡像傳到其他B和C主機,並在其他主機進行導入制作好的鏡像
[root@centos-7 ~]# scp /opt/tomcat-app1.tar.gz 192.168.7.101: [root@centos-7 ~]# scp /opt/haproxy.tar.gz 192.168.7.101:
3、在B和C主機上安裝docker-ce的yum源倉庫,然后再進行安裝docker-ce
[root@centos-7 haproxy-1.8.17]# cd /etc/yum.repos.d/ #切換到yum倉庫 [root@centos-7 yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #下載阿里雲官網docker-ce的yum源 [root@centos-7 haproxy-1.8.17]# systemctl start docker 啟動docker [root@centos-7 haproxy-1.8.17]# systemctl enable docker
4、將傳遞過來的鏡像導入到docker容器中
[root@centos-7 ~]# docker load -i tomcat-app2.tar.gz
5、啟動tomcat-app1和tomcat-app2的鏡像服務
[root@centos-7 opt]# docker run -d -it --rm -p 8801:8080 tomcat-app1:v1 # 啟動A主機的tomcat服務 [root@centos-7 ~]# docker run -it -d --rm -p 8802:8080 tomcat-app2:v1 # 啟動B主機的tomcat服務 9b4a5defaffecccf7a269b95850cb514b001cada6cbe468fdf895efb4567476a
6、修改A主機的haproxy配置文件,指向兩個后端的Tomcat服務器
vim /opt/dockerfile/web/haproxy/haproy.cfg
global maxconn 100000 chroot /usr/local/haproxy #stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin uid 99 gid 99 daemon #nbproc 2 #cpu-map 1 0 #cpu-map 2 1 pidfile /usr/local/haproxy/run/haproxy.pid log 127.0.0.1 local3 info defaults option http-keep-alive option forwardfor maxconn 100000 mode http timeout connect 300000ms timeout client 300000ms timeout server 300000ms listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth haadmin:123456 listen web_port bind 0.0.0.0:80 mode http log global server web1 192.168.7.100:8801 check inter 3000 fall 2 rise 5 # 指向后端的服務器 server web2 192.168.7.101:8802 check inter 3000 fall 2 rise 5 # 指向后端服務器
7、A主機重新制作haproxy鏡像
# bash build-command.sh
8、將A主機的haproxy鏡像傳到C服務器上,然后倒入到容器中
# scp centos-haproxy.tar.gz 192.168.7.102: # docker load -i centos-haproxy.tar.gz # 將文件傳到容器中
9、啟動C主機的haproxy服務
[[A[root@centos-7 haproxy]# docker run -it -d --rm -p 80:80 -p 9999:9999 centos-haproxy:v1.8.17 c1c4f85050b3d4ee8ab5323536d7636d511ba9835b858ee7814f5b218f699e1d
訪問測試頁面,此時就實現了基本的輪詢調度訪問后端tomcat服務,此實驗完成!!!