ホームページ >運用・保守 >Linuxの運用と保守 >Linux と Docker: ホスト間でコンテナを移行および同期するにはどうすればよいですか?
Linux と Docker: ホスト間の移行とコンテナーの同期を実装するにはどうすればよいですか?
要約: Docker は、軽量の仮想化ソリューションを提供する人気のあるコンテナ化テクノロジです。マルチホスト環境では、ホスト間でコンテナを移行して同期することが非常に一般的な要件です。この記事では、Linux と Docker を使用してコンテナーのクロスホスト移行と同期を実装する方法を紹介し、参考用のサンプル コードをいくつか紹介します。
2.1 移行ストレージ
コンテナ移行ストレージには、従来のレプリケーションおよび同期ファイル システム、分散ファイル システム、分散ブロック ストレージなど、一般的に使用されるテクノロジがいくつかあります。ファイル システムのレプリケーションと同期は最も一般的なアプローチであり、小規模な環境には適していますが、大規模な環境ではパフォーマンスのボトルネックを引き起こす可能性があります。分散ファイル システムと分散ブロック ストレージは、より高いパフォーマンスとスケーラビリティを提供しますが、構成と管理が比較的複雑です。ここでは、例としてファイル システムのコピーと同期を使用して説明します。
ソース ホストとターゲット ホストの 2 つのホストがあるとします。コンテナをソース ホストからターゲット ホストに移行するには、次の手順を実行できます:
ステップ 1: 停止ソースホスト上で実行されているコンテナ。
$ docker stop container_id
ステップ 2: コンテナーのファイル システムをエクスポートします。
$ docker export container_id > container.tar
ステップ 3: コンテナのファイル システムをターゲット ホストに転送します。
$ scp container.tar user@target_host:/path/
ステップ 4: コンテナのファイル システムをターゲット ホストにインポートします。
$ docker import /path/container.tar
ステップ 5: コンテナを起動して、ターゲット ホスト上で実行します。
$ docker run -d --name container_name image_name
2.2 ネットワーク同期
コンテナ移行プロセス中は、ネットワーク接続の安定性を維持することが非常に重要です。 Linux は、iptables ルール、ネットワーク名前空間、macvlan など、ネットワーク同期を実現するためのいくつかのツールとテクノロジーを提供します。正確な実装は、ネットワーク アーキテクチャと要件によって異なります。
ソース ホストとターゲット ホストの 2 つのホストがあると仮定します。移行プロセス中にコンテナのネットワーク接続を維持するには、次の手順を実行できます。
ステップ 1: 作成ソース ホストのネットワーク名前空間上でコンテナのネットワーク インターフェイスをその名前空間に移動します。
$ ip link set dev eth0 netns container_ns
ステップ 2: ターゲット ホスト上にネットワーク名前空間を作成し、コンテナのネットワーク インターフェイスをその名前空間に移動します。
$ ip link set dev eth0 netns container_ns
ステップ 3: ソース ホストで iptables ルールを設定し、コンテナのネットワーク トラフィックをターゲット ホストにリダイレクトします。
$ iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination target_ip
ステップ 4: ターゲット ホストでコンテナのネットワーク インターフェイスを起動します。
$ ip link set dev eth0 up
ステップ 5: ターゲット ホストで iptables ルールを設定し、コンテナのネットワーク トラフィックをコンテナのネットワーク名前空間に転送します。
$ iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination container_ip
Docker Swarm を構成して、マルチホスト環境でコンテナーのクロスホスト移行と同期を実装したと仮定すると、次の手順を実行できます:
ステップ 1:コンテナーを Docker Swarm クラスターに追加します。
$ docker swarm join --token SWMTKN-abcdefg1234567890 manager_ip:2377
ステップ 2: ソース ホスト上のコンテナにタグを付けて、ホスト間で移行する必要があることを示します。
$ docker service update --label-add com.docker.ucp.mesh.http.ports=80 container_name
ステップ 3: ターゲット ホスト上で同じ名前のサービスを開始します。
$ docker service create --name container_name image_name
ステップ 4: Docker Swarm は、ソース ホスト上のコンテナをターゲット ホストに自動的に移行します。
参考:
付録: コード例
# 示例代码1:复制和同步文件系统 # 步骤1:停止容器在源主机上的运行。 $ docker stop container_id # 步骤2:导出容器的文件系统。 $ docker export container_id > container.tar # 步骤3:将容器的文件系统传输到目标主机。 $ scp container.tar user@target_host:/path/ # 步骤4:在目标主机上导入容器的文件系统。 $ docker import /path/container.tar # 步骤5:启动容器在目标主机上运行。 $ docker run -d --name container_name image_name # 示例代码2:网络同步 # 步骤1:在源主机上创建网络命名空间,并将容器的网络接口移动到该命名空间。 $ ip link set dev eth0 netns container_ns # 步骤2:在目标主机上创建网络命名空间,并将容器的网络接口移动到该命名空间。 $ ip link set dev eth0 netns container_ns # 步骤3:在源主机上设置iptables规则,将容器的网络流量重定向到目标主机。 $ iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination target_ip # 步骤4:在目标主机上启动容器的网络接口。 $ ip link set dev eth0 up # 步骤5:在目标主机上设置iptables规则,将容器的网络流量转发到容器的网络命名空间。 $ iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination container_ip # 示例代码3:Docker Swarm的容器迁移和同步 # 步骤1:将容器加入到Docker Swarm集群。 $ docker swarm join --token SWMTKN-abcdefg1234567890 manager_ip:2377 # 步骤2:在源主机上标记容器,以指示它需要跨主机迁移。 $ docker service update --label-add com.docker.ucp.mesh.http.ports=80 container_name # 步骤3:在目标主机上启动同名的服务。 $ docker service create --name container_name image_name # 步骤4:Docker Swarm会自动将源主机上的容器迁移到目标主机上。
(総単語数: 原文約 1306 単語、サンプル コード 607 単語)
以上がLinux と Docker: ホスト間でコンテナを移行および同期するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。