Docker实践指南(镜像制作)

简介

许多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的自动化构建部署方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容