Azure Linux VM に Gitlab のDocker 入れようとしてめっちゃはまった話(エラー編)

## 追記及びお詫び
解決編を執筆する予定でしたが、プロジェクトが頓挫したため、何も解決がないまま終わってしまいました。
ただのIssueを残す結果となり誠に申し訳ありません。

## Attension
この記事はエラー編と解決編に分けているので、「お前のエラーなんかどうでもいいから解決法はよ」という方は解決編(作成中)だけをお読みください。
こんな思考回路で解決まで至ったよという過程を書ければと思います。

## 経緯
現場でクラウドアプリケーションを開発する際にAzure上にDocker環境を構築することになりました。
ローカルのVM上には構築したことがあったので「なんとかなるっしょ！」と思っていたら、全然そんなことなかったので、そのはまった点と解決法を共有します。
今回はするまでにはまった点についてお話ししていきます。
ちなみにDocker経験者皆無なので、ほぼ一人で解決するよ！
だから、現場の人にはよ聞けはなしね！

## 目的
1. Azure VM Linux状にDocker環境を構築する
2. Gitlabに作成したDocker ImageをPullする

これだけだったはずなんだけどな・・・

## 拡張機能の罠
@hiroshi1000さんの[AzureでDockerしよう（準備編）](https://qiita.com/hiroshi1000/items/81fecf91c94a3bff73ba)という記事にも書かれているのですが、AzureはVMを立てた後、Dockerを拡張機能として追加することで構築できるそうです。
しかし、2018年10月現在、公式のドキュメントではこのようなアナウンスがされています。
![Azure2.JPG](https://qiita-image-store.s3.amazonaws.com/0/228436/152ba424-4e0c-04d6-e002-786bf111b830.jpeg)

参考：
・[Azure Docker VM 拡張機能を使用する | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/dockerextension)

拡張機能が廃止されるだと・・・？
サービスのリリースは10月中なので、11月に廃止となると非常に困ります。
ということで、拡張機能を使って行うことは早くも選択しから外れました。

## 手動で構築の罠
そもそも、VMなんだからUbuntu使って自分で構築すればいんじゃね？と思いついた僕は、次にDocker公式のドキュメントのUbuntuへの構築を参考に作業進めました。
今回は検証目的なので、Docker CEをインストールしました。
参考：
・[Get Docker CE for Ubuntu | Docker Documentation](https://docs.docker.com/install/linux/docker-ce/ubuntu/)

サクサク手順はすすみ、すべて終えることができました。
それでは、目的のGitlabからDocker Imageをpullしましょう。

```
$ sudo docker --version
Docker version 18.03.1-ce, build 9ee9f40
$ sudo docker pull XXX.XXX.XXX.XXX:XXXXX/docker-image
Error response from daemon: Get http://XXX.XXX.XXX.XXX:XXXXX/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
```
・・・あれError? Why?
どうやら名前解決ができていないために起こっているエラーのようです。
そういえばdocker login忘れてた！と思ったのですがdokcer loginも同様のエラーが発生するため、gitlabにそもそもアクセスできていないようです。

@tk555さんの[dockerでsearchまたはpullした時に名前解決が出来ないエラー](https://qiita.com/tk555/items/23bb5d3d5b613a03ca2b)や
ysanさんの[Dockerでpullやrunを行ったときイメージダウンロードができなくなった問題の解決法 - 佐藤の屋敷](http://satoyashiki.hatenablog.com/entry/2017/04/01/175604)を参考にする感じだと、どうやらDNSサーバーのネットワークがAutomaticに設定されているからとのこと。
なので、/etc/resolv.confを以下のように修正

```
nameserver: 8.8.8.8
```
変更が完了したので、早速docker loginを試みると

```
$ sudo docker login XXX.XXX.XXX.XXX:XXXXX
sudo: unable to resolve host hogehoge: Resource temporarily unavailable
Username: hoge
Password: password
Error response from daemon: Get http://XXX.XXX.XXX.XXX:XXXXX/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
```
ログインのエラーは変わらず、さらに `sudo: unable to resolve host hogehoge: Resource temporarily unavailable`というメッセージも出現しました。
そもそもさっきの設定て何をいじったのか理解が浅かったので調べると`nameserver 127.0.0.53`というのはDHCPサーバから割り当てられたIPでこれによって名前解決ができなくなってたようです。なので`/etc/hosts`にhostnameを以下のように追加して解決しました。

```
127.0.0.1 localhost
127.0.1.1 <host_name>
```
参考：
・[Chapter 5. Network setup](https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_hostname_resolution)
・[Ubuntu 16.10: /etc/resolv.confのnameserver 127.0.0.53を防ぐ - Narrow Escape](https://www.hiroom2.com/2017/08/24/ubuntu-1610-nameserver-127-0-0-53-ja/)

先ほどの`nameserver 8.8.8.8`でDNSサーバーのIPを固定したということでした。（`8.8.8.8`に関しては調べたら「魔法の呪文」としていろいろソースがありましたので、後日深堀しようと思います。）

しかし、エラーはかわらず。
一体なにが起こっているのだ？？？
ということでエラー編はここで終了です。

次は解決編をお話しできればと思います。