Docker 外部ボリュームのマウント

Docker を使用している場合、コンテナーがダウンした場合にデータを保持したり、コンテナー間でデータを共有したりする必要が生じることがあります。そのために、Docker ボリューム を使用できます。Confluent Platform の場合、以下のようないくつかの主なユースケースで外部ボリュームを使用する必要があります。

  1. データストレージ : Kafka および ZooKeeper は、コンテナーの実行が停止した場合や再起動した場合にデータを保持するために、外部にマウントされたボリュームが必要です。

  2. セキュリティ: セキュリティが構成されている場合、シークレットはホストに保存され、マッピングされたボリュームを使用してコンテナーで使用できるようになります。

  3. 外部 JAR を使用した Kafka Connect の構成: ホスト上のボリュームにサードパーティの JAR を保存することで、サードパーティの JAR を使用するように Kafka Connect を構成できます。

    注釈

    外部ボリュームに関するユースケースを新たにサポートする必要がある場合は、「イメージの拡張」に関するガイドを参照してください。

Kafka および ZooKeeper のデータボリューム

Kafka はログデータにボリュームを使用し、ZooKeeper はトランザクションログにボリュームを使用します。これらのサービス用に(ホスト上の)ボリュームを分離することをお勧めします。また、ホストディレクトリに Docker コンテナーユーザー(Docker の run コマンドを使用してユーザーを割り当てない限り、デフォルトでは root)の読み取り/書き込みアクセス許可があることも確認する必要があります。

重要

ホストからボリュームをマッピングする場合、フルパス(例: /var/lib/kafka/data)を使用する必要があります。

以下の例では、マウントされたボリュームでの Kafka および ZooKeeper の使用方法と、Docker コンテナーを非 root ユーザーとして実行している場合のボリュームの構成方法を示します。この例では、コンテナーは UID=1000 および GID=1000 のユーザー appuser で実行されます。すべての Confluent Platform イメージで、コンテナーは appuser ユーザーで実行されます。

Docker ホスト(例: VirtualBox VM)で、以下のディレクトリを作成します。

# Create dirs for Kafka / ZK data.
mkdir -p /vol1/zk-data
mkdir -p /vol2/zk-txn-logs
mkdir -p /vol3/kafka-data

# Make sure the user has the read and write permissions.
chown -R 1000:1000 /vol1/zk-data
chown -R 1000:1000 /vol2/zk-txn-logs
chown -R 1000:1000 /vol3/kafka-data

次に、コンテナーを開始します。

# Run ZK with user 12345 and volumes mapped to host volumes
docker run -d \
  --name=zk-vols \
  --net=host \
  --user=12345 \
  -e ZOOKEEPER_TICK_TIME=2000 \
  -e ZOOKEEPER_CLIENT_PORT=32181 \
  -v /vol1/zk-data:/var/lib/zookeeper/data \
  -v /vol2/zk-txn-logs:/var/lib/zookeeper/log \
  confluentinc/cp-zookeeper:6.2.4

docker run -d \
  --name=kafka-vols \
  --net=host \
  --user=12345 \
  -e KAFKA_BROKER_ID=1 \
  -e KAFKA_ZOOKEEPER_CONNECT=localhost:32181 \
  -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:39092 \
  -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  -v /vol3/kafka-data:/var/lib/kafka/data \
  confluentinc/cp-kafka:6.2.4

データボリュームは -v フラグを使用してマウントされます。

セキュリティ: シークレットを構成するためのデータボリューム

セキュリティが有効になっている場合、ボリュームを使用してコンテナーがシークレットを使用できるようになります。たとえば、ホストのシークレット(認証情報、キータブ、証明書、kerberos 構成、JAAS 構成)が /vol007/kafka-node-1-secrets にある場合、Kafka を以下のように構成して、シークレットを使用できます。

