作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:
Docker基本情况
Docker基本命令
Dockerfile(本小节属于)
Docker镜像
Docker仓库
Docker原理
Docker网络&存储&日志
Docker-Compose
Docker番外篇
我们上小节这个Dockerfile,模拟了一个需求,今天我们将模拟另外一个需求,这些需求在实际上的运维当中,可能和现在的需求都不一样,但是作为理解这个Dockerfile还是没问题的。
需求
1.基础镜像使用centos:7。
2.环境需要安装基础环境openjdk1.8。
3.这个openjdk环境还需要经常变化。
4.然后要使用这个基础环境安装部署java软件zookeeper。
拆解需求
1.基础镜像,这个没什么好说,根据业务或者技术需求自己选合适的即可。
2.环境需要安装一个openjdk版本,而且还需要经常变,我们怎么来实现这个变化呢?我们是不是可以把这个需求拆分:基础镜像+openjdk=openjdk1.8镜像;基础镜像+openjdk11=openjdk11镜像,及其他版本,然后把这个openjdk:1.8镜像作为应用程序的基础镜像,甚至应用程序还可以进行拆分。
3.安装测试应用程序zookeeper。
实操
openjkd1.8镜像
bash
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*.repo && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
yum -y install java-1.8.0-openjdk
#也可以根据自己的需要,定义自己的tag
docker build -t openjdk:1.8
openjdk11镜像
bash
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*.repo && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
yum -y install java-11-openjdk
#也可以根据自己的需要,定义自己的tag
docker build -t openjdk:11
zookeeper镜像
bash
FROM openjdk:1.8
ENV ZOOKEEPER_VERSION=3.7.2 \
ZOOKEEPER_HOME=/opt/zookeeper \
ZOOKEEPER_BINARY=apache-zookeeper-3.7.2-bin.tar.gz
RUN mkdir -p ${ZOOKEEPER_HOME} && \
cd /tmp && \
curl -O https://dlcdn.apache.org/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/${ZOOKEEPER_BINARY} && \
tar -xzf ${ZOOKEEPER_BINARY} -C ${ZOOKEEPER_HOME} --strip-components=1 && \
rm /tmp/${ZOOKEEPER_BINARY} && \
cd ${ZOOKEEPER_HOME} && \
mv ./conf/zoo_sample.cfg ./conf/zoo.cfg
WORKDIR ${ZOOKEEPER_HOME}
EXPOSE 2181
CMD ["bin/zkServer.sh", "start-foreground"]
总结
1.这里的核心是让你理解我们和合理利用镜像的分层功能(至于是什么分层,如何分层,我们将在下一小节讲解),不需要所有操作都从最基础的镜像做。这样我们后面需要升级jdk版本的时候,只要把FROM更换成openjdk11即可。
2.这样做可以让我们构建的速度更快,同时上传下载镜像速度也会更快。
3.而且我们如果有修改,只需要修改变更部分即可,不需要全局修改。
4.还有一个做镜像的经验(这里还是以centos7为例):
首先就是基于centos7创建一个容器,然后根据需要在容器里面完成所有安装部署工作。
其次就是基于刚才在容器里面操作命令写成Dockerfile,这样避免凭空写出来的Dockerfile错误,而进行频繁的修改和调试。比如我在构建这个zookeeper的镜像的时候,就多次构建,而我用的下载地址是国外的,每次光下载镜像就需要5分钟以上。这样就导致我们的工作效率降低。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。