Docker 外部ボリュームのマウント¶
Docker を使用している場合、コンテナーがダウンした場合にデータを保持したり、コンテナー間でデータを共有したりする必要が生じることがあります。そのために、Docker ボリューム を使用できます。Confluent Platform の場合、以下のようないくつかの主なユースケースで外部ボリュームを使用する必要があります。
データストレージ : Kafka および ZooKeeper は、コンテナーの実行が停止した場合や再起動した場合にデータを保持するために、外部にマウントされたボリュームが必要です。
セキュリティ: セキュリティが構成されている場合、シークレットはホストに保存され、マッピングされたボリュームを使用してコンテナーで使用できるようになります。
外部 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.1.5
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.1.5
データボリュームは -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