#はじめに
EC2内にインストールしてあるDockerを、AWS EFSとマウントすることをやってみました。
手順を公開したいと思います。
・EC2のOS:Ubuntu 20.04.2 LTS
・Dockerバージョン:Docker version 20.10.8, build 3967b7d
#構成図
簡単に説明すると、
1.EC2内にDockerをインストールしておリます。
2.EFSがEC2とマウントしておリます。
3.DockerがEFSとのマウントを実現できております。
#1.EC2内にDockerをインストール
UbuntuにDockerをインストールにあたって、下記の記事が大変参考になりました。
記事に従ってインストール作業をしたら、Dokcerのインストールが無事に完了しました。
$ docker --version
Docker version 20.10.8, build 3967b7d
#2.EC2とEFSをマウント
EFSの作成手順はここで割愛させていただきます。
EC2とEFSのマウント方法は、下記の記事が大変参考になりました。
記事に従って操作すると、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
#3.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とマウントは実現できました。