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


浙公网安备 33010602011771号