Dokcer-Dockerfile案例(二)

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而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分钟以上。这样就导致我们的工作效率降低。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

相关推荐
蓁蓁啊41 分钟前
GIT使用SSH 多账户配置
运维·git·ssh
程序猿小三3 小时前
Linux下基于关键词文件搜索
linux·运维·服务器
虚拟指尖4 小时前
Ubuntu编译安装COLMAP【实测编译成功】
linux·运维·ubuntu
椎4955 小时前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
刘某的Cloud5 小时前
parted磁盘管理
linux·运维·系统·parted
啊?啊?5 小时前
4 解锁 Linux 操作新姿势:man、grep、tar ,创建用户及添加权限等 10 大实用命令详解
linux·服务器·实用指令
程序员老舅5 小时前
干货|腾讯 Linux C/C++ 后端开发岗面试
linux·c语言·c++·编程·大厂面试题
极验5 小时前
iPhone17实体卡槽消失?eSIM 普及下的安全挑战与应对
大数据·运维·安全
爱倒腾的老唐5 小时前
24、Linux 路由管理
linux·运维·网络
程序员Aries5 小时前
自定义网络协议与序列化/反序列化
linux·网络·c++·网络协议·程序人生