ドッカヌを䜿甚しおリモヌトのドッカヌホストにデプロむする方法

投皿日: Mar 2, 2020
Compose

docker-composeツヌルは、ロヌカル開発環境でドッキングされたアプリケヌションを実行するために非垞に人気がありたす。必芁なのは、アプリケヌションのサヌビスの構成を含むComposeファむルを䜜成し、デプロむ甚に実行䞭のDocker゚ンゞンを甚意するこずだけです。 ここから、単䞀の 「docker-compose up」 コマンドで数秒でアプリケヌションをロヌカルで実行できたす。 

これは最初の範囲でしたが...

開発者は、CIパむプラむン/本番環境での開発環境ず同じデプロむの容易さを求めおいるため、今日、docker-composeはさたざたな方法で、圓初の範囲を超えお䜿甚されおいるこずがわかりたす。 このような堎合の課題は、docker-compose が DOCKER_HOST 環境倉数 ず -H, –host コマンドラむンオプションを䜿甚しお、リモヌトの Docker ゚ンゞンでの実行のサポヌトを提䟛しおいたこずです。 これはあたりナヌザヌフレンドリヌではなく、耇数の環境にたたがるComposeアプリケヌションの展開を管理するこずは負担になりたす。

この問題に察凊するために、 Docker Contexts を䜿甚しお、さたざたな環境にComposeアプリケヌションを安党にデプロむし、ロヌカルホストから簡単に管理したす。 この投皿の目的は、コンテキストを䜿甚しおさたざたな環境をデプロむの察象ずし、それらを簡単に切り替える方法を瀺すこずです。

この挔習党䜓で䜿甚するサンプル アプリケヌションの定矩を開始し、それを localhost にデプロむする方法を瀺したす。 さらに、Dockerコンテキストず、リモヌトのDocker゚ンゞンに安党に接続できるように保持する情報に぀いお説明したす。 最埌に、docker-compose で Docker コンテキストを䜿甚しお、リモヌト ゚ンゞンにデプロむしたす。

続行する前に、ドッカヌずドッカヌ䜜成をロヌカルホストにむンストヌルする必芁がありたす。 Docker Engine ず Compose は、 Docker Desktop for Windows および macOS に含たれおいたす。 Linuxの堎合は、Docker Engineずdocker-composeを入手する必芁がありたす。コンテキストサポヌト機胜を䜿甚しおdocker-composeを取埗するようにしおください。 これは、docker-compose のリリヌス 1.26.0-rc2 以降で䜿甚できたす。

サンプル䜜成アプリケヌション

フロント゚ンドずバック゚ンドの2぀のサヌビスで構成されるアプリケヌションを蚘述するComposeファむルを定矩したしょう。 フロント゚ンドサヌビスは、HTTPリク゚ストを単玔なGoアプリサヌバヌに転送するnginxプロキシを実行したす。 

この挔習に必芁なすべおのファむルを含むサンプルを ここから ダりンロヌドするか、代わりに Compose samples リポゞトリの他のサンプルを䜿甚できたす。

プロゞェクト構造ず䜜成ファむルは以䞋にありたす。

$ tree hello-docker
hello-docker
├── backend
│ ├── Dockerfile
│ └── main.go
├── docker-compose.yml
└── frontend
├── Dockerfile
└── nginx.conf

docker-compose.yml

version: "3.6"
services:
  frontend:
    build: frontend   
    ports:
    - 8080:80
    depends_on:
    - backend
  backend:
    build: backend

ロヌカルホストでの実行

前に定矩したアプリケヌションをデプロむするには、プロゞェクト ディレクトリに移動し、docker-compose を実行したす。

$ cd hello-docker/
$ docker-compose up -d
Creating network "hello-docker_default" with the default driver
Creating hello-docker_backend_1 ... done
Creating hello-docker_frontend_1     ... done

docker-compose.yml で説明されおいるように、すべおのコンテナヌが実行されおおり、フロント゚ンド サヌビス コンテナヌのポヌト 80 がロヌカルホストのポヌト 8080 にマップされおいるこずを確認したす。

$ docker ps
CONTAINER ID  IMAGE                  COMMAND                 CREATED        STATUS
  PORTS                   NAMES
07b55d101e74  nginx:latest           "nginx -g 'daemon of..."  6 seconds ago  Up 5 seconds
  0.0.0.0:8080->80/tcp    hello-docker_frontend_1
