文章目录
docker 业务镜像分层
如图所示,docker 为了实现镜像复用,减小构建镜像难度,可以使用镜像分层。 第一步先 下载官方的系统镜像 修改tag ,并且安装一些常用的基础命令,作为使用的基础系统镜像。 第二步,这一步基于自定义的系统基础镜像 安装各种软件服务,但是这一部不涉服务配置及业务代码。可以在这步创建和业务相关的账号,也可以在第一步中创建一个通用的账号。 第三步 主要是对服务的具体配置、代码 修改。
缺点: 如果突然发现 ,最底层镜像(比如系统的基础镜像) 缺少了一个包 ,现需要在底层dockerfile 中修改 ,如果生效到全局 ,则从上到下的dockerfile 都需要重新build 一下。
下面以 构建 tomcat 镜像为例。
一、构建系统基础镜像
创建存放dockerfile 的文件夹
cd /opt
mkdir dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv
root@z2:/opt/dockerfile# tree -d -L 2
.
├── system
│ ├── centos
│ ├── redhat
│ └── ubuntu
└── web
├── apache
├── jdk
├── nginx
└── tomcat
下载官方基础镜像
docker pull centos:7.8.2003
编写dockerfile
root@z2:/opt/dockerfile# cd system/centos/
FROM centos:7.8.2003
MAINTAINER zt 25958889@qq.com
RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop &
& rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && useradd www -u 2020
构建镜像
#!/bin/bash
docker build -t linux37-centos-base:7.8.2003 .
二、构建基础服务镜像
2.1 构建jdk 镜像
2.1.1 准备 jdk 安装包和profile
root@z2:/opt/dockerfile/web/jdk# ls
jdk-8u212-linux-x64.tar.gz profile
profile 主要设置java_home 变量
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
2.1.2 dockerfile
FROM linux37-centos-base:7.8.2003
maintainer zt 25958889@qq.com
ADD jdk-8u212-linux-x64.tar.gz /usr/local/src/
RUN ln -sv /usr/local/src/jdk1.8.0_212 /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
2.1.3 构建镜像
build.sh
#!/bin/bash
docker build -t linux37-centos7.8-jdk:8u212 .
root@z2:/opt/dockerfile/web/jdk# bash build.sh
2.2 构建tomcat
root@z2:/opt/dockerfile/web# mv tomcat tomcat-base
root@z2:/opt/dockerfile/web#
2.2.1 准备tomcat 安装包
root@z2:/opt/dockerfile/web/tomcat-base# ls
apache-tomcat-8.5.45.tar.gz
2.2.2 编写dockerfile
FROM linux37-centos7.8-jdk:8u212
#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.45
ENV CATALINA_HOME /apps/tomcat
ENV APP_DIR ${CATALINA_HOME}/webapps
ADD apache-tomcat-8.5.45.tar.gz /apps
RUN ln -sv /apps/apache-tomcat-8.5.45 /apps/tomcat
2.2.3 构建镜像
#!/bin/bash
docker build -t linux37-centos7.8-tomcat:8.5.45 .
root@z2:/opt/dockerfile/web/tomcat-base# bash build.sh
三、构建 业务镜像
root@z2:/opt/dockerfile/web# mkdir tomcat-app1
root@z2:/opt/dockerfile/web# cd tomcat-app1/
3.1 准备代码文件
oot@z2:/opt/dockerfile/web/tomcat-app1# mkdir app
root@z2:/opt/dockerfile/web/tomcat-app1# echo "linux37 tomcat app1 " >app/index.html
root@z2:/opt/dockerfile/web/tomcat-app1# tar czvf app.tar.gz app/
app/
app/index.html
3.2 准备tomcat 的配置文件
-
server.xml
修改目录
<Host name="localhost" appBase="/data/tomcat/webapps" unpackWARs="true" autoDeploy="true">
-
catalina.sh 修改java 资源限制
JAVA_OPTS="-server -Xms1g -Xmx1g -Xss512k -Xmn1g -XX:CMSInitiatingOccupancyFraction=65 -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10 -XX:NewSize=2048M -XX:MaxNewSize=2048M -XX:NewRatio=2 -XX:PermSize=128m -XX:MaxPermSize=512m -XX:CMSFullGCsBeforeCompaction=5 -XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled"
加权限
root@z2:/opt/dockerfile/web/tomcat-app1# chmod +x catalina.sh
3.3 编写dockerfile
FROM linux37-centos7.8-tomcat:8.5.45
maintainer zt "25958889@qq.com"
ADD app.tar.gz /data/tomcat/webapps
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
ADD server.xml /apps/tomcat/conf/server.xml
ADD catalina.sh /apps/tomcat/bin/catalina.sh
RUN chown www.www /apps/tomcat /data/tomcat /apps/apache-tomcat-8.5.45 -R
EXPOSE 8080 8443
CMD ["/apps/tomcat/bin/run_tomcat.sh"]
3.4 tomcat 启动脚本
为什么不用CMD 直接 调用Catalina.sh ? 为了可以在容器内任意重启tomcat
root@z2:/opt/dockerfile/web/tomcat-app1# vim run_tomcat.sh
#!/bin/bash
echo "nameserver 223.6.6.6" > /etc/resolv.conf
su - www -c "/apps/tomcat/bin/catalina.sh start"
tail -f /etc/hosts
3.5 构建镜像
#!/bin/bash
docker build -t linux37-tomcat:app1 .
root@z2:/opt/dockerfile/web/tomcat-app1# bash build.sh
3.6 验证结果
root@z2:~# docker run -d -p 8888:8080 linux37-tomcat:app1
0be13e1e787d629441c598cd1b0ceb515ca4c4eec5fe860d8a5b03b9ad7dbcb1
root@z2:~# curl http://192.168.1.102:8888/app/
linux37 tomcat app1