Docker镜像制作:Tomcat
创建dockerfile目录
# mkdir /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv
强制删除tag为<none>的镜像
# docker rmi -f `docker images | grep "<none>" | awk '{print $3}'`
为镜像打标签
# docker tag centos:latest centos:7.6.1810
写基础环境Dockerfile(安装常用命令)
# cd dockerfile/system/centos/
# vim Dockerfile
FROM centos:7 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 ntpdate telnet lsof tcpdump wget libevent libevent-devel bc systemd-devel bash-completion traceroute -y
build基础环境
# docker build -t centos-base:v1 .
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
如何更改新生成镜像的时区
进入镜像
# docker run -it --rm nginx-base:v1 bash
时区为UTC
# date
Mon Jan 20 02:42:49 UTC 2020
删除当前时区文件
# rm -rf /etc/localtime
将上海的时区文件做软连接为当前时区文件
# find / -name Shanghai
/usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/posix/Asia/Shanghai /usr/share/zoneinfo/right/Asia/Shanghai
[root@c9aa870c4603 /]# ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
'/etc/localtime' -> '/usr/share/zoneinfo/Asia/Shanghai'
再次查看,时区为CST
[root@c9aa870c4603 /]# date
Mon Jan 20 10:45:44 CST 2020
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
将上述操作写入Dockerfile
FROM centos:7 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 ntpdate telnet lsof tcpdump wget libevent libevent-devel bc systemd-devel bash-completion traceroute -y RUN useradd nginx -u 2019 && useradd tomcat -u 2020 && rm -rf /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
再次build
# docker build -t centos-base:v1 .
查看镜像历史
# docker history 7ea4139a77bb
IMAGE CREATED CREATED BY SIZE COMMENT 7ea4139a77bb 4 minutes ago /bin/sh -c useradd nginx -u 2019 && useradd … 724kB 28b5f53e48b8 32 minutes ago /bin/sh -c yum install epel-release -y && yu… 309MB 5e35e350aded 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 months ago /bin/sh -c #(nop) ADD file:45a381049c52b5664… 203MB
重写Dockerfile,将两个RUN合并
FROM centos:7 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 ntpdate 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
重新build
# docker build -t centos-base:v2 .
查看镜像历史
# docker history c9bf9722472e
IMAGE CREATED CREATED BY SIZE COMMENT c9bf9722472e 10 minutes ago /bin/sh -c yum install epel-release -y && yu… 309MB 5e35e350aded 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 months ago /bin/sh -c #(nop) ADD file:45a381049c52b5664… 203MB
两个RUN层合并了,如果安装软件比较多,镜像的size会减小很多
继续做JDK镜像
重新打个标签
# docker build -t centos-base:7 .
将build命令做成脚本
# vim build-command.sh
#!/bin/bash docker build -t centos-base:7 .
# cd /opt/dockerfile/web/jdk/
为8u92版本JDK创建目录
# mkdir 8u92
# cd 8u92/
将jdk的二进制包传入该目录下
jdk-8u192-linux-x64.tar.gz
编写Dockerfile
# vim Dockerfile
FROM centos-base:7 ADD jdk-8u192-linux-x64.tar.gz /usr/local/src #该软连接为方便以后jdk版本升级 RUN ln -sv /usr/local/src/jdk1.8.0_192 /usr/local/jdk
编写build脚本
# vim build-command.sh
#!/bin/bash docker build -t jdk-base:1.8.0.192 .
运行build脚本
# bash build-command.sh
给镜像添加环境变量
# vim Dockerfile
FROM centos-base:7 ADD jdk-8u192-linux-x64.tar.gz /usr/local/src RUN ln -sv /usr/local/src/jdk1.8.0_192 /usr/local/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
运行build脚本
# bash build-command.sh
进入容器测试环境变量
# docker run -it --rm jdk-base:1.8.0.192 bash
[root@d5cf282004c9 /]# java -version
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)
添加profile文件,将容器内的profile文件覆盖掉
# vim Dockerfile
FROM centos-base:7 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
运行build脚本
# bash build-command.sh
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
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
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
验证是否替换profile成功
# docker run -it --rm jdk-base:1.8.0.192 bash
[root@a73ecaf18ed9 /]# vim /etc/profile
[root@a73ecaf18ed9 /]# exit
继续制作tomcat镜像
# cd /opt/dockerfile/web/tomcat/
[root@localhost tomcat]# mkdir tomcat-base
[root@localhost tomcat]# cd tomcat-base/
[root@localhost tomcat-base]# cp /opt/dockerfile/web/jdk/8u92/build-command.sh .
[root@localhost tomcat-base]# ls
build-command.sh
# vim Dockerfile
FROM jdk-base:1.8.0.192 MAINTAINER Edward ADD apache-tomcat-8.5.37.tar.gz /apps
# vim build-command.sh
#!/bin/bash docker build -t tomcat-base:8.5.37 .
# bash build-command.sh
# docker run -it --rm tomcat-base:8.5.37 bash
[root@469ffdc39ca9 /]#
[root@469ffdc39ca9 /]# ll /apps/
total 0
drwxr-xr-x. 9 root root 220 Jan 20 14:33 apache-tomcat-8.5.37
[root@469ffdc39ca9 /]# exit
添加软连接
FROM jdk-base:1.8.0.192 MAINTAINER Edward ADD apache-tomcat-8.5.37.tar.gz /apps RUN ln -sv /apps/apache-tomcat-8.5.37 /apps/tomcat
再次build
# bash build-command.sh
验证tomcat服务是否可用
# docker run -it --rm -p 8080:8080 tomcat-base:8.5.37 bash
[root@b6079015a9e8 /]# ll /apps/
total 0
drwxr-xr-x. 9 root root 220 Jan 20 14:33 apache-tomcat-8.5.37
lrwxrwxrwx. 1 root root 26 Jan 20 14:40 tomcat -> /apps/apache-tomcat-8.5.37
启动tomcat服务(前台启动)
[root@b6079015a9e8 /]# /apps/tomcat/bin/catalina.sh run
web测试
tomcat镜像构建完毕!
----------------------------------------------------------------------------------------------------------------------------------------
向tomcat容器内部署代码
# cd /opt/dockerfile/web/tomcat/
# mkdir tomcat-app1
# cd tomcat-app1
# cp /opt/dockerfile/web/tomcat/tomcat-base/build-command.sh .
# vim build-command.sh
#!/bin/bash
docker build -t tomcat-app1:v1 .
编写启动脚本
# vim run_tomcat.sh
#!/bin/bash source /etc/profile echo "1.1.1.1 www.image.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
编辑XML文件
# vim Dockerfile
FROM tomcat-base:8.5.37 MAINTAINER Edward #添加业务代码 ADD code.tar.gz /data/tomcat/webapps/app1 #添加启动脚本 ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh #添加xml文件 ADD server.xml /apps/tomcat/conf #将下列路径的权限改为tomcat用户 RUN chown -R tomcat.tomcat /apps/apache-tomcat-8.5.37 /apps/tomcat /data/tomcat EXPOSE 8080 8443 CMD ["/apps/tomcat/bin/run_tomcat.sh"]
build一下
# bash build-command.sh
运行
# docker run -it --rm -p 8080:8080 tomcat-app1:v1
测试
创建第二个服务容器
# cd ..
[root@localhost tomcat]# ll
总用量 0 drwxr-xr-x. 2 root root 106 1月 20 16:31 tomcat-app1 drwxr-xr-x. 2 root root 83 1月 20 16:48 tomcat-base
全篇拷贝
[root@localhost tomcat]# cp -r tomcat-app1/ tomcat-app2
[root@localhost tomcat]# cd tomcat-app2/
[root@localhost tomcat-app2]# ll
总用量 24 -rw-r--r--. 1 root root 45 1月 20 16:50 build-command.sh -rw-r--r--. 1 root root 141 1月 20 16:50 code.tar.gz -rw-r--r--. 1 root root 309 1月 20 16:50 Dockerfile -rwxr-xr-x. 1 root root 199 1月 20 16:50 run_tomcat.sh -rw-r--r--. 1 root root 7513 1月 20 16:50 server.xml
改一下build脚本
# vim build-command.sh
#!/bin/bash
docker build -t tomcat-app2:v1 .
传入app2的业务代码
重新构建
# bash build-command.sh
运行
# docker run -it --rm -p 8080:8080 tomcat-app2:v1
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. 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.3 9e713439fdf5 1.1.1.1 www.image.net
测试