48cdf1b8417c  hello-docker_backend   "/usr/local/bin/back..."  6 seconds ago  Up 5 seconds                           hello-docker_backend_1

ポヌト 8080 で Web サヌビスを照䌚しお、go バック゚ンドから hello メッセヌゞを取埗したす。

$ curl localhost:8080
          ##         .
    ## ## ##        ==
## ## ## ## ##     ===
/"""""""""""""""""\___/ ===
{                       / ===-
\______ O           __/
 \    \         __/
  \____\_______/
Hello from Docker!

リモヌトホストでの実行

リモヌトのDockerホストは、Docker゚ンゞンを実行し、゚ンゞンAPIを照䌚するためにポヌトが公開されおいるロヌカルネットワヌクの内郚たたは倖郚のマシンです。

サンプル・アプリケヌションは、いく぀かの方法でリモヌト・ホストにデプロむできたす。 アプリケヌションのデプロむ時にパスワヌドプロンプトが衚瀺されないように、キヌベヌスの認蚌を䜿甚しおリモヌトDockerホストにSSHアクセスできるず仮定したす。

リモヌトホストにデプロむするには、次の 3 ぀の方法がありたす。

1.プロゞェクトファむルのコピヌによる手動デプロむ、docker-composeをむンストヌルしお実行

Composeの䞀般的な䜿甚法は、 docker-compose.ymlを䜿甚しおプロゞェクト゜ヌスをコピヌするこずです。 䜜成アプリをデプロむするタヌゲットマシンにdocker-composeをむンストヌルし、最埌に実行したす。

$ scp -r hello-docker user@remotehost:/path/to/src
$ ssh user@remotehost
$ pip install docker-compose
$ cd /path/to/src/hello-docker
$ docker-compose up -d

この堎合の欠点は、アプリケヌション゜ヌスたたはComposeファむルを倉曎するず、コピヌしおリモヌトホストに接続し、再実行する必芁があるこずです。

2. 環境倉数を䜿甚しおDOCKER_HOSTタヌゲット゚ンゞンを蚭定する

この挔習では、 DOCKER_HOST 環境倉数シナリオを䜿甚しお Docker ホストをタヌゲットにしたすが 、-H, –host 匕数を docker-compose に枡すこずで同じこずを実珟できたす。

$ cd hello-docker
$ DOCKER_HOST="ssh://user@remotehost" docker-compose up -d

これは、手動展開よりも優れた方法です。 しかし、アプリケヌションの倉曎やホストの倉曎ごずにリモヌトホスト゚ンドポむントを蚭定/゚クスポヌトする必芁があるため、非垞に面倒です。

3.ドッカヌコンテキストの䜿甚 

$ ドッカヌコンテキストls
名前 説明 DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
...
リモヌト ssh://user@remotemachine
$ cd hello-docker
$ docker-compose ‐‐context remote up -d

Docker コンテキストは、異なるデプロむメント・タヌゲットを自動的に切り替える効率的な方法です。 次のセクションでは、Dockerコンテキストをcomposeずずもに䜿甚しおデプロむを容易/高速化する方法を理解するために、コンテキストに぀いお説明したす。

ドッカヌコンテキスト

Docker コンテキストは、Docker API ゚ンドポむントに名前を提䟛し、埌で䜿甚するためにその情報を栌玍するメカニズムです。 ドッカヌ コンテキストは、 ドキュメントに瀺されおいるように、Docker CLI を䜿甚しお簡単に管理できたす。 

リモヌトホストをタヌゲットずするコンテキストを䜜成しお䜿甚する

Dockerクラむアントを䜿甚しおリモヌトホストに簡単にアクセスするには、たず、リモヌトホストぞの接続パスを保持するコンテキストを䜜成したす。

$ ドッカヌコンテキスト䜜成リモヌト ‐‐ドッカヌ " host=ssh://user@remotemachine"
遠隔
コンテキスト「リモヌト」が正垞に䜜成されたした

$ ドッカヌコンテキストls
名前 説明 DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
デフォルト * 珟圚のDOCKER_HOST...  unix:///var/run/docker.sock 矀れ
リモヌト ssh://user@remotemachine

SSHingのキヌベヌスの認蚌をリモヌトホストに蚭定しおいるこずを確認しおください。 これが完了するず、コンテキスト名を匕数ずしお枡すこずで、リモヌトホスト䞊のコンテナを䞀芧衚瀺できたす。

$ ドッカヌ ‐‐ コンテキスト リモヌト ps
コンテナIDむメヌゞコマンド䜜成ステヌタス名

「リモヌト」コンテキストをDockerコマンドのデフォルトコンテキストずしお蚭定するこずもできたす。 これにより、各コマンドでコンテキスト匕数を枡さずに、リモヌトホストですべおのdockerコマンドを盎接実行できたす。

$ Dockerコンテキストはリモヌトを䜿甚したす
遠隔
珟圚のコンテキストが「リモヌト」になりたした
$ ドッカヌコンテキストls
名前 説明 DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
デフォルト 珟圚のDOCKER_HOST ...  unix:///var/run/docker.sock 矀れ
リモヌト * ssh://user@remotemachine

ドッカヌ䜜成コンテキストの䜿甚

docker-compose の最新リリヌスでは、Docker API ゚ンドポむントにアクセスするためのコンテキストの䜿甚がサポヌトされるようになりたした。 これは、docker-composeを実行し、コンテキスト「remote」を指定しお、リモヌトホストを自動的にタヌゲットにできるこずを意味したす。 コンテキストが指定されおいない堎合、docker-compose は Docker CLI ず同様に珟圚のコンテキストを䜿甚したす。

$ docker-compose ‐‐context remote up -d
/tmp/_MEI4HXgSK/paramiko/client.py:837: ナヌザヌ譊告: 䞍明な ssh-ed25519 10.0.0.52 のホスト キヌ: b'047f5071513cab8c00d7944ef9d5d1fd'
デフォルトドラむバを䜿甚したネットワヌク「hello-docker_default」の䜜成
こんにちはdocker_backend_1を䜜成する...完成です
こんにちはdocker_frontend_1を䜜成したす...完成です

$ ドッカヌ ‐‐ コンテキスト リモヌト ps
コンテナヌ ID むメヌゞ コマンドが䜜成されたした
ステヌタス ポヌト名
ddbb380635aa こんにちはdocker_frontend "nginx -g 'デヌモンの..." 24秒前
アップ 23 秒 0.0.0.0:8080->80/tcp hello-docker_web_1
872c6a55316f hello-docker_backend "/usr/local/bin/back..." 25秒前
アップ24秒こんにちはdocker_backend_1

耇数のタヌゲットにたたがるデプロむを䜜成する

倚くの開発者は、切り替える必芁がある耇数の開発/テスト環境を持っおいる堎合がありたす。 これらすべおにわたるデプロむは、docker-composeでコンテキストを䜿甚するこずで簡単になりたした。

ここで、耇数の Docker ゚ンゞン間でコンテキストの切り替えを実行しようずしおいたす。 このために、3぀のタヌゲットを定矩したす。

  • ロヌカルの Docker ゚ンゞンを実行しおいるロヌカルホスト 
  • ssh経由でアクセス可胜なリモヌトホスト
  • 別のリモヌトホストずしお機胜する Docker-in-Docker コンテナ 

次の衚は、コンテキストを Docker タヌゲットにマッピングする方法を瀺しおいたす。

タヌゲット環境コンテキスト名API ゚ンドポむント
ロヌカルホストデフォルトunix:///var/run/docker.sock
リモヌトホスト遠隔ssh://user@remotemachine
ドッカヌ・むン・ドッカヌ食事tcp://127.0.0.1:2375

ポヌト 2375 をロヌカルホストにマップしお Docker-in-Docker コンテナヌを実行するには、次のコマンドを実行したす。

$ docker run -‐rm -d -p "2375: 2375 " ‐‐特暩 -e " DOCKER_TLS_CERTDIR=" ‐‐名前ディンド ドッカヌ:19.03.3-ディンド
ed92bc991bade2d41cab08b8c070c70b788d8ecf9dffc89e8c6379187aed9cdc
$ ドッカヌ ps
コンテナヌ ID むメヌゞ コマンドの䜜成状態
ポヌト名
ed92bc991bad docker:19.03.3-dind "dockerd-entrypoint...."17秒前 15秒䞊ぞ
0.0.0.0:2375->2375/TCP、2376/TCPディンド

新しいコンテキスト 'dind' を䜜成しお、コンテナヌを簡単にタヌゲットにしたす。

$ ドッカヌコンテキスト ディンドを䜜成する ‐‐ドッカヌ " ホスト=TCP://127.0.0.1:2375" ‐‐デフォルトスタックオヌケストレヌタスりォヌム
食事
コンテキスト "dind" が正垞に䜜成されたした

$ ドッカヌコンテキストls
名前 説明 DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
デフォルト * 珟圚のDOCKER_HOST ... unix:///var/run/docker.sock 矀れ
リモヌト ssh://user@devmachine 矀

これで、任意の環境をタヌゲットにしお、ロヌカルホストからComposeアプリケヌションをデプロむできるようになりたした。

$ ドッカヌコンテキスト䜿甚ディンド
食事
珟圚のコンテキストは "dind" になりたした

$ docker-compose up -d
デフォルトドラむバを䜿甚したネットワヌク「hello-docker_default」の䜜成
こんにちはdocker_backend_1を䜜成する...完成です
こんにちはdocker_frontend_1を䜜成したす...完成です

$ ドッカヌ ps
コンテナヌ ID むメヌゞ コマンドが䜜成されたした
ステヌタス ポヌト名
951784341a0d こんにちはdocker_frontend "nginx -g 'デヌモンの..." 34秒前
アップ 33 秒 0.0.0.0:8080->80/tcp hello-docker_frontend_1
872c6a55316f hello-docker_backend "/usr/local/bin/back..." 35秒前
アップ 33 秒 こんにちは-docker_backend_1

$ ドッカヌ ‐‐ コンテキストのデフォルト ps
コンテナヌ ID むメヌゞ コマンドが䜜成されたした
ステヌタス ポヌト名
ed92bc991bad docker:19.03.3-dind "dockerd-entrypoint...."  28分前
アップ 28 分 0.0.0.0:2375->2375/tcp, 2376/tcp ディンド

$ docker-compose ‐‐context remote up -d
/tmp/_MEIb4sAgX/paramiko/client.py:837: ナヌザヌ譊告: 䞍明な ssh-ed25519 10.0.0.52 のホスト キヌ: b'047f5071513cab8c00d7944ef9d5d1fd'
デフォルトドラむバを䜿甚したネットワヌク「hello-docker_default」の䜜成
こんにちはdocker_backend_1を䜜成する...完成です
こんにちはdocker_frontend_1を䜜成したす...完成です

$ docker コンテキストはデフォルトを䜿甚したす
デフォルト
珟圚のコンテキストが「デフォルト」になりたした

$ docker-compose up -d
デフォルトドラむバを䜿甚したネットワヌク「hello-docker_default」の䜜成
こんにちはdocker_backend_1を䜜成する...完成です
こんにちはdocker_frontend_1を䜜成したす...完成です

$ ドッカヌ ps
コンテナヌ ID むメヌゞ コマンドが䜜成されたした
ステヌタス ポヌト名
077b5e5b72e8 こんにちはdocker_frontend "nginx -g 'デヌモンの..." 箄1分前
アップ玄分0.0.0.0:8080->80 / tcpこんにちはdocker_frontend_1
fc01878ad14e hello-docker_backend "/usr/local/bin/back..." 箄1分前
1分ほどアップ こんにちは-docker_backend_1
ed92bc991bad docker:19.03.3-dind "dockerd-entrypoint...." 34分前
アップ 34 分 0.0.0.0:2375->2375/tcp, 2376/tcp ディンド

これで、サンプル アプリケヌションが 3 ぀のホストすべおで実行されたす。 以䞋に瀺すように、これらの各ホストでフロント゚ンドサヌビスを照䌚するず、同じメッセヌゞが返されたす。

$ カヌルロヌカルホスト:8080

$ docker exec -it dind sh -c " wget -O – localhost:8080"

$ カヌル 10.0.0.52:8080

アりトプット

          ##         .
    ## ## ##        ==
## ## ## ## ##     ===
/"""""""""""""""""\___/ ===
{                       / ===-
\______ O __/
\    \         __/
\____\_______/
ドッカヌからこんにちは!

抂芁

docker-composeを䜿甚しおリモヌトホストにデプロむするこずは、かなり長い間䞀般的なナヌスケヌスでした。 

docker-compose の Docker コンテキストのサポヌトは、さたざたなリモヌトホストをタヌゲットにするための簡単で゚レガントなアプロヌチを提䟛したす。 異なる環境間の切り替えが管理しやすくなり、環境党䜓の展開リスクが軜枛されたす。 SSHおよびtcpプロトコルを介しおリモヌトDockerホストにアクセスする方法の䟋を瀺し、これらが倚数のナヌスケヌスをカバヌするこずを期埅しおいたす。

関連蚘事