docker镜像制作(三)基于dockerfile实现单机的Haproxy+Nginx+Tomcat

 

下图为一个小型的网络架构图,

Keepalived+Haproxy以软件的形式安装在宿主机上,原因有有些镜像/容器没有修改内核的参数。如下。

tomcat +nginx 使用docker容器运行.

修改系统内核使其可以监听本地不存在的IP
[root@docker-server1 ~]# sysctl -w net.ipv4.ip_nonlocal_bind=1
[root@docker-server2 ~]# sysctl -w net.ipv4.ip_nonlocal_bind=1

 

 

Dockerfile方式镜像制作   JDK+Tomcat+Nginx+Haproxy  (全部在容器上运行)

一.制作Haproxy镜像

一.在Cenots基础上制作Harpoxy镜像
[root@localhost7B web]# cd haproxy/

[root@localhost7B haproxy]# ls
build-command.sh  Dockerfile  haproxy-2.0.22.tar.gz  haproxy.cfg  run_haproxy.sh

1.配置文件
[root@localhost7B haproxy]# cat haproxy.cfg 
global 
chroot /usr/local/haproxy 
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin 
uid 99 
gid 99 
daemon 
nbproc 1 
pidfile /usr/local/haproxy/run/haproxy.pid 
log 127.0.0.1 local3 info 

defaults 
option http-keep-alive 
option forwardfor 
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 
  balance roundrobin 
  server web 192.168.80.110:81 check inter 3000 fall 2 rise 5 
 
  
 2.启动脚本 
[root@localhost7B haproxy]# cat run_haproxy.sh 
#!/bin/bash
/usr/local/haproxy/sbin/haproxy  -f   /etc/haproxy/haproxy.cfg
tail -f /etc/hosts 

 
3.Dcokerfile文件
[root@localhost7B haproxy]# cat Dockerfile 
#在Centos基础镜像+基础软件上安装haproxy
FROM centos-base:v1 
MAINTAINER yuanbangchen  "123456@qq.com" 
RUN yum install -y yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl  openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate 
ADD haproxy-2.0.22.tar.gz  /usr/local/src/ 
RUN cd /usr/local/src/haproxy-2.0.22  && make ARCH=x86_64 TARGET=linuxglibc 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 
RUN  cp /usr/local/haproxy/sbin/haproxy /usr/sbin/  &&  mkdir /usr/local/haproxy/run
#/usr/local/haproxy/sbin/haproxy /usr/sbin/
ADD haproxy.cfg /etc/haproxy/ 
ADD run_haproxy.sh /usr/bin/
EXPOSE 80 9999 
CMD ["/usr/bin/run_haproxy.sh"]
#设置时区:
RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime


4.树德镜像
[root@localhost7B haproxy]# chmod +x build-command.sh
[root@localhost7B haproxy]# chmod +x run_haproxy.sh
[root@localhost7B haproxy]# cat build-command.sh 
#!/bin/bash 
docker  build -t  centos-harpoxy:v2 .

5.目录结构
[root@localhost7B web]# tree haproxy/
haproxy/
├── build-command.sh
├── Dockerfile
├── haproxy-2.0.22.tar.gz
├── haproxy.cfg
└── run_haproxy.sh

 

二 、制作nginx镜像 

2.2 编写Dockerfile文件
[root@localhost7B nginx]# vim Dockerfile 
#基准镜像
FROM centos-base:v1
#作者信息
MAINTAINER "zzhzzjol"
#工作目录
WORKDIR /usr/local/src/
#定义环境变量
ENV NG_VERSION nginx-1.21.0
#安装epel仓库
RUN yum -y install epel-release
#安装wget
RUN yum -y install wget
#下载nginx文件并解压
RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz
#安装编译依赖包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
#清理仓库
RUN yum clean all
#创建nginx用户
RUN useradd -M -s /sbin/nologin nginx
#切换工作目录
WORKDIR /usr/local/src/$NG_VERSION
#编译安装nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
#复制测试页面和配置文件到容器中
ADD index.html /usr/local/nginx/html
ADD nginx.conf /usr/local/nginx/conf/
#设置容器中要挂在到宿主机的目录
VOLUME /usr/local/nginx/html
#设置sbin环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#暴露容器80端口
EXPOSE 80/tcp
#当ENTRYPOINT和CMD连用时,CMD的命令是ENTRYPOINT命令的参数,两者连用相当于nginx -g "daemon off;"而当一起连用的时候命令格式最好一致(这里选择的都是json格式的是成功的,如果都是sh模式可以试一下)
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]

2.3测试页面
[root@localhost7B nginx]# cat index.html 
dockerfile nginx test

