Docker之三----java業務鏡像制作


一、制作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服務,此實驗完成!!!

 

  

 

 

 

  

  

  

  

 

  

 

  

  

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM