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
驚いたことに、私はこれに関する既存の記事を見つけることができませんでした。ここの誰かがいくつかの洞察を持っていますか?
ありがとう!
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>
を提供します。
それが理にかなっていることを願っています!
構築 ユーリーの答え :
2)
docker:latest container
内から、[...]docker:dind
コンテナに設定されているホスト名で使用できます。この場合、--name mydind
を使用したため、curl mydind:8080
[...]
Gitlab CI構成では、次のことができます イメージの名前でDinDコンテナーをアドレス指定する (自動生成されるコンテナーの名前に加えて):
サービスへのアクセス
アプリケーションとのAPI統合をテストするには、Wordpressインスタンスが必要だとします。
次に、たとえば
.gitlab-ci.yml
で tutum/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
@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>