前提
さくらVPSで仮想サーバを借り,そのサーバ上でGitlabを運用しています.
Gitlabの立ち上げなどは,公式ドキュメントのGitLab Docker imagesを参考にdocker-composeで立ち上げました.
また,SSLの対応などは 便利なnginx-proxyのイメージがあったので.そちらを使って行おうと思って死闘したのですが,内部nginxを介さずに nginx-proxyから直接pumaサーバに飛ばそうとするのがうまくいかず,現状Gitlab単体で立ち上げという形になっています.単体で立ち上げているので,GitlabのSSLConfiguration(lets-encrypt-integration)を参考に内部でSSL証明証の取得と更新をしています.
これらはすべてdocker-composeのvolumeを指定してローカルホスト側でも保持できるように設定します.
今回はこれらの立ち上げ方法ではなく,Dockerコンテナ間の通信の疎通に関しての記事となります.
Gitlab Runnerの運用
Gitlabの運用に伴いCIを動かしたくなったため,Gitlab Runnnerの追加運用を行うことにしました.
基本的なインストールなどは公式ドキュメントのRun GitLab Runner in a containerに従い行いました.Docker初心者というのもあり,コンテナ間通信はDocker内の同じネットワークにあればいけると思い込んでいたため,いつものごとくdocker network create --driver=bridge --subnet=サブネットの指定 --gateway=ゲートウェイの指定 ネットワーク名
でネットワークを作成し,GitlabとGitlab Runnerを同一ネットワークで立ち上げました.
コンテナ間通信と調べるとおそらくローカルホスト間でのpingなどのことを指すのか,“同一のDockerネットワークに入れれば通信ができる”と書かれている記事をたくさん見かけます.しかし,外部向けに公開しているGitlabへのHttp通信などは何者かに弾かれてcurl: (7) Failed to connect to gitlab.example.com port 443: No route to host
とcurlでさえ返ってきませんでした.
Docker初心者すぎてお恥ずかしいのですが,皆さん当たり前かもしれない方法でこの点に関してコンテナ間を疎通を可能できました.そちらを戒め程度に残しておきたいと思います.
補足
gitlab.example.comはホストのグローバルIPにDNSが向いていて,コンテナ間でなければCurlなどは難なく返ってくるという状態でした.
解決策
結果として,ホスト側のファイアウォールが原因で弾かれているようでした.そこで,Dockerネットワークで使用しているネットワークをファイアウォールで通過できるような設定をする必要があることがわかりました.
今回.新しく作成したDockerネットワークは172.31.0.0/16
をサブネットとして指定しています.ネットワークの確認に関してはdocker network inspect ネットワーク名
で調べることができます.
そのため,172.31.0.0/16
のネットワークを通せばいいと思ってこのサブネットに関してファイアウォールのルールを追加しましたが,だめでした.ここで172.0.0.0/8
に関してルールを追加すれば良いという記事(Docker - No route to host)を見つけたため,実直にそれを試してみたところ無事に疎通できました.これでGitlabとGitlab Runner間の通信が可能になり,Runnerの登録ができるようになりました.
叩いたコマンドを以下にまとめておきます.もしサブネットが192.168.~~の方はそちらのファイアウォールを突破できるようにしたら良いと思います.(自信ありませんが)
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.0.0.0/8 accept'
sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --reload
sudo less /etc/firewalld/zones/public.xml
>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<masquerade/>
<!-- ここが追加されてたらGood -->
<rule family="ipv4">
<source address="172.0.0.0/8"/>
<accept/>
</rule>
</zone>
最後に
まだまだQiita書き慣れず汚い文章で申し訳ありません.Dockerが便利すぎて簡易なテストはDockerで行うようにしています.
Gitlab Runnerを使えるようになったものの,まだまだCIについては勉強不足なので精進したいと思います.
何か間違っていたらご指摘お願いします.