使用docker制作zookeeper镜像

https://www.cnblogs.com/erlou96/p/13803188.html

一.准备基础环境

1.jdk 

链接:https://pan.baidu.com/s/1OZx40UEaH0vv4EW4B8dXfQ 提取码:ualu

2.zookeeper 自行下载

 

3.将这些包都放在/opt/docker 目录下,这个目录后续作为Dockerfile的启动目录

 

二.安装docker

1安装docker

yum install docker

 

2 更改DOCKER 存储目录

 

因为后续还要制作别的镜像,根目录容量不够,需要修改docker的挂载路径

  解决方法:参考https://blog.csdn.net/justlpf/article/details/103716138

 

根据docker服务的安装配置文件进行修改

vi /usr/lib/systemd/system/docker.service

在ExectStart=xxx 中添加属性

ExecStart=xxx --graph /data/lib/docker

 

 

 

 

重新更新一下docker服务

systemctl disable docker systemctl enable docker systemctl daemon-reload systemctl start docker

 

三.下载基础镜像

1.下载centos7.2的基础镜像

docker pull docker pull docker.io/centos:centos7.2.1511

 

 

 

四.制作zookeeper环境包

1.解压文件

这里我下载的介质目录如下所示:

 

 

进入zookeeper 目录 ,创建zoo.cfg文件

tar -zxvf zookeeper-3.3.4.tar.gz

mv zookeeper-3.3.4 zookeeper

cd zookeeper/

cd conf/

cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg

5.修改配置文件zoo.cfg的内容

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
clientPort=2181

2.创建一个启动zookeeper的脚本

vim start.sh

#!/bin/bash
export ZOOKEEPER_HOME=/opt/zookeeper
#mkdir -p /opt/zookeeper/data
${ZOOKEEPER_HOME}/bin/zkServer.sh start-foreground

这里一定要加上前台启动命令,否则docker会异常退出Docker容器启动web服务时,都指定了前台运行的参数,例如apache:

ENTRYPOINT [ "/usr/sbin/apache2" ]

CMD ["-D", "FOREGROUND"]

又例如nginx:

 

ENTRYPOINT [ "/usr/sbin/nginx", "-g", "daemon off;" ]

因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
一定要注意daemon off ;分号不能去掉!否则失败!!

 

接下来将start.sh拷贝到zookeeper的目录下

cp /opt/docker/start.sh /opt/docker/zookeeper

 

6.将修改后的zookeeper文件重新打成tar包

tar -czvf zookeeper.tar zookeeper

将这个包放到/opt/docker目录下。 到此:zookeeper的基础包就制作好了

五.制作jdk环境包

1.安装jdk

 

 

 将这个包放到/opt/docker目录下。到此:jdk的环境包准备好了

六.编写Dockerfile文件

vim /opt/docker/Dockerfile

# FROM命令 定义基础包
FROM docker.io/centos:centos7.2.1511
# ADD命令 将打包文件上传到镜像的根目录/ ,会自动解压
ADD zookeeper.tar /opt
ADD jdk.tar /opt
# WORKDIR命令 定义工作目录
WORKDIR /opt
# ENV命令 设置环境
ENV JAVA_HOME /opt/jdk
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$PATH
# RUN命令 执行制作镜像过程,一个RUN对应一层
#RUN yum clean all \
RUN rm -vf /etc/localtime \
#&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\
#&& rm -rfv /usr/share/backgrounds/* \
#&& rm -rfv /usr/share/doc/* \
#&& rm -rfv /usr/share/man/* \
#&& cd /usr/share/zoneinfo/ && ls |grep -v "Asia"|xargs rm -rfv \
#&& rm -rfv /var/cache/yum/* \
#&& rpm --rebuilddb \
&& chmod 755 /opt/zookeeper/start.sh
ENTRYPOINT /opt/zookeeper/start.sh
~

镜像说明: docker.io/centos:centos7.2.1511是一个基础镜像,后面的操作等于我们登录到了centos操作系统上面执行后续的操作,

ADD镜像拷贝,add默认会有个自动解压的操作,copy不会默认自动解压。COPY命令用于将于Dockerfile所在目录中的文件在镜像构建阶段从宿主机拷贝到镜像中,对于文件而言可以直接将文件复制到镜像中,add除了copy的作用还有自动对tar进行解压

默认的workdir是centos的根目录,上面的dockfile中指定work_path为 /opt,后续所有命令的执行都是在workdir目录/opt该目录下执行的,WORKDIR指令设置Dockerfile中的任何RUN,CMD,ENTRPOINT,COPY和ADD指令的工作目录。

单个Dockerfile可以使用多次WORKFDIR。如果提供一个相对路径,当前的工作目录将于上个WORKDIR指令相关。如:

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

pwd命令的输出/a/b/c

执行命令执行命令docker exec的时候,就会去读取容器的那个workdir,进入到该容器的worddir目录,这里一定要注意

 

ENV JAVA_HOME 在容器中定义一个环境变量,等容器启动之后,你可以使用echo输出改环境变量的值

EXPOSE 2181定义容器启动之后容器的端口是2181

CMD $ZOOKEEPER_HOME/bin/zkServer.sh start-foreground  cmd命令表示容器启动之后执行的命令,将zookeeper启动起来

RUN表示在centos镜像中执行的一系列命令操作,如果要执行多个命令需要使用&&,如下面所示

接下来讲解下容器启动的过程中CMD和ENTRYPOINT的区别

https://blog.csdn.net/thedarkclouds/article/details/81982338

https://blog.csdn.net/u010900754/article/details/78526443

有几个关键点的结论:

上面的zookeeper我们是作为应用程序的一个服务或者进程,我们要采用ENTRYPOINT的形式,我们自己编写一个启动脚本作为ENTRYPOINT的形式进行启动

 

 

 

七.构建镜像

1.在/opt/docker目录下构建镜像

docker image build -t zookeeper_cool:v1.0 .

2.查看镜像

 

 

3.启动容器:映射端口,并且将Docker挂载本地目录及实现文件共享,这样重启容器,zk的数据不会丢失

 

需要创建这个目录:/opt/docker/zookeeper/data

 

docker run --rm --name coolsummer -p 2181:2181 -v /opt/docker/zookeeper/data:/opt/zookeeper/data -d zookeeper_cool:v

 

 

 这样容器就启动成功了

接下来我们进入到容器内部

 

 

 

八.验证zk是否启动成功

 

zkCli.sh -server 127.0.0.1:2181

 

启动成功,问题解决

 

 

 

posted on 2021-12-27 14:16  luzhouxiaoshuai  阅读(197)  评论(0编辑  收藏  举报

导航