EC2にdockerコンテナを立ち上げる(個人的備忘録)

##EC2にubuntuのインスタンスを作成し、キーペアを作る
インスタンス作成は割愛

```haml
-# キーペアの権限を変える
% chmod 400 キーペア.pem
-# ubuntuのインスタンスにssh接続する
% ssh -i キーペア.pem ubuntu@EC2のパブリックDNS
yes
```
キーペアの権限を変える目的は、間違って書き換えた場合、ssh接続できないので「400」と**読み取り専用**のキーペアとする。EC2のパブリックDNSはインスタンスを**停止**、**起動**で変わるので注意！

##EC2にdockerをインストール
```haml
-# アクセス権限がないので、sudoを使いupdateする。
$ sudo apt-get update
-# dockerのインストール
$ sudo apt-get install docker.io
-# Yを押す
-# dockerのバージョンの確認
$ docker -—version
```
このままだとubuntuはdockerに権限がないため、コマンドの頭に**「sudo」**を毎回つけなければならない。なので「docker」というグループを作り、「ubuntu」を入れる。すると「docker」グループに「ubuntu」は属しているため、dockerが使えるようになり、「sudo」なしにコマンドが使えるようになる。

```haml
-# 「docker」というグループに「ubuntu」をいれる 
$ sudo glassed -a ubuntu docker
Adding user ubuntu to group docker
-# 一度抜けないと反映されない
$ exit
-# ssh接続する
% ssh -i キーペア.pem ubuntu@EC2のパブリックDNS
-# dockerコマンドの確認
$ docker images
```
dockerコマンドが使えることが確認できる。

## Docker imageをtarに圧縮してEC2に送る
```haml
-# EC2に送るDocker imageの作成
％ mkdir temp_folder
% cd temp_folder
% vim Dockerfile
```
```dockerfile:Dockerfile
FROM alpine
RUN touch test
```
```
% docker build .
```
軽量のalpineを作成し、そこに「test」というファイルを作成する。
## tarファイルに変換
```haml
-# docker save イメージ名 > 新しい名前.tar
% docker save b3fc1a6f13e6 > myimage.tar
-# tarファイルの確認
% ls
```

##SFTPを使ってEC2にアクセスする。
ファイルを転送する時に使うコマンド。

```haml
-# sftpに入る(ホストとインスタンスが接続している状態)
% sftp -I キーペア.pem ubuntu@EC2のパブリックDNS
-# put 送るファイルのパス 送り先のファイルパス
sftp> put temp_folder /home/ubuntu 
-# 別のターミナルを開き、キーペアがあるディレクトリに移動し、ssh接続する。
% ssh -i mydocker.pem ubuntu@ec2-18-183-94-137.ap-northeast-1.compute.amazonaws.com
-# ファイルがあるか確認
$ ls
```
ファイルがホストからEC2に転送されていることが確認できる。

##EC2からホストへファイルを転送する
```haml
-# EC2にファイルの作成
$ touch test
-# 別のターミナルを開き、ホスト側へ移動、sftpに入る
% sftp -I キーペア.pem ubuntu@EC2のパブリックDNS
-# testファイルがあることを確認する
sftp> ls
-# testファイルを取得する
sftp> get test
-# sftpを抜ける
sftp> exit
```
デスクトップに「test」ファイルがあることを確認する

##tatファイルをdockerimageに戻す
```docker
# ssh接続する
% ssh -i キーペア.pem ubuntu@EC2のパブリックDNS
# docker load < tarファリルでimageに戻す
$ docker load < my image.tar
# imageの確認
$ docker images
# docker run(alpineはbashがないのでsh)
$ docker run -it イメージID sh
# lsコマンドでtestファイルがあることを確認
ls
```

##DockerfileをEC2に直接送り立ち上げる。
```haml
-# sftpに入る
% sftp -I キーペア.pem ubuntu@EC2のパブリックDNS
-# putでDockerfileを送る、送り先を指定しない場合はubuntuのホームディレクトリにputされる
% put Dockerfileの絶対パス
-# ssh接続する
% ssh -i mydocker.pem ubuntu@ec2-18-183-94-137.ap-northeast-1.compute.amazonaws.com
-# Dockerfileの確認
$ ls
-# ビルドコンテキストの作成
$ mkdir dsenv_build
-# Dockerfileの移動
$ mv Dockerfile dsenv_build/
$ cd dsenv_build
-# コンテナを立ち上げる
$ docker build .
```
しかし、**ストレージ(8GB)**が足りずビルドすることができない。

##コンピュータのディスク要領の確認
```docker
# -hでM,Gバイト表示になる
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            476M     0  476M   0% /dev
tmpfs            98M  768K   98M   1% /run
/dev/xvda1      7.7G  5.1G  2.7G  66% /
tmpfs           490M     0  490M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           490M     0  490M   0% /sys/fs/cgroup
/dev/loop0       97M   97M     0 100% /snap/core/9804
/dev/loop1       29M   29M     0 100% /snap/amazon-ssm-agent/2012
tmpfs            98M     0   98M   0% /run/user/1000
```
8GBで「/」はすでに5.1G使っており、残りは2.7GBしかなくbuildする際に、ストレージが足りずにBuildできない。ちなみにLinuxの場合、Dockerオブジェクトの保存場所は「/var/lib/docker/」にある。

##EC2のストレージを変更する。
1.EC2のインスタンスのページで「Elastic Block Store」のボリュームをクリックする。
2.任意のインスタンスにチェックし、「アクション」でボリュームの変更を行う。
3.サイズで20GBと設定する。
4.画面を更新し、サイズが20GBになっていることを確認する。
5.インスタンスに反映されていない可能性があるので、インスタンスを再起動しておく。

##再度buildする。

```haml
-# ssh接続
% ssh -i mydocker.pem ubuntu@ec2-18-183-94-137.ap-northeast-1.compute.amazonaws.com
-# Dockerfileの場所まで移動する
$ cd dsenv_build
-# 再度build
$ docker build .
-# ストレージが20GBになったので、異常なくbuildできる。
$ docker run -v~:/work -p 8888:8888 イメージID
```
EC2のパブリックDNS:8888で接続できることが確認できる。

##コンテナのアクセス権限
```haml
-# $ sudo adduser —uid 任意のID ユーザー名(ユーザーはsudo権限がないと作成できないので注意)
-# いろいろ聞かれるが今回は全てエンターで省略
$ sudo adduser --uid 1111 aaa
-# /home/aaaというディレクトリが作成されているので移動
$ cd /home/aaa
-# もう1人のユーザー作成
$ sudo adduser --uid 2222 bbb
-# ホームディレクトリに戻る
$ cd /home
-# ファイルの権限を確認する。
$ ls -la
-# aaaとbbbのファイルの権限が確認でき、aaaはbbbのディレクトリに書き込みができないことが確認できる。
-# aaaのユーザーで入る
docker run -u 1111 -v /home/aaa:/home/aaa -v /home/bbb:/home/bbb -it ubuntu bash
-# idの確認
1111
aaaのユーザーで入っていることが確認できる。
-# bbbディレクトリに移動
$ cd /home/bbb
-# ファイルを作成
$ touch test
```
しかし書き込み権限がないため、作成できないことが確認できる。