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