【AWS】EC2内のDockerを、EFSとマウントしてみました

#はじめに
EC2内にインストールしてあるDockerを、AWS EFSとマウントすることをやってみました。
手順を公開したいと思います。
・EC2のOS：Ubuntu 20.04.2 LTS
・Dockerバージョン：Docker version 20.10.8, build 3967b7d

#構成図
簡単に説明すると、
１.EC2内にDockerをインストールしておリます。
２.EFSがEC2とマウントしておリます。
３.DockerがEFSとのマウントを実現できております。
![docker-efs.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/2df3e752-2ecd-a9b2-2592-2dbfd49a24bb.jpeg)

#１.EC2内にDockerをインストール
UbuntuにDockerをインストールにあたって、下記の記事が大変参考になりました。

https://qiita.com/tkyonezu/items/0f6da57eb2d823d2611d

記事に従ってインストール作業をしたら、Dokcerのインストールが無事に完了しました。

```
$ docker --version
Docker version 20.10.8, build 3967b7d
```

#２.EC2とEFSをマウント
EFSの作成手順はここで割愛させていただきます。
EC2とEFSのマウント方法は、下記の記事が大変参考になりました。

https://qiita.com/SSMU3/items/fe2f6b74ab363b39e2f6

記事に従って操作すると、EC2内に```/mnt/efs```ディレクトリーを作成しておき、それをEFSとのマウントを実現できておリます。

```
$ df -h
Filesystem                                      Size  Used Avail Use% Mounted on
/dev/root                                        20G  2.2G   18G  12% /
devtmpfs                                        1.9G     0  1.9G   0% /dev
tmpfs                                           1.9G     0  1.9G   0% /dev/shm
tmpfs                                           388M  900K  387M   1% /run
tmpfs                                           5.0M     0  5.0M   0% /run/lock
tmpfs                                           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/loop1                                       26M   26M     0 100% /snap/amazon-ssm-agent/4544
/dev/loop0                                       34M   34M     0 100% /snap/amazon-ssm-agent/3552
/dev/loop3                                       71M   71M     0 100% /snap/lxd/19647
/dev/loop4                                       33M   33M     0 100% /snap/snapd/11588
/dev/loop2                                       56M   56M     0 100% /snap/core18/1997
fs-XXXXXXXXX.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /mnt/efs
overlay                                          20G  2.2G   18G  12% /var/lib/docker/overlay2/193018e5f21d57c9462cc7f9d6ed33f83a59506c599d3d4739d3d81712c52469/merged
tmpfs                                           388M     0  388M   0% /run/user/0
```

また、```/etc/fstab```にEFSの情報を登録することによって、EC2が起動されるタイミングで、自動的にEFSとマウントを実現することができます。

```
$ cat /etc/fstab
LABEL=cloudimg-rootfs   /        ext4   defaults,discard        0 1
fs-XXXXXXXXX:/ /mnt/efs  efs    defaults,_netdev  0 0
```

EFS内に確認用の```lalala.txt```ファイルを作成し、中に適当に文字を入れておきます。

```
$ pwd
/mnt/efs
$ sudo touch lalala.txt
$ sudo chmod 775 lalala.txt
$ sudo vi lalala.txt
$ cat lalala.txt
123123lalala
```

#３.DockerとEFS間のマウントを実現
今回はnginxのDockerを使用し、EFSとのマウントを試してみました。

まずはnginxのDokcerをインストール前に、Dockerがないことを確認します。

```
$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

EC2上の```/mnt/efs```はすでにEFSとマウントしてありますので、
これからはnginxのdocker内に```/mnt/efs```をEC2上の```/mnt/efs```をマウントし、
DockerとEFSのマウントを実現します。

```
$ sudo docker run --privileged=true -it --name nginx -d -p 8080:80 -v /mnt/efs:/mnt/efs nginx /bin/bash
369b6256d0ff62337abb2ca2067a90de2053253da379502fdccc3a95cbe92937
```

続いてngixnのDocker状態を確認し、起動できていることを確認しております。

```
$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
369b6256d0ff   nginx     "/docker-entrypoint.…"   31 seconds ago   Up 31 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx
```

nginxのDocker内部へ接続していきます。

```
$ sudo docker exec -it 369b6256d0ff bash
root@369b6256d0ff:/#
```

nginxのDocker内部の```/mnt/efs```に移動します。

```
root@369b6256d0ff:/# ls -all
total 80
drwxr-xr-x   1 root root 4096 Aug  6 03:33 .
drwxr-xr-x   1 root root 4096 Aug  6 03:33 ..
-rwxr-xr-x   1 root root    0 Aug  6 03:33 .dockerenv
drwxr-xr-x   2 root root 4096 Jul 21 00:00 bin
drwxr-xr-x   2 root root 4096 Jun 13 10:30 boot
drwxr-xr-x  10 root root 3020 Aug  6 03:33 dev
drwxr-xr-x   1 root root 4096 Jul 22 10:13 docker-entrypoint.d
-rwxrwxr-x   1 root root 1202 Jul 22 10:12 docker-entrypoint.sh
drwxr-xr-x   1 root root 4096 Aug  6 03:33 etc
drwxr-xr-x   2 root root 4096 Jun 13 10:30 home
drwxr-xr-x   1 root root 4096 Jul 22 10:13 lib
drwxr-xr-x   2 root root 4096 Jul 21 00:00 lib64
drwxr-xr-x   2 root root 4096 Jul 21 00:00 media
drwxr-xr-x   1 root root 4096 Aug  6 03:33 mnt
drwxr-xr-x   2 root root 4096 Jul 21 00:00 opt
dr-xr-xr-x 177 root root    0 Aug  6 03:33 proc
drwx------   2 root root 4096 Jul 21 00:00 root
drwxr-xr-x   3 root root 4096 Jul 21 00:00 run
drwxr-xr-x   2 root root 4096 Jul 21 00:00 sbin
drwxr-xr-x   2 root root 4096 Jul 21 00:00 srv
dr-xr-xr-x  13 root root    0 Aug  6 03:33 sys
drwxrwxrwt   1 root root 4096 Jul 22 10:13 tmp
drwxr-xr-x   1 root root 4096 Jul 21 00:00 usr
drwxr-xr-x   1 root root 4096 Jul 21 00:00 var
root@369b6256d0ff:/# cd /mnt/efs
root@369b6256d0ff:/mnt/efs# pwd
/mnt/efs
```

EFS上のファイルがDocker内にあることを確認できておリます。

```
root@369b6256d0ff:/mnt/efs# ls
lalala.txt
root@369b6256d0ff:/mnt/efs# cat lalala.txt
123123lalala
```

さらに、nginxのDocker内に、ファイルを作成してみました。

```
root@369b6256d0ff:/mnt/efs# touch dadada.txt
root@369b6256d0ff:/mnt/efs# ls
dadada.txt  lalala.txt
```

nginxのDockerをログアウトし、EC2画面に戻り、EC2でEFS上の内容を確認しておくと、同じように、先ほど作成したファイルがあることを確認できておリます。

```
root@369b6256d0ff:/mnt/efs# exit
exit
$ pwd
/mnt/efs
$ ls
dadada.txt  lalala.txt
```

これでEC2内のDockerをEFSとマウントは実現できました。