docker run -d \
  --name=kafka-sasl-ssl-1 \
  --net=host \
  -e KAFKA_BROKER_ID=1 \
  -e KAFKA_ZOOKEEPER_CONNECT=localhost:22181,localhost:32181,localhost:42181/saslssl \
  -e KAFKA_ADVERTISED_LISTENERS=SASL_SSL://localhost:39094 \
  -e KAFKA_SSL_KEYSTORE_FILENAME=kafka.broker3.keystore.jks \
  -e KAFKA_SSL_KEYSTORE_CREDENTIALS=broker3_keystore_creds \
  -e KAFKA_SSL_KEY_CREDENTIALS=broker3_sslkey_creds \
  -e KAFKA_SSL_TRUSTSTORE_FILENAME=kafka.broker3.truststore.jks \
  -e KAFKA_SSL_TRUSTSTORE_CREDENTIALS=broker3_truststore_creds \
  -e KAFKA_SECURITY_INTER_BROKER_PROTOCOL=SASL_SSL \
  -e KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL=GSSAPI \
  -e KAFKA_SASL_ENABLED_MECHANISMS=GSSAPI \
  -e KAFKA_SASL_KERBEROS_SERVICE_NAME=kafka \
  -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  -e KAFKA_OPTS=-Djava.security.auth.login.config=/etc/kafka/secrets/host_broker3_jaas.conf -Djava.security.krb5.conf=/etc/kafka/secrets/host_krb.conf \
  -v /vol007/kafka-node-1-secrets:/etc/kafka/secrets \
  confluentinc/cp-kafka:latest

上記の例では、-v /vol007/kafka-node-1-secrets:/etc/kafka/secrets を設定して、データボリュームの場所を指定します。次に、以下のように設定して使用方法を指定します。

-e KAFKA_OPTS=-Djava.security.auth.login.config=/etc/kafka/secrets/host_broker3_jaas.conf -Djava.security.krb5.conf=/etc/kafka/secrets/host_krb.conf

外部 JAR との接続の構成

サードパーティの jar ファイルをホスト上のボリュームに保存し、そのボリュームをコンテナー上の /etc/kafka-connect/jars ファイルにマッピングすることで、このファイルを使用するように Kafka Connect を構成できます。

ホスト(例: Virtualbox VM)で、MySQL ドライバをダウンロードします。

# Create a dir for jars and download the mysql jdbc driver into the directories
mkdir -p /vol42/kafka-connect/jars

# get the driver and store the jar in the dir
curl -k -SL "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.39.tar.gz" | tar -xzf - -C /vol42/kafka-connect/jars --strip-components=1 mysql-connector-java-5.1.39/mysql-connector-java-5.1.39-bin.jar

次に、ダウンロードディレクトリを /etc/kafka-connect/jars としてマウントし、Kafka Connect を起動します。

docker run -d \
  --name=connect-host-json \
  --net=host \
  -e CONNECT_BOOTSTRAP_SERVERS=localhost:39092 \
  -e CONNECT_REST_PORT=28082 \
  -e CONNECT_GROUP_ID="default" \
  -e CONNECT_CONFIG_STORAGE_TOPIC="default.config" \
  -e CONNECT_OFFSET_STORAGE_TOPIC="default.offsets" \
  -e CONNECT_STATUS_STORAGE_TOPIC="default.status" \
  -e CONNECT_KEY_CONVERTER="org.apache.kafka.connect.json.JsonConverter" \
  -e CONNECT_VALUE_CONVERTER="org.apache.kafka.connect.json.JsonConverter" \
  -e CONNECT_INTERNAL_KEY_CONVERTER="org.apache.kafka.connect.json.JsonConverter" \
  -e CONNECT_INTERNAL_VALUE_CONVERTER="org.apache.kafka.connect.json.JsonConverter" \
  -e CONNECT_REST_ADVERTISED_HOST_NAME="localhost" \
  -e CONNECT_PLUGIN_PATH=/usr/share/java,/etc/kafka-connect/jars \
  -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  -v /vol42/kafka-connect/jars:/etc/kafka-connect/jars \
  confluentinc/cp-kafka-connect:latest