简介
许多Docker镜像都是开箱即用的,但有时候却并不一定满足我们的需求。比如,你直接从Docker Hub拉取的tomcat 使用的Java VM是Open JDK,但通常我们需要使用Oracle JDK。由于版权问题,Docker Hub无法提供基于Oracle的JDK,这时我们就需要深度定制符合我们需求的镜像了。
另外制作镜像时,应遵循复用原则,不要将所有的东西一次性打包到一个镜像,应按需将不同模块制作为单独镜像。本文分为基础OS,运行时jre,服务tomcat三层展开介绍。其中每一层均可继续用于其他镜像制作。
基础OS
首先利用docker仓库创建带centos7镜像的容器
docker create -it --name centos7 centos:7 /bin/bash
启动容器
docker run -i -t centos:7 /bin/bash
配置ssh
#安装sshd
yum -y install openssh-server
#依次执行下列命令即可(直接回车):
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
# 启动sshd
/usr/sbin/sshd -D
#编辑sshd_config配置文件,找到UsePAM yes这一段配置,将其改成UsePAM no
vi /etc/ssh/sshd_config
#安装passwd,并修改root的密码(ddarr):
yum -y install passwd
passwd root
#执行exit命令回到宿主机器
提交容器镜像
docker commit containerid rr/centos7:1.0
测试镜像
#通过docker run启动一个新的容器,参数-d表示后台运行,-p表示docker到主机的端口的映射。
docker run -d -p 10022:22 rr/centos7:1.0 /usr/sbin/sshd -D
#如果启动没问题的话,就可以登录到容器了:
ssh root@localhost -p 10022
生成ssh镜像
#创建镜像构建上下文目录,构建镜像的所有内容都会放到该目录下
mkdir osiamge
##进入该文件夹
cd osiamge
#创建Dockerfile文件
touch Dockerfile
#编辑此文件
vi Dockerfile
#Dockerfile start
#Dockerfile
FROM rr/centos7:1.0
#作者信息
MAINTAINER wangzhuhua <wangzhuhua6343@dingtalk.com >
#设置环境
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
#暴露端口
EXPOSE 22
#设置开启的服务,每个镜像只能有一个CMD有效(且最后一个)
CMD /usr/sbin/sshd -D
#Dockerfile end
#构建镜像
docker build -t rr/centos7:1.1 /root/osiamge
#启动镜像
docker run -d rr/centos7:1.1
#查看容器IP
Docker inspect containerId
#ssh登陆
ssh root@ip -p 22
至此完成基于centos7并支持ssh登陆镜像的制作。Dockerfile的最佳实践可参考官方文档:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/。
JRE
按实际需要下载相应版本的JRE,注意一定是Linux x64版本。这里选择JRE-8U161。文件名称:jre-8u161-linux-x64.tar.gz
#新建目录jre8u161
mkdir jre8u161
#将下载好的jre移至该目录
mv jre-8u161-linux-x64.tar.gz jre8u161/
#进入目录并创建Dockerfile
cd jre8u161/ && touch Dockerfile
#编辑Dockerfile
#Dockerfile start
# This is a jre image
FROM rr/centos7:1.1
MAINTAINER wangzhuhua <wangzhuhua6343@dingtalk.com >
LABEL Description="This image is used to serve Oracle jre 8u161" Version="1.0"
# Install and config Oracle jre
ADD jre-8u161-linux-x64.tar.gz /usr/lib/jvm/
RUN update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jre1.8.0_161/bin/java" 1 \
&& update-alternatives --set java /usr/lib/jvm/jre1.8.0_161/bin/java
ENV JAVA_HOME /usr/lib/jvm/jre1.8.0_161
#Dockerfile end
#构建镜像
docker build -t rr/centos7_jre8u161:1.0 /root/jre8u161
#检查版本(正确输出版本信息及完成镜像制作)
docker run --rm rr/centos7_jre8u161:1.0 java -version
当然这里的JRE的下载工作也可以写在Dockerfile内,有兴趣的同学可以研究研究。
Tomcat
按实际需要下载相应版本的Tomcat,这里选择Tomcat8.5。文件名称:apache-tomcat-8.5.29.tar.gz
#新建目录tomcatimage,
mkdir tomcatimage
#拷贝并进入目录
mv apache-tomcat-8.5.29.tar.gz tomcatimage/
#创建Dockerfile
cd tomcatimage && touch Dockerfile
#编辑Dockerfile
#Dockerfile start
# Base Tomcat Image
FROM rr/centos7_jre8u161:1.0
MAINTAINER wangzhuhua <wangzhuhua6343@dingtalk.com >
LABEL Description="This image is used to run tomcat8 with jre8." Version="1.0"
#配置环境
RUN mkdir /var/lib/tomcat8
ENV CATALINA_HOME /var/lib/tomcat8
ENV PATH $CATALINA_HOME/bin:$PATH
WORKDIR $CATALINA_HOME
# 安装Tomcat
ADD apache-tomcat-8.5.29.tar.gz /var/lib/
RUN mv /var/lib/apache-tomcat-8.5.29/* /var/lib/tomcat8/ && rm -rf /var/lib/tomcat8/bin/*.bat
#启动服务
#RUN /var/lib/tomcat8/bin/startup.sh
#复制容器启动脚本
#ADD run.sh /usr/lib/tomcat8/
#设置脚本权限
#RUN chmod 755 /usr/lib/tomcat8/run.sh
#暴露端口
EXPOSE 8080
EXPOSE 22
CMD /var/lib/tomcat8/bin/catalina.sh run
#Dockerfile end
#构建镜像
docker build -t rr/tomcat8.5.29_jre8u161:1.0 /root/tomcatimage
#运行镜像
docker run -d --name rr_tomcat.8.5.29 -p 8088:8080 rr/tomcat8.5.29_jre8u161:1.0 && docker logs -f rr_tomcat.8.5.29
访问http://宿主机IP:8088,查看结果。到此一个完整的Tomcat镜像制作完成。
注:jre的安装也可以写入这个Dockerfile内,本文不作介绍,因为在作者本人的实际环境中有仅需要Jre的服务。
镜像上传
在此之前已使用Harbor搭建一套私有仓库:harbor。本文重点在仓库的镜像上传。证书信任操作请参考:https://docs.docker.com/registry/insecure/。
#修改/usr/lib/systemd/system/docker.service,让Docker信任我们的私有仓库
ExecStart=/usr/bin/dockerd --insecure-registry harbor.rr.com
#重启docker
systemctl daemon-reload
systemctl restart docker
#登陆仓库
docker login harbor.rr.com
#tag镜像
docker tag rr/tomcat8.5.29_jre8u161:1.0 harbor.rr.com/public/tomcat8:1.0
#提交镜像
docker push harbor.rr.com/public/tomcat8:1.0
注:每台DockerServer均需要在docker.service添加配置。
到这里,我们就完成了一个基础镜像的制作并上传至私有仓库。作者本人用的是Rancher来完成编排部署工作,只需要在Rancher配置私有镜像仓库,创建一个App,添加服务时使用刚上传的镜像,这样部署工作就完成了。后续补充Jenkins+Rancher的自动化构建部署方法。