Dockerコマンドのエラー： docker-compose up ができない（またはAWSのAmazon ECRからイメージをプルできない）

## Dockerが起動できない
こんな感じのエラーが出て、Dockerを起動できなくなりました。

```bash
work_space $ docker-compose up -d

Traceback (most recent call last):
  File "site-packages/urllib3/connectionpool.py", line 677, in urlopen
  File "http/client.py", line 1252, in request
  File "http/client.py", line 966, in send
  File "site-packages/docker/transport/unixconn.py", line 43, in connect
ConnectionRefusedError: [Errno 61] Connection refused

During handling of the above exception, another exception occurred:

（〜中略〜）

docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', ConnectionRefusedError(61, 'Connection refused'))
[18539] Failed to execute script docker-compose
```

余談ですが"Dockerの起動"って曖昧な表現ですね。
Docker Desktopの起動のことかもしれないし、イメージの作成のことかもしれないし、コンテナの作成・起動のことかもしれないし、etc。

```docker-compose up``` は、イメージ未作成ならイメージを作成してコンテナを作成・起動。コンテナが既に存在すれば、そのコンテナを起動する。みたいな感じで、今回自分がやろうとしたのは「イメージを作成してコンテナを作成・起動する」の部分。

いくつか心当たりがあるので、順に試した結果を書いてみることにします。

## 他のDockerを終了させる
そういえば、他の場所で立ち上がっているコンテナがあったような気がしたので、いったんその場所に移動してDockerを完全に終了させてみます。

```bash
work_space $ cd ../another_work_space
another_work_space $ docker-compose down
Removing nginx ... done
Removing php   ... done
Removing redis ... done
Removing network sampledocker-compose_default
```

終了できました。
次に、さっきDockerを起動しようとした場所に移動して、再度起動を試みます。

```bash

another_work_space $ cd ../work_space 
work_space $ docker-compose up -d
Creating network "sampledocker-compose_default" with the default driver
Pulling php (aws_account_id.dkr.ecr.region.amazonaws.com/sample.com:php)...
ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.

Continue with the new image? [yN]
```

```ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.
``` ということで、エラーが変わりました。「イメージを新規作成して続けますか？」とのことなので、いったん "yes" で進めてみます。

```bash
Continue with the new image? [yN]y
Pulling php (aws_account_id.dkr.ecr.region.amazonaws.com/sample.com:php)...
ERROR: pull access denied for aws_account_id.dkr.ecr.region.amazonaws.com/sample.com, repository does not exist or may require 'docker login': denied: Your authorization token has expired. Reauthenticate and try again.
```

エラー内容で大体察しはつきましたが、もう一度 ```docker-compose up``` をしてから、念のため次は "NO" で進めてみることにします。

```bash
work_space $ docker-compose up -d
Pulling php (aws_account_id.dkr.ecr.region.amazonaws.com/sample.com:php)...
ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.

Continue with the new image? [yN]N
ERROR: pull access denied for aws_account_id.dkr.ecr.region.amazonaws.com/sample.com, repository does not exist or may require 'docker login': denied: Your authorization token has expired. Reauthenticate and try again.
```

やっぱりダメですね。きちんとエラーの内容を読んで対処してみます。

## AWSのAmazon ECRからイメージをプルする方法

そもそもの前提として、Dockerイメージはチーム開発用に共通のものを使用しており、AWSのAmazon ECR プライベートレジストリにホストされています。
最後のエラー内容では ```ERROR: pull access denied for aws_account_id.dkr.ecr.region.amazonaws.com/sample.com, repository does not exist or may require 'docker login': denied: Your authorization token has expired. Reauthenticate and try again.
``` とりあますが、要約すると「リポジトリが存在しないか、Dockerログインが必要なために、イメージへのアクセスができない」と書かれているので、『そうだ！AWS側でログインしてない！！』ということを思い出したのでした。



なおECRへのログインには、自分の ```aws_account_id``` と ```region``` を知る必要があります。
実は今まで出たエラー内容の中に aws_account_id と region の記載はあるのですが、別な経路での確認方法も記載します。

例えば自分の場合、region はインフラチームから事前に教えてもらっていましたが、aws_account_id はある時点で不明でした。
aws_account_id も聞けば教えてもらえたかもしれませんが、自分で調べることもできます。
（他にも、事前にAWSのアカウントが発行されている、権限が付与されている、aws configure などでAWSの個人設定を済ませていることが前提となります。）

## 自分のAWSアカウントID確認する

aws_account_idの確認方法は、AWSのユーザーガイドを参考にしました。

[AWS アカウント ID とそのエイリアス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/console_account-alias.html)

次のコマンドで自分のaws_account_idを調べてみます。

```bash
work_space $ aws sts get-caller-identity
{
    "UserId": "xxxxx",
    "Account": "00000",
    "Arn": "00000:user/name@sample.com"
}
```

account_idは ```00000``` ということが分かりました。
このidを使って、ECRにログインしてみます。

## AWSのAmazon ECRへログインする

ECRへのログイン方法は、以下の記事を参考にしています。

[AWS CLIでECRにログインする時はget-loginではなくget-login-passwordを使おう](https://qiita.com/hayao_k/items/3e4c822425b7b72e7fd0)

```<aws_account_id>``` と ```<region>``` の部分は、それぞれ自分のものに読み替えて入力します。

```bash
work_space $ aws ecr get-login-password | docker login --username AWS --password-stdin https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
Login Succeeded
```

AWS側でログインできました！
これでようやく、 ```docker-compose up``` ができそうです。

```bash
work_space $ docker-compose up -d
Pulling php (aws_account_id.dkr.ecr.region.amazonaws.com/sample.com:php)...
php: Pulling from sample.com
f2e3d4a1dba1: Already exists
98f4121a92aa: Already exists
87df5a4e1443: Already exists
2e5badece1a3: Pull complete
ef315f325e31: Pull complete

（〜中略〜）

Creating sample_redis ... done
Creating sample_php   ... done
Creating sample_nginx ... done
```

無事にDockerを起動することができました！



#### 【参考URL】
[docker-compose up って何？](https://qiita.com/kobori_akira/items/1cd058f180206fd8d139)
[AWS CLIでECRにログインする時はget-loginではなくget-login-passwordを使おう](https://qiita.com/hayao_k/items/3e4c822425b7b72e7fd00)
[AWS アカウント ID とそのエイリアス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/console_account-alias.html)
[Docs » Docker Compose » コマンドライン・リファレンス » up](https://docs.docker.jp/compose/reference/up.html)