webdevqa.jp.net

Docker-in-Dockerを使用したDockerコンテナネットワーキング

Docker-in-dockerセットアップを使用して、親dockerコンテナーから子dockerコンテナーとネットワークを構築したいと思います。

単純なApachehttpdサーバーに接続しようとしているとしましょう。ホストマシンでhttpdコンテナを実行すると、すべてが正常に機能します。

asnyder:~$ docker run -d -p 8080:80 httpd:Alpine
asnyder:~$ curl localhost:8080
<html><body><h1>It works!</h1></body></html>

しかし、docker-in-dockerセットアップから同じことを行うと、Connection refusedエラーが発生します。

asnyder:~$ docker run -d --name mydind --privileged docker:dind
asnyder:~$ docker run -it --link mydind:docker docker:latest sh
/ # docker run -d -p 8080:80 httpd:Alpine
/ # curl localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused

私は運がなくていくつかの変更を試みました。 0.0.0.0インターフェースの指定:

asnyder:~$ docker run -d --name mydind --privileged docker:dind
asnyder:~$ docker run -it --link mydind:docker docker:latest sh
/ # docker run -d -p 0.0.0.0:8080:80 httpd:Alpine
/ # curl 0.0.0.0:8080
curl: (7) Failed to connect to 0.0.0.0 port 8080: Connection refused

ホストネットワークの使用:

asnyder:~$ docker run -d --name mydind --privileged docker:dind
asnyder:~$ docker run -it --link mydind:docker docker:latest sh
/ # docker run -d --network Host httpd:Alpine
/ # curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

驚いたことに、私はこれに関する既存の記事を見つけることができませんでした。ここの誰かがいくつかの洞察を持っていますか?

ありがとう!

16
Adam Snyder

DinDとDockerソケットのバインドマウントの両方に長所と短所があり、両方のユースケースが確かにあります。例として、 このブログ投稿のセット をチェックしてください。これは、ユースケースの1つをうまく説明しています。

上記のdocker-in-dockerセットアップの例を考えると、次の2つの方法のいずれかでApachehttpdサーバーにアクセスできます。

1)docker:dindコンテナ内から、localhost:8080で利用できるようになります。

2)最初にアクセスしようとしていたdocker:latestコンテナ内から、docker:dindコンテナに設定されているホスト名で使用できます。この場合、--name mydindを使用したため、curl mydind:8080は標準のApache<html><body><h1>It works!</h1></body></html>を提供します。

それが理にかなっていることを願っています!

11
Yuriy Znatokov

構築 ユーリーの答え

2)docker:latest container内から、[...] docker:dindコンテナに設定されているホスト名で使用できます。この場合、--name mydindを使用したため、curl mydind:8080 [...]

Gitlab CI構成では、次のことができます イメージの名前でDinDコンテナーをアドレス指定する (自動生成されるコンテナーの名前に加えて):

サービスへのアクセス


アプリケーションとのAPI統合をテストするには、Wordpressインスタンスが必要だとします。

次に、たとえば.gitlab-ci.ymltutum/wordpress 画像を使用できます。

services:
- tutum/wordpress:latest

そうでない場合 サービスエイリアスを指定 、ジョブの実行時にtutum/wordpressが開始され、ビルドコンテナから2つのホスト名でアクセスできます。

  • tutum-wordpress
  • tutum__wordpress

使用する

service:
- docker:dind

docker:8080としてそのコンテナにアクセスできるようになります。

  script:
  - docker run -d -p 8080:80 httpd:Alpine
  - curl docker:8080

編集:より明示的なホスト名が必要な場合は、 ドキュメントに記載されているようにaliasを使用できます:

services:
- name: docker:dind
  alias: dind-service

その後

  script:
  - docker run -d -p 8080:80 httpd:Alpine
  - curl dind-service:8080

Hth、dtk

7
dtk

@Yuriy Znatokovの答えは私が望むものであると私は非常に確信していますが、私はそれを長い間理解してきました。後で理解しやすくするために、完全な手順をエクスポートしました。

1)docker:dindコンテナの内側から

docker run -d --name mydind --privileged docker:dind
/ # docker run -d -p 8080:80 httpd:Alpine
/ # curl localhost:8080
<html><body><h1>It works!</h1></body></html>

2)dockerの内側から:最新のコンテナー

docker run -d --name mydind --privileged docker:dind
docker run -it --link mydind:docker docker:latest sh
/ # docker run -d -p 8080:80 httpd:Alpine
/ # curl mydind:8080
<html><body><h1>It works!</h1></body></html>
1
xiaoxinmiao