使用docker制作zookeeper镜像
https://www.cnblogs.com/erlou96/p/13803188.html
一.准备基础环境
1.jdk
2.zookeeper 自行下载
3.将这些包都放在/opt/docker 目录下,这个目录后续作为Dockerfile的启动目录
二.安装docker
1安装docker
2 更改DOCKER 存储目录
因为后续还要制作别的镜像,根目录容量不够,需要修改docker的挂载路径
解决方法:参考https://blog.csdn.net/justlpf/article/details/103716138
根据docker服务的安装配置文件进行修改
在ExectStart=xxx 中添加属性
重新更新一下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是否启动成功
启动成功,问题解决
posted on 2021-12-27 14:16 luzhouxiaoshuai 阅读(197) 评论(0) 编辑 收藏 举报