【Docker】Imageをリモートでrunするには no.29

![パンプキン カフェ (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/80c17dca-98a3-0169-d00a-9a704bb05737.png)

こんにちは。まゆみです。

Dockerについての記事をシリーズで書いています

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/5341c8ab5ea9de278082)では、AWSのEC2インスタンスにDockerをインストールするところまで解説しました。

今回の記事では、<font color="Red">ローカルで作ったImageをリモートにpullしてrun する方法</font>を書いていこうと思います。

そうする事によって、IPアドレスを使って世界中からあなたのアプリにアクセスできるようになります＼(^o^)／

ではさっそく始めていきますね。

#LocalでImageを作ってRemoteからPullする

![Docker hub (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2014c91f-203e-d084-eb9c-834bbc68f285.png)


リモートでImageからContainerを作るためには、<font color="Red">『ローカルで』Imageを作り、『Docker hubを経由して』リモートからpull </font>します


ではまず、Docker hub にリポジトリ―を作るところからはじめて行きましょう

#docker hub にリポジトリーを作る

docker hubにログインした後、『Create Repository』をクリックします


![2021-07-05_8-11-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ce9f4642-dee8-c27b-8092-3803aa9c9b8e.png)

Repositoryに好きな名前を付けましょう(のちにImageをpushする時に必要になります)
そのあと、『Create』ボタンをクリックしましょう

![2021-07-05_8-14-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2a1cb873-919f-1a6e-28d1-ac4ef9bf51de.png)

Repository ができました。

これで、ImageをここにPushすることができます

![2021-07-05_8-16-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/c291ecc4-ef00-f1a5-38cf-e8d895323e9a.png)

#.dockerignoreファイルを作る
.dockerignoreファイルを作って、

>node_modules
Dockerfile
*.pem

とファイルに書き、Imageをbuildする時に無視するファイルを指定します

(*.pem　は『.pem拡張子のついたファイルは全て』を意味します

#ローカルでImageをbuildする

今あなたがプロジェクトフォルダーにいることを確かめ、Imageをbuildします。
-tオプションを付けて、Imageに名前を付けて実行しましょう

```
docker build -t <Image名> .
```
これでローカルにImageが作られました。

#docker hub にpush する

ローカルで作ったImageをdocker hubのリポジトリ―にpushしたいのですが、

<font color="Red">リポジトリ―名　＝　Image名</font>

でないと、pushできません。

##tag を使って、Imageの名前を変える

```
docker tag <Image名>　<リポジトリ―名>
```
先ほど、ローカルでImageをbuild する時に-t を付けてImageに名前を付けました。

そのImage名と、docker hubで作ったリポジトリ―名を使ってImageの名前を変更します

![2021-07-05_8-50-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e26aea8c-6d06-d0a2-c0b2-eb65da83e338.png)

```
docker images
```

で作ったImageのリストを出すと、変更した名前のImageができているのが分かります


![2021-07-05_8-56-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2b745180-7cfe-cd79-a302-02972cb63b37.png)

#Imageをdocker hub にpushする

```
docker push <リポジトリ―名>
```

でImageをpushします


では次にいよいよリモートからImageを引っ張ってrun していきます

#EC2インスタンスの中に入る

リモートからdocker hubのImageを引っ張ってきてrun するので、まずEC2インスタンスの中に入りましょう

(EC2インスタンスの中に入る方法が分からない方は[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/5527b517f28084ba7612)を参考にどうぞ)

#docker のコマンドrun を使う

予めEC2にdockerをインストールしているので、dockerのコマンドが使えます(EC2にdockerをインストールしていない方は[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/5341c8ab5ea9de278082)を参考にどうぞ)

docker run ....では、『Got permission denied...』とエラーが出たので、<font color="Red">sudo をつけて</font>改めてrunしてみます

結果は下のスクショのようになります

![2021-07-05_10-47-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/afc96783-27b2-58b7-d14f-d10eb593b3ed.png)

docker hub からイメージをpullしてきて、リモート上にContainerを立ち上げることができました。


![どのように、コンテナ化したnodeアプリにアクセスしたら良いのだろうか。。。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d6cad470-b099-d736-c1e9-df85d06fcbab.png)


Containerが実行中になったので、このままこのインスタンスに付与されたIPアドレスにアクセスしたら良いのでしょうか。。。？


![2021-07-05_11-02-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5d68c6c3-8008-4b5b-4f9e-815df339dcab.png)

実行中のインスタンスのパブリックIPアドレスにアクセスを試みましたが、アクセスできません。

これは、バグではなく、

EC2インスタンスのディフォルト値では、セキュリティグループのインバウンドルールによって、インスタンスの中に入ってくるリクエストは<font color="Red">全て拒否される</font>からです。

![2021-07-05_11-08-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/88635336-04cd-8eb8-0754-26ae98caa899.png)
引用元：[awsドキュメント](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/vpc-security-groups.html#vpc-inbound-rules)


AWSでのインバウンドルールをどのように更新したら良いのかを記事を改めて書いていきますね。

#まとめ
とりあえず、EC2インスタンスでContainerをrun することには成功しましたので、次回AWSのセキュリティの方をいじって世界中からアプリにアクセスできるようにしていこうと思います。