zoukankan      html  css  js  c++  java
  • Docker之3---java业务镜像制作

    Docker之3---java业务镜像制作

    一、制作tomcat镜像:

    基本架构图:

    img

    1、制作JDK镜像

    基于官方提供的centos7.2.1511基础镜像构建JDK和tomcat镜像,先构建JDK镜像,然后再基于JDK镜像构建tomcat镜像。

    JDK下载路径:https://www.oracle.com/technetwork/java/javase/downloads/index.html

    选择架构版本:

    img

    (1)先下载基础centos镜像

    docker pull centos
    

    (2)搭建JDK镜像

    mkdir /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -p
    # 先创建存放镜像目录
    

    (3)创建一个Dockerfile文件

    cat >  /opt/dockerfile/system/centos/Dockerfile <<EOF
    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
    EOF
    

    (5)创建一个build脚本

    [root@centos-7 centos]# cat build-command.sh
    #!/bin/bash
     
    docker build -t centos-base:7.6.1810 .
    

    (6)执行脚本,创建一个安装基础命令的centos系统镜像

    bash build-command.sh
    

    (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脚本<br>
    [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、查看测试页面,此时就可以访问了

    img

    此时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.
    

    访问网页测试效果,访问成功!!!

    img

    此时不同的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、进行网页测试

    img

    此时haproxy源码编译的镜像完成!!!

    实战三、实现一次构建,到处运行的镜像

    架构图:

    img

    环境准备:

    类型 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容器中

    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服务,此实验完成!!!

    img

    img

  • 相关阅读:
    学习 Apache FileMatchs 规则
    yii2 vendor/bower/jquery/dist not exist
    Ionic POST提交使用普通表单提交数据
    Yii2 在php 7.2环境下运行,提示 Cannot use ‘Object’ as class name
    Yii2 使用 npm 安装的包
    phpStorm 激活
    Chrome DNS_PROBE_FINISHED_NXDOMAIN
    Yii2 中使用ts
    Js 对 浏览器 的 URL的操作
    js 编码、解码与asp.net 编码、解码
  • 原文地址:https://www.cnblogs.com/backups/p/docker_3.html
Copyright © 2011-2022 走看看