1、dockerfile文件
[root@localhost ~]# cat dockerfile
FROM openjdk:8-jre-alpine
# Install required packages
RUN apk add --no-cache \
bash \
su-exec
ENV ZOO_USER=zookeeper \
ZOO_CONF_DIR=/conf \
ZOO_DATA_DIR=/data \
ZOO_DATA_LOG_DIR=/datalog \
ZOO_PORT=2181 \
ZOO_TICK_TIME=2000 \
ZOO_INIT_LIMIT=5 \
ZOO_SYNC_LIMIT=2 \
ZOO_MAX_CLIENT_CNXNS=60
# Add a user and make dirs
RUN set -ex; \
adduser -D "$ZOO_USER"; \
mkdir -p "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR"; \
chown "$ZOO_USER:$ZOO_USER" "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR"
ARG GPG_KEY=AF3D175EC05DB249738D01AC8D8C3C3ED0B02E66
ARG DISTRO_NAME=zookeeper-3.9.2
# Download Apache Zookeeper, verify its PGP signature, untar and clean up
RUN set -ex; \
apk add --no-cache --virtual .build-deps \
ca-certificates \
gnupg \
libressl; \
wget -q "https://www.apache.org/dist/zookeeper/$DISTRO_NAME/apache-$DISTRO_NAME-bin.tar.gz"; \
wget -q "https://www.apache.org/dist/zookeeper/$DISTRO_NAME/apache-$DISTRO_NAME-bin.tar.gz.asc"; \
export GNUPGHOME="$(mktemp -d)"; \
gpg --keyserver ha.pool.sks-keyservers.net --recv-key "$GPG_KEY" || \
gpg --keyserver pgp.mit.edu --recv-keys "$GPG_KEY" || \
gpg --keyserver keyserver.pgp.com --recv-keys "$GPG_KEY"; \
gpg --batch --verify "apache-$DISTRO_NAME-bin.tar.gz.asc" "apache-$DISTRO_NAME-bin.tar.gz"; \
tar -xzf "apache-$DISTRO_NAME-bin.tar.gz"; \
mv "apache-$DISTRO_NAME-bin" "$DISTRO_NAME"; \
mv "$DISTRO_NAME/conf/"* "$ZOO_CONF_DIR"; \
chown -R "$ZOO_USER:$ZOO_USER" "$DISTRO_NAME"; \
rm -rf "$GNUPGHOME" "apache-$DISTRO_NAME-bin.tar.gz" "apache-$DISTRO_NAME-bin.tar.gz.asc"; \
apk del .build-deps
WORKDIR $DISTRO_NAME
VOLUME ["$ZOO_DATA_DIR", "$ZOO_DATA_LOG_DIR"]
EXPOSE $ZOO_PORT 2181 2888 3888
ENV PATH=$PATH:/$DISTRO_NAME/bin \
ZOOCFGDIR=$ZOO_CONF_DIR
COPY docker-entrypoint.sh /
RUN chmod 777 /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["zkServer.sh", "start-foreground"]
2、docker-entrypoint.sh文件
[root@localhost ~]# cat docker-entrypoint.sh
#!/bin/bash
set -e
# Allow the container to be started with `--user`
if [[ "$1" = 'zkServer.sh' && "$(id -u)" = '0' ]]; then
chown -R "$ZOO_USER" "$ZOO_DATA_DIR" "$ZOO_DATA_LOG_DIR"
exec su-exec "$ZOO_USER" "$0" "$@"
fi
# Generate the config only if it doesn't exist
if [[ ! -f "$ZOO_CONF_DIR/zoo.cfg" ]]; then
CONFIG="$ZOO_CONF_DIR/zoo.cfg"
echo "clientPort=$ZOO_PORT" >> "$CONFIG"
echo "dataDir=$ZOO_DATA_DIR" >> "$CONFIG"
echo "dataLogDir=$ZOO_DATA_LOG_DIR" >> "$CONFIG"
echo "tickTime=$ZOO_TICK_TIME" >> "$CONFIG"
echo "initLimit=$ZOO_INIT_LIMIT" >> "$CONFIG"
echo "syncLimit=$ZOO_SYNC_LIMIT" >> "$CONFIG"
echo "maxClientCnxns=$ZOO_MAX_CLIENT_CNXNS" >> "$CONFIG"
for server in $ZOO_SERVERS; do
echo "$server" >> "$CONFIG"
done
fi
# Write myid only if it doesn't exist
if [[ ! -f "$ZOO_DATA_DIR/myid" ]]; then
echo "${ZOO_MY_ID:-1}" > "$ZOO_DATA_DIR/myid"
fi
exec "$@"
3、构建命令
docker build -t weq/zookeeper:latest -f dockerfile .
4、docker-compose文件-单机部署
[root@localhost ~]# cat docker-compose.yaml
version: '3.1'
services:
zookeeper:
image: weq/zookeeper:latest
container_name: zookeeper
ports:
- 2181:2181
volumes:
- /data/zookeeperDate:/data
restart: always
5、启动命令
docker-compose -f docker-compose.yaml up -d zookeeper