配置文件 [root@localhost7B web]# cat nginx/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream tomcat{ server 192.168.80.110:8088; server 192.168.80.110:8089; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /myapp { proxy_pass http://tomcat ; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

[root@localhost7B web]# tree nginx/
  nginx/
  ├── build-centos-nginx2.sh
  ├── Dockerfile
  ├── index.html
  └── nginx.conf



2.4构造镜像,名为nginx:v1 [root@localhost7B nginx]# cat build-centos-nginx.sh #!/bin/bash docker build -t nginx:v2 . [root@localhost7B nginx]# chmod +x build-centos-nginx.sh [root@localhost7B nginx]# ./build-centos-nginx.sh Step 11/16 : ADD index.html /usr/local/nginx/html ..... ..... Step 16/16 : CMD ["-g","daemon off;"] ---> Running in 5a0135bfef6d Removing intermediate container 5a0135bfef6d ---> e6b2d5a5a6b4 Successfully built e6b2d5a5a6b4 Successfully tagged nginx:v1

 

三、制作 tomcat镜像

一.在Cenots基础上制作JDK镜像
[root@localhost7B jdk]# ls
build-command.sh  Dockerfile  jdk  jdk-8u291-linux-x64.tar.gz

1.配置文件
[root@localhost7B jdk]# cat  jdk
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
 
 2.Dockerfile文件
[root@localhost7B jdk]# cat Dockerfile 
#在Centos基础镜像+基础软件上安装JDK
FROM centos-base:v1 
MAINTAINER yuanbangchen  "123456@qq.com" 
ADD jdk-8u291-linux-x64.tar.gz /usr/local/src/ 
RUN ln -sv /usr/local/src/jdk1.8.0_291  /usr/local/jdk 
#直接定义变量或在/etc/profile/添加变量,这里定义的全局用户都可以使用.如果tomcat 使用的是www 用户,要确保此用户能使用这些变量。建议定义在/etc/profile
ADD jdk  /etc/profile    
#测试失败,定义在/etc/profile.d/下,使用www用户无法使用变量,因为进入容器时,而不是进入终端,不加载profile 下的文件。所以要定义ENV变量。
#ADD jdkv1  /etc/profile.d/jdk    
#RUN source /etc/profile.d/jdk
#定义变量
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
#设置时区:
RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

3.构造镜像
[root@localhost7B jdk]# chmod +x  build-command.sh 
[root@localhost7B jdk]# cat build-command.sh 
#!/bin/bash 
docker  build -t jdk-base:v1.8.0_291 .

4.查看
[root@localhost7B jdk]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jdk-base            v1.8.0_291          5b431104f188        2 days ago          1.14GB
centos-base         v1                  568629c634fc        2 weeks ago         782MB
centos              7                   eeb6ee3f44bd        13 months ago       204MB



二.在JDK基础上制作tomcat镜像
[root@localhost7B tomcat]# ls
apache-tomcat-8.5.69.tar.gz  build-command.sh  Dockerfile  

1.Dockerfile文件
[root@localhost7B tomcat]# cat Dockerfile 
#在Centos基础镜像+基础软件 + JDK 上安装 tomcat
FROM jdk-base:v1.8.0_291
MAINTAINER yuanbangchen  "123456@qq.com" 
#env 
ENV TZ "Asia/Shanghai" 
ENV LANG en_US.UTF-8 
ENV TERM xterm 
ENV TOMCAT_MAJOR_VERSION 8 
ENV TOMCAT_MINOR_VERSION 8.5.69 
ENV CATALINA_HOME /apps/tomcat 
ENV APP_DIR ${CATALINA_HOME}/webapps 
#tomcat 
RUN mkdir /apps 
ADD apache-tomcat-8.5.69.tar.gz  /apps 
RUN ln -sv /apps/apache-tomcat-8.5.69  /apps/tomcat
# 运行tomcat ,可以放在业务镜像中执行
#RUN /apps/tomcat/bin/startup.sh start


2.构造镜像
[root@localhost7B tomcat]# chmod +x  build-command.sh 
[root@localhost7B tomcat]# cat build-command.sh 
#!/bin/bash 
docker  build -t tomcat-base:8.5.69 .


三.tomcat镜像制作业务镜像1.
[root@localhost7B tomcat]# mkdir  tomcat-app1  tomcat-app2
[root@localhost7B tomcat]# tar xf apache-tomcat-8.5.69       
[root@localhost7B tomcat]# cp apache-tomcat-8.5.69/conf/server.xml  ./tomcat-app1
[root@localhost7B tomcat]# cp apache-tomcat-8.5.69/conf/server.xml  ./tomcat-app2

