前言
之前答应以为博友,构建一下Kafka的JAAS验证过程。但是好久没有使用Docker了,于是先拿ZooKeeper虚拟集群试试手。
PS: 在之前的工作和学习过程中,没有项目的实例进行保存,是在是有点尴尬的。其次,有些朋友不经历复杂的实践过程并不能构建出一套可以使用的系统。于是本次,使用docker构建,使得大家都能随下随用。
本人的Docker账户为: yanxml
DockerHub地址为:https://hub.docker.com/u/yanxml/
本次的章节主要分为如下几个部分:
- 使用的Docker基础命令
- 基础镜像的选择和使用
- JDK安装
- ZooKeeper本地模拟集群构建
- HubDocker镜像的使用
- 构建过程中遇到的Bug
Docker 基础命令
如果你对于Docker完全不了解的话,我建议你花一天的时间学习下Docker
技术,我相信肯定会受益匪浅的。这里只是提及下面需要使用的Docker技术。
- 启动镜像
docker run <-d 后台启动> <-i> <-t> <(镜像名:版本号)/(id)> <启动命令(CMD:ex./bin/bash)>
- 启动容器
docker start <container Name / container id>
- 进入已经启动容器
docker exec -i -t <container id> <CMD (/bin/bash)>
- 拉取容器
docker pull <conatiner name:tag>
- 推送容器
docker push <container name:tag>
- 将容器提交为镜像:
docker commit <container id> <Image Name:tag>
- 镜像/镜像TAG重命名:
docker tag <Image Name:tag / Image ID> <Image Name: tag>
基础镜像的选择和使用
在安装JDK之前,我们首先需要下载一个基础镜像,例如:alpine
、centos
、ubantu
. 在这里我选择centos
因为centos
最接近Redhat
内核,alpine
虽然最小,但是他的内核不太熟悉,可能会有许多的软件安装不上。并且Centos,很多的软件可以使用yum
一键安装,非常方便。
拉取和使用的命令如下所示:
# 拉取(没有版本限制的话 可以选择 latest最新版本)
docker pull centos:7.2.1511
# 第一次启动时(使用exit 退出镜像)
docker run -i -t centos:7.2.1511 /bin/bash
# 再次启动时
docker start 7e01ee3a466d
## 1. 先查询之前启动的镜像ID
localhost:~ Sean$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e01ee3a466d centos:7.2.1511 "/bin/bash" 22 seconds ago Exited (0) 22 seconds ago angry_mayer
## 2. 启动镜像
docker start 7e01ee3a466d
## 3. 使用docker exec 进入镜像内部
docker exec -i -t 7e01ee3a466d /bin/bash
安装JDK
如果为了方便,你可以选择openjdk
的docker镜像。这里为了保证全局都是手动完成,并且封装自己的镜像。于是,没有使用其它人的镜像。docker 内安装JDK的步骤如下所示:
- 安装wget
yum install wget
- 下载JDK文件(也可以使用
docker cp
拷贝)
wget -O "jdk.tar.gz" "https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz?AuthParam=1542014680_c4acf81cdfd8833b9e2c3f23445b4885"
注意,后面的下载地址是我在JDK官方网站点击下载,另存为链接保存下来的。各位可以去官方下载页面下载。
- 解压JDK安装包
tar -zxvf jdk.tar.gz
- 更改
/etc/profile
,末尾加上如下内容:
export JAVA_HOME=/opt/apps/jdk/jdk1.8.0_191
export PATH=$PATH:$JAVA_HOME/bin
- 更新
PATH
变量source /etc/profile
于是,JDK安装结束了。如果你想下次继续使用,或者其它项目使用。可以使用docker commit
将其保存为镜像,并且push到DockerHub上。
安装ZooKeeper
JDK 安装完毕后,先别急着退出Docker镜像。我们还需要安装ZK。安装ZK本地虚拟集群步骤如下:
(实现思路是,在一个镜像內启动三个ZK进程。并且设置3个配置文件。当然,网上也有启动三个ZK镜像的做法,这个我们以后有时间再说。)
- 下载ZK官方地址
wget "http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/"
- 解压ZK
tar -zxvf zookeeper-3.4.10.tar.gz
- 改名(个人喜好)
mv zookeeper-3.4.10 app
- 设置zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=/opt/apps/zookeeper/nodes/zk1/data
dataLogDir=/opt/apps/zookeeper/nodes/zk1/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
注意dataDir
、dataLogDir
、clientPort
、server.x
根据个人需要修改。其次,本次是本地虚拟集群,所以zoo.cfg拷贝3份,其上参数分别设置为自己需要的参数。(例如: zoo1.cfg中clientPort为2181,zoo2.cfg中为2182)。
- 设置myid 在相应节点的
dataDir
目录下,创建myid文件
。echo "1" > myid
/echo "2" > myid
/echo "3" > myid
- 完成后的结构大概如下所示:
|-- app(zk解压后文件)
|-- bin
`-- nodes
|-- zk1
| |-- conf
| | |-- zoo.cfg
| |-- data
| `-- logs
|-- zk2
| |-- conf
| | |-- zoo.cfg
| |-- data
| `-- logs
`-- zk3
|-- conf
| |-- zoo.cfg
|-- data
`-- logs
- 编写启动脚本
start.sh
#!/bin/bash
source /etc/profile
/opt/apps/zookeeper/app/bin/zkServer.sh start /opt/apps/nodes/zk1/conf/zoo.cfg
/opt/apps/zookeeper/app/bin/zkServer.sh start /opt/apps/zookeeper/zk2/conf/zoo.cfg
/opt/apps/zookeeper/app/bin/zkServer.sh start /opt/apps/zookeeper/zk3/conf/zoo.cfg
# 为了让zk的docker容器一直运行 死循环
tail -f anaconda-post.log
- 编写关闭脚本
stop.sh
#!/bin/bash
ps -ef | grep zookeeper | grep -v grep | awk '{print $2}' | xargs kill -9
- 保存镜像
docker commit 2fb6d2e4ac11 yanxml/zookeeper-cluster:0.0.4
- 推送镜像(推送前需要登陆
docker login
)
docker push yanxml/zookeeper-cluster:0.0.4
远程镜像地址: DockerHub: zookeeper-cluster
使用Docker 镜像
通过如上步骤我们构建了一个Docker本地ZK虚拟集群。以后再使用的时候就方便多了。我们只需要docker pull yanxml/zookeeper-cluster:0.0.4
下载到本地,然后启动这个镜像即可。相关命令如下所示:
# 拉取
docker pull yanxml/zookeeper-cluster:0.0.4
# 启动
docker run -d -p 2181:2181 -p 2182:2182 -p 2183:2183 yanxml/zookeeper-cluster:0.0.4 /opt/apps/zookeeper/bin/start.sh
Questions
- exec format error
exec failed: container_linux.go:348: starting container process caused "exec format error": unknown
这个错误的一个原因是script.sh没有加#!/bin/bash
- 如何查看centos系统64还是32
一、
[root@linuxzgf ~]#getconf LONG_BIT
[root@linuxzgf ~]#getconf WORD_BIT
(32位的系统中int类型和long类型一般都是4字节,64位的系统中int类型还是4字节的,但是long已变成了8字节inux系统中可用"getconf WORD_BIT"和"getconf LONG_BIT"获得word和long的位数。64位系统中应该分别得到32和64。)
二、
[root@linuxzgf ~]#uname -a
如果有x86_64就是64位的,没有就是32位的
后面是X686或X86_64则内核是64位的,i686或i386则内核是32位的
- 如何所需镜像大小
这个是最值得一提的问题。因为docker镜像大小是层层叠加的,一旦某个版本存在冗余,则整个开发产品直到最终都会存在冗余。主要有如下做法:1. 保持每个更新迭代都过程最小化;2. 将数据和日志内容进行映射,通过-m
挂载,实现容器内部和物理机器相通。
Reference
[1]. 查看CentOS系统版本是32位的还是64位的
[2]. docker “exec format error”
[3]. (Github)zookeeper-docker
[4]. Docker镜像推送(push)到Docker Hub
[5]. 使用wget下载jdk方法
[6]. docker将实例保存为镜像,移除镜像
[7]. Linux中拷贝 cp命令中拷贝所有的写法详解
[8]. Linux 下配置zookeeper集群
[9]. 安装zookeeper(单机,伪集群)
[10]. 使用 Docker 一步搞定 ZooKeeper 集群的搭建
[11]. docker环境搭建zk集群
[12]. docker 启动,端口映射,挂载本地目录
[13]. ZooKeeper系列3:ZooKeeper命令、命令行工具及简单操作
[14]. Docker容器内应用服务自启动
[15]. 批量kill掉包含某个关键字的进程
[16]. 为了让docker容器一直运行难道要写个死循环的程序?
[17]. docker CMD 命令
[18]. 如何提交docker镜像到DockerHub
[19]. 给镜像改名docker tag
[20]. Docker镜像推送(push)到Docker Hub
[21]. 如何将自己的镜像上传到Docker hub上
[22]. Docker镜像推送(push)到Docker Hub
[23]. docer缩小镜像大小的六种方法
[24]. 7 步精简 Docker 镜像几百MB(上)
[25]. 如何在Docker容器内外互相拷贝数据?