Docker Executor内に構築したDockerコンテナへのWebアクセス方法


本記事は以前書いた記事から最もハマった場所を抜粋したものです。
簡潔にトラブルシューティングのみ記載していきます。

全体の流れが知りたい方は以下の記事をご覧ください。
Docker in Dockerを利用してCIを構築してみた

やりたいこと

Docker Executor内に構築したDockerコンテナに対してcurlコマンドでアクセスを行い、応答が返却されるかをテストします。
用途はCI環境をDockerを利用して構築し、WebアプリもDockerコンテナとして作成したいケースが考えられます。

ハマったこと

IPアドレスを動的に取得してアクセスを試みましたができませんでした。
IPアドレスは取得できているにも関わらずTimeoutエラーが発生します。

 $ export CONTAINER_ADDRESS=$(docker inspect -f "{{.NetworkSettings.IPAddress}}" 
 ${CONTAINER_NAME})
 $ echo ${CONTAINER_ADDRESS}
 172.18.0.2
 $ curl http://${CONTAINER_ADDRESS}:80/${APP_NAME}/hello
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
   0     0    0     0    0     0      0      0 --:--:--  0:00:31 --:--:--     0
 curl: (28) Failed to connect to 172.18.0.2 port 80: Operation timed out

解決策

GitLabCIではservicesで定義したコンテナにアクセスする場合、定義した時の名前を使用する必要があります。
今回は.gitlab-ci.ymlファイル内で

services:
    - docker:dind

と定義していたため、dockerをホスト名として指定します。

 $ curl docker:80/${APP_NAME}/hello
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100    13  100    13    0     0     55      0 --:--:-- --:--:-- --:--:--    55
 Hello, World!

参考URL

Accessing the services
Docker Container Networking with Docker-in-Docker