1.路径说明
[root@localhost7B tomcat]# cd tomcat-app1
[root@localhost7B tomcat-app1]# mkdir myapp
[root@localhost7B tomcat-app1]# ls
build-command.sh  Dockerfile  myapp  run_tomcat.sh  server.xml

2.配置文件
[root@localhost7B tomcat-app1]# cat myapp/index.html 
tomcat web page app1

3.启动脚本
[root@localhost7B tomcat-app1]# cat run_tomcat.sh 
#!/bin/bash
echo "1.1.1.1 abc.test.com" >> /etc/hosts 
echo "nameserver 223.5.5.5" >> /etc/resolv.conf 
su - www -c "/apps/tomcat/bin/catalina.sh  start"
su  - www -c "tail -f /etc/hosts"

4.Dockerifle文件
[root@localhost7B tomcat-app1]# cat Dockerfile 
#在Centos基础镜像+基础软件 + JDK + tomcat 加  项目或业务
FROM tomcat-base:8.5.69
MAINTAINER yuanbangchen  "123456@qq.com" 
#注意 :此脚本在宿主机上要用"执行"权限  chmod a+x *.sh
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh 
ADD myapp/*  /data/tomcat/webapps/myapp/ 
ADD server.xml /apps/tomcat/conf/server.xml
# www之前构造镜像时添加过
RUN chown www.www /apps/ -R 
EXPOSE 8080 8009 
# 运行tomcat 
CMD ["/apps/tomcat/bin/run_tomcat.sh"]


5.配置文件说明
[root@localhost7B tomcat-app1]# cat server.xml
      <Host name="localhost"  appBase="/data/tomcat/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" />
      </Host>


5.构造镜像
[root@localhost7B tomcat-app1]# chmod +x build-command.sh
[root@localhost7B tomcat-app1]# chmod +x run_tomcat.sh

[root@localhost7B tomcat-app1]# cat build-command.sh 
#!/bin/bash 
docker  build -t tomcat-web:app1 .



三.tomcat镜像制作业务镜像2

1.其它设置同上
[root@localhost7B tomcat]# cd tomcat-app2 
[root@localhost7B tomcat-app2]# ls
build-command.sh  Dockerfile  myapp  run_tomcat.sh  server.xml

2.配置文件
[root@localhost7B tomcat-app2]# cat myapp/index.html 
Tomcat Page in app2

3.树德镜像
[root@localhost7B tomcat-app2]# chmod +x build-command.sh
[root@localhost7B tomcat-app2]# chmod +x run_tomcat.sh
[root@localhost7B tomcat-app2]# cat build-command.sh 
#!/bin/bash 
docker  build -t tomcat-web:app2 .

4.查看镜像
[root@localhost7B jdk]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat-base         8.5.69              d3dc7abdf6fc        2 days ago          1.16GB
jdk-base            v1.8.0_291          5b431104f188        2 days ago          1.14GB
centos              7                   eeb6ee3f44bd        13 months ago       204MB
tomcat-web          app2                7636e0ebf626        About an hour ago   1.17GB
tomcat-web          app1                0664c36f0f8d        2 hours ago         1.17GB



6.文件结构
[root@localhost7B tomcat]# tree 
.
├── apache-tomcat-8.5.69.tar.gz
├── build-command.sh
├── Dockerfile
├── tomcat-app1
│   ├── build-command.sh
│   ├── Dockerfile
│   ├── myapp
│   │   └── index.html
│   ├── run_tomcat.sh
│   └── server.xml
└── tomcat-app2
    ├── build-command.sh
    ├── Dockerfile
    ├── myapp
    │   └── index.html
    ├── run_tomcat.sh
    └── server.xml

 四 测试

docker run -it -d -p 80:80 -p 9999:9999 --name haproxyA centos-harpoxy:v2
docker run -it -d -p 81:80 --name nginxA nginx:v2
docker run -it -d -p 8088:8080 --name tomcatA tomcat-web:app1
docker run -it -d -p 8089:8080 --name tomcatB tomcat-web:app2



root@localhost7F ~]# curl 192.168.80.110/myapp/
tomcat web page app1
[root@localhost7F ~]# curl 192.168.80.110/myapp/
echo Tomcat Page in app2
[root@localhost7F ~]# curl 192.168.80.110/myapp/
tomcat web page app1
[root@localhost7F ~]# curl 192.168.80.110/myapp/
echo Tomcat Page in app2

 

 

 

 

 

posted @ 2022-10-18 16:54  yuanbangchen  阅读(148)  评论(0编辑  收藏  举报