AWS（Amazon Linux2023）を利用してdockerでvsftpdを構築

# 目的
AWS環境にFTPサーバ（dockerコンテナにvsftpdを導入）のEC2インスタンスを作成し、実際にFTPコマンドを実行し、ファイルを取得するまで検証してみた内容を残しておきます。
Dockerfileを作成、イメージ化しておく事で何をインストールしているか把握でき、環境を再構築も容易となる。

# 前提条件
- FTPサーバのEC2インスタンスは以下で作成
  - プラットフォーム：Amazon Linux2023（※1）
  - インスタンスタイプ：t2-micro
- FTPクライアントのEC2インスタンスは以下で作成
  - プラットフォーム：RHEL9.0
  - インスタンスタイプ：t2-micro
- FTPクライアント環境の構築は、1つ前に投稿した下記記事を参照ください。
[AWS環境でFTPサーバを構築し、クライアントからFTPコマンドを実行](https://qiita.com/peanuts2013/items/4de20e4d40f723499157)

※1
本当はRHEL上のdockerコンテナを構築し、vsftpdを導入したかった。
ただ、RHEL8以降はdockerを利用するにはPodmanなど事前に色々と準備が必要となり
Dockerfileを作成してvsftpdのインストールを試みたがうまくいかなかった。
（vsftpdのRPMファイルのダウンロード先の指定が分からず・・・）

ただ、今回の目的としては、LinuxOS上でdockerコンテナにvsftpd環境を作ってみたかったので
プラットフォームはAmazon Linux2023を利用する事にした。
（また時間のある時にリベンジしてみたいとは思う）

# 記載範囲
FTPクライアント側からFTPサーバに接続し、FTPコマンド（GET）を実行し、ファイルを取得するところまでを記載します。
（実行コマンド＋ログを記載しているので、コマンド実行後にうまくいったかご参考になればと思います）

試すにあたり、以下サイトを参考にさせて頂きました。
[centosでvsftpdを起動するDockerコンテナをDockerfileで作成しながらDockerの使い方を覚える](https://qiita.com/sukkyxp/items/adea19f9dd676c0ea2c2)
[amazonlinux（公式）](https://hub.docker.com/_/amazonlinux)　※DockerfileのAmazon Linux2023のFROMで指定するバージョン
[Compose ファイルのバージョンとアップグレード](https://docs.docker.jp/compose/compose-file/compose-versioning.html)　※docker-compose.yml作成時のversion指定

# 事前準備（作業ディレクトリ作成）
```bash
# /usr/localには、dockerディレクトリを作成
# /usr/local/dockerには、conteinar01ディレクトリを作成
[ec2-user@ip-xxx-xx-xx-xx docker]$ pwd
/usr/local/docker
[ec2-user@ip-xxx-xx-xx-xx docker]$ ls -la .
total 0
drwxr-xr-x.  3 root root  25 Nov  3 22:29 .
drwxr-xr-x. 13 root root 145 Nov  3 22:29 ..
drwxr-xr-x.  2 root root   6 Nov  3 22:29 container01
```

# Dockerをインストール
```bash
sudo yum install -y docker
```

<details>
<summary>実行ログ</summary>

```bash
[ec2-user@ip-xxx-xx-xx-xx docker]$ sudo yum install -y docker
Last metadata expiration check: 0:16:19 ago on Fri Nov  3 22:23:30 2023.
Dependencies resolved.
===============================================================================================================================
 Package                              Architecture         Version                             Repository                 Size
===============================================================================================================================
Installing:
 docker                               x86_64               24.0.5-1.amzn2023.0.2               amazonlinux                42 M
Installing dependencies:
 containerd                           x86_64               1.7.2-1.amzn2023.0.4                amazonlinux                34 M
 iptables-libs                        x86_64               1.8.8-3.amzn2023.0.2                amazonlinux               401 k
 iptables-nft                         x86_64               1.8.8-3.amzn2023.0.2                amazonlinux               183 k
 libcgroup                            x86_64               3.0-1.amzn2023.0.1                  amazonlinux                75 k
 libnetfilter_conntrack               x86_64               1.0.8-2.amzn2023.0.2                amazonlinux                58 k
 libnfnetlink                         x86_64               1.0.1-19.amzn2023.0.2               amazonlinux                30 k
 libnftnl                             x86_64               1.2.2-2.amzn2023.0.2                amazonlinux                84 k
 pigz                                 x86_64               2.5-1.amzn2023.0.3                  amazonlinux                83 k
 runc                                 x86_64               1.1.7-1.amzn2023.0.3                amazonlinux               3.0 M

Transaction Summary
===============================================================================================================================
Install  10 Packages

Total download size: 80 M
Installed size: 306 M
Downloading Packages:
(1/10): libnftnl-1.2.2-2.amzn2023.0.2.x86_64.rpm                                               664 kB/s |  84 kB     00:00
(2/10): pigz-2.5-1.amzn2023.0.3.x86_64.rpm                                                     1.3 MB/s |  83 kB     00:00
(3/10): libnfnetlink-1.0.1-19.amzn2023.0.2.x86_64.rpm                                          1.4 MB/s |  30 kB     00:00
(4/10): iptables-libs-1.8.8-3.amzn2023.0.2.x86_64.rpm                                          1.8 MB/s | 401 kB     00:00
(5/10): runc-1.1.7-1.amzn2023.0.3.x86_64.rpm                                                    12 MB/s | 3.0 MB     00:00
(6/10): libcgroup-3.0-1.amzn2023.0.1.x86_64.rpm                                                1.5 MB/s |  75 kB     00:00
(7/10): libnetfilter_conntrack-1.0.8-2.amzn2023.0.2.x86_64.rpm                                 1.1 MB/s |  58 kB     00:00
(8/10): iptables-nft-1.8.8-3.amzn2023.0.2.x86_64.rpm                                           2.3 MB/s | 183 kB     00:00
(9/10): containerd-1.7.2-1.amzn2023.0.4.x86_64.rpm                                              45 MB/s |  34 MB     00:00
(10/10): docker-24.0.5-1.amzn2023.0.2.x86_64.rpm                                                37 MB/s |  42 MB     00:01
-------------------------------------------------------------------------------------------------------------------------------
Total                                                                                           55 MB/s |  80 MB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                       1/1
  Installing       : runc-1.1.7-1.amzn2023.0.3.x86_64                                                                     1/10
  Installing       : containerd-1.7.2-1.amzn2023.0.4.x86_64                                                               2/10
  Running scriptlet: containerd-1.7.2-1.amzn2023.0.4.x86_64                                                               2/10
  Installing       : libcgroup-3.0-1.amzn2023.0.1.x86_64                                                                  3/10
  Installing       : libnfnetlink-1.0.1-19.amzn2023.0.2.x86_64                                                            4/10
  Installing       : libnetfilter_conntrack-1.0.8-2.amzn2023.0.2.x86_64                                                   5/10
  Installing       : iptables-libs-1.8.8-3.amzn2023.0.2.x86_64                                                            6/10
  Installing       : pigz-2.5-1.amzn2023.0.3.x86_64                                                                       7/10
  Installing       : libnftnl-1.2.2-2.amzn2023.0.2.x86_64                                                                 8/10
  Installing       : iptables-nft-1.8.8-3.amzn2023.0.2.x86_64                                                             9/10
  Running scriptlet: iptables-nft-1.8.8-3.amzn2023.0.2.x86_64                                                             9/10
  Running scriptlet: docker-24.0.5-1.amzn2023.0.2.x86_64                                                                 10/10
  Installing       : docker-24.0.5-1.amzn2023.0.2.x86_64                                                                 10/10
  Running scriptlet: docker-24.0.5-1.amzn2023.0.2.x86_64                                                                 10/10
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /usr/lib/systemd/system/docker.socket.

  Verifying        : libnftnl-1.2.2-2.amzn2023.0.2.x86_64                                                                 1/10
  Verifying        : iptables-libs-1.8.8-3.amzn2023.0.2.x86_64                                                            2/10
  Verifying        : runc-1.1.7-1.amzn2023.0.3.x86_64                                                                     3/10
  Verifying        : pigz-2.5-1.amzn2023.0.3.x86_64                                                                       4/10
  Verifying        : libnfnetlink-1.0.1-19.amzn2023.0.2.x86_64                                                            5/10
  Verifying        : libcgroup-3.0-1.amzn2023.0.1.x86_64                                                                  6/10
  Verifying        : docker-24.0.5-1.amzn2023.0.2.x86_64                                                                  7/10
  Verifying        : containerd-1.7.2-1.amzn2023.0.4.x86_64                                                               8/10
  Verifying        : libnetfilter_conntrack-1.0.8-2.amzn2023.0.2.x86_64                                                   9/10
  Verifying        : iptables-nft-1.8.8-3.amzn2023.0.2.x86_64                                                            10/10

Installed:
  containerd-1.7.2-1.amzn2023.0.4.x86_64                    docker-24.0.5-1.amzn2023.0.2.x86_64
  iptables-libs-1.8.8-3.amzn2023.0.2.x86_64                 iptables-nft-1.8.8-3.amzn2023.0.2.x86_64
  libcgroup-3.0-1.amzn2023.0.1.x86_64                       libnetfilter_conntrack-1.0.8-2.amzn2023.0.2.x86_64
  libnfnetlink-1.0.1-19.amzn2023.0.2.x86_64                 libnftnl-1.2.2-2.amzn2023.0.2.x86_64
  pigz-2.5-1.amzn2023.0.3.x86_64                            runc-1.1.7-1.amzn2023.0.3.x86_64

Complete!
```
</details>

# Dockerサービスを起動（★部分が実行コマンド）
```bash
[ec2-user@ip-xxx-xx-xx-xx docker]$ sudo service docker start　★
Redirecting to /bin/systemctl start docker.service
[ec2-user@ip-xxx-xx-xx-xx docker]$ docker --version　★
Docker version 24.0.5, build ced0996
```

# 「ec2-user」でsudoなしでdockerコマンドを実行できるように設定
```bash
#su切り替え
sudo su
#Dockerグループにec2-userを紐づける
sudo gpasswd -a ec2-user docker
#docker infoコマンドがsudoなしで実行できる
docker info
```

<details>
<summary>実行ログ（★部分が実行コマンド）</summary>

```bash
[ec2-user@ip-xxx-xx-xx-xx docker]$ sudo su　★
[root@ip-xxx-xx-xx-xx docker]# grep -i docker /etc/group　★変更前の確認
docker:x:992:
[root@ip-xxx-xx-xx-xx docker]# sudo gpasswd -a ec2-user docker　★
Adding user ec2-user to group docker
[root@ip-xxx-xx-xx-xx docker]# grep -i docker /etc/group　★変更後の確認
docker:x:992:ec2-user
[ec2-user@ip-xxx-xx-xx-xx docker]$ docker info　★
Client:
 Version:    24.0.5
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.0.0+unknown
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx

Server:
ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/info": dial unix /var/run/docker.sock: connect: permission denied
errors pretty printing info　★本エラーは今回の目的では気にせず先に進む
```
</details>

# Dockerサービスが自動起動されるように設定
```bash
sudo systemctl enable docker
systemctl is-enabled docker
```

<details>
<summary>実行ログ（★部分が実行コマンド）</summary>

```bash
[ec2-user@ip-xxx-xx-xx-xx docker]$ sudo systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[ec2-user@ip-xxx-xx-xx-xx docker]$ systemctl is-enabled docker
enabled
```
</details>

# docker-composeをインストール
```bash
#docker-composeのバイナリファイルを格納するディレクトリは作成しておく
#/usr/local/lib/docker/cli-plugins/docker-compose
sudo curl   -L https://github.com/docker/compose/releases/download/v${VER}/docker-compose-$(uname -s)-$(uname -m)   -o /usr/local/lib/docker/cli-plugins/docker-compose
#ダウンロードしたdocker-compose（バイナリファイル）に実行権限を付与
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
#/usr/bin/に/usr/local/lib/docker/cli-plugins/docker-composeへのシンボリックリンクを設定
sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
#docker-composeのバージョンを確認
docker-compose --version
```

<details>
<summary>実行ログ（★部分が実行コマンド）</summary>

```bash
[ec2-user@ip-xxx-xx-xx-xx docker]$ sudo curl   -L https://github.com/docker/compose/releases/download/v${VER}/docker-compose-$(uname -s)-$(uname -m)   -o /usr/local/lib/docker/cli-plugins/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 56.8M  100 56.8M    0     0  63.0M      0 --:--:-- --:--:-- --:--:--  139M
[ec2-user@ip-xxx-xx-xx-xx docker]$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
#/usr/bin/に/usr/local/lib/docker/cli-plugins/docker-composeへのシンボリックリンクを設定
[ec2-user@ip-xxx-xx-xx-xx docker]$ sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
```
</details>

# 「myapp.sh」を準備
vsftpdはデーモン起動するため、vsftpdの起動処理が終了するとDockerコンテナも終了してしまうため、「tail -f /dev/null」を利用してDockerコンテナが終了しないようにする。

・myapp.sh
```bash
#!/usr/bin/bash
#vsftpdを起動
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
#デーモン起動のDockerコンテナを終了させない
tail -f /dev/null
```

# Dockerfileを作成
- 「Amazon Linux2023」のイメージを利用
- FTPサーバは「vsftpd」をインストール
- 作業ディレクトリは「/usr/local/docker」
- ポート番号は「21」、「60000-60100」を指定
- 「vsftpd」起動向けに上記で準備した「myapp.sh」を指定して実行

<details>
<summary>Dockerfileの内容</summary>

```bash
#書式：　FROM [イメージ] [タグ]
FROM amazonlinux:2023.2.20231026.0
#書式：　RUN [コマンド] 
RUN yum install -y vsftpd
#書式：　WORKDIR [ディレクトリのパス] 
WORKDIR /usr/local/docker
#書式：　EXPOSE <port> [<port>...]
EXPOSE 21
EXPOSE 60000-60100
#FTPテスト用のテキスト
RUN echo "Hello Amazon Linux2023 vsftpd." > /var/ftp/pub/test.txt
#書式：　COPY [コピー元][コピー先] 
COPY vsftpd.conf /etc/vsftpd/
COPY myapp.sh /usr/local/bin/
#myapp.shの権限変更
RUN chmod 755 /usr/local/bin/myapp.sh
#書式：　ENTRYPOINT ["実行可能なもの", "パラメータ１", "パラメータ２"]
ENTRYPOINT ["/usr/local/bin/myapp.sh"]
```
</details>

# Dockerfileをビルドし、イメージ化

```bash
#カレントディレクトリは「/usr/local/docker」、その直下に「Dockerfile」を配置
#タグ名は「al2023/vsftpd」　※後述するdocker-compose.ymlで指定する名称
sudo docker build -t al2023/vsftpd .
```

<details>
<summary>実行ログ（★部分が実行コマンド）</summary>

```bash
[+] Building 21.9s (11/11) FINISHED                                                                             docker:default
 => [internal] load build definition from Dockerfile                                                                      0.0s
 => => transferring dockerfile: 385B                                                                                      0.0s
 => [internal] load .dockerignore                                                                                         0.0s
 => => transferring context: 2B                                                                                           0.0s
 => [internal] load metadata for docker.io/library/amazonlinux:2023.2.20231026.0                                          2.1s
 => [1/6] FROM docker.io/library/amazonlinux:2023.2.20231026.0@sha256:6d13678b68a6db66e13f1c738a721e5df41e9911a89c470825  5.2s
 => => resolve docker.io/library/amazonlinux:2023.2.20231026.0@sha256:6d13678b68a6db66e13f1c738a721e5df41e9911a89c470825  0.9s
 => => sha256:6d13678b68a6db66e13f1c738a721e5df41e9911a89c47082584cc76599b1ce8 547B / 547B                                0.0s
 => => sha256:e1066a340e771620fdc12b9b65e19f49b732438cc9e3e5d4c72f3242ecacc24c 529B / 529B                                0.0s
 => => sha256:5480a906305fcfcc0b956402f447cf29b9cd2cebd02290a09b05cdb9354c23ed 1.48kB / 1.48kB                            0.0s
 => => sha256:a98bc98bb91a9e3ba206b37674c857456e1df8dd9fed29335a0441ffe4ba5869 52.40MB / 52.40MB                          0.6s
 => => extracting sha256:a98bc98bb91a9e3ba206b37674c857456e1df8dd9fed29335a0441ffe4ba5869                                 3.4s
 => [internal] load build context                                                                                         0.0s
 => => transferring context: 12.27kB                                                                                      0.0s
 => [2/6] RUN yum install -y vsftpd                                                                                      12.8s
 => [3/6] RUN echo "Hello Amazon Linux2023 vsftpd." > /var/ftp/pub/test.txt                                               0.3s
 => [4/6] COPY vsftpd.conf /etc/vsftpd/                                                                                   0.0s
 => [5/6] COPY myapp.sh /usr/local/bin/                                                                                   0.1s
 => [6/6] RUN chmod 755 /usr/local/bin/myapp.sh                                                                           0.3s
 => exporting to image                                                                                                    1.0s
 => => exporting layers                                                                                                   0.9s
 => => writing image sha256:3bec3024d1bdadf01f4098c162c56ab6b3403bbbb7a0ddf8caa416825424c557                              0.0s
 => => naming to docker.io/al2023/vsftpd
```
</details>

# 作成したイメージ「al2023/vsftpd」の内容を確認

```bash
#タブ名はDockerfileのビルド時に指定した名称
[ec2-user@ip-xxx-xx-xx-xx docker]$ docker inspect al2023/vsftpd
```

<details>
<summary>実行ログ（★部分が実行コマンド）</summary>

```bash
[ec2-user@ip-xxx-xx-xx-xx docker]$ docker inspect al2023/vsftpd
[
    {
        "Id": "sha256:3bec3024d1bdadf01f4098c162c56ab6b3403bbbb7a0ddf8caa416825424c557",
        "RepoTags": [
            "al2023/vsftpd:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2023-11-04T01:11:16.071521807Z",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "21/tcp": {},
                "60000/tcp": {},
                "60001/tcp": {},
                "60002/tcp": {},
                "60003/tcp": {},
                "60004/tcp": {},
                "60005/tcp": {},
                "60006/tcp": {},
                "60007/tcp": {},
                "60008/tcp": {},
                "60009/tcp": {},
                "60010/tcp": {},
                "60011/tcp": {},
                "60012/tcp": {},
                "60013/tcp": {},
                "60014/tcp": {},
                "60015/tcp": {},
                "60016/tcp": {},
                "60017/tcp": {},
                "60018/tcp": {},
                "60019/tcp": {},
                "60020/tcp": {},
                "60021/tcp": {},
                "60022/tcp": {},
                "60023/tcp": {},
                "60024/tcp": {},
                "60025/tcp": {},
                "60026/tcp": {},
                "60027/tcp": {},
                "60028/tcp": {},
                "60029/tcp": {},
                "60030/tcp": {},
                "60031/tcp": {},
                "60032/tcp": {},
                "60033/tcp": {},
                "60034/tcp": {},
                "60035/tcp": {},
                "60036/tcp": {},
                "60037/tcp": {},
                "60038/tcp": {},
                "60039/tcp": {},
                "60040/tcp": {},
                "60041/tcp": {},
                "60042/tcp": {},
                "60043/tcp": {},
                "60044/tcp": {},
                "60045/tcp": {},
                "60046/tcp": {},
                "60047/tcp": {},
                "60048/tcp": {},
                "60049/tcp": {},
                "60050/tcp": {},
                "60051/tcp": {},
                "60052/tcp": {},
                "60053/tcp": {},
                "60054/tcp": {},
                "60055/tcp": {},
                "60056/tcp": {},
                "60057/tcp": {},
                "60058/tcp": {},
                "60059/tcp": {},
                "60060/tcp": {},
                "60061/tcp": {},
                "60062/tcp": {},
                "60063/tcp": {},
                "60064/tcp": {},
                "60065/tcp": {},
                "60066/tcp": {},
                "60067/tcp": {},
                "60068/tcp": {},
                "60069/tcp": {},
                "60070/tcp": {},
                "60071/tcp": {},
                "60072/tcp": {},
                "60073/tcp": {},
                "60074/tcp": {},
                "60075/tcp": {},
                "60076/tcp": {},
                "60077/tcp": {},
                "60078/tcp": {},
                "60079/tcp": {},
                "60080/tcp": {},
                "60081/tcp": {},
                "60082/tcp": {},
                "60083/tcp": {},
                "60084/tcp": {},
                "60085/tcp": {},
                "60086/tcp": {},
                "60087/tcp": {},
                "60088/tcp": {},
                "60089/tcp": {},
                "60090/tcp": {},
                "60091/tcp": {},
                "60092/tcp": {},
                "60093/tcp": {},
                "60094/tcp": {},
                "60095/tcp": {},
                "60096/tcp": {},
                "60097/tcp": {},
                "60098/tcp": {},
                "60099/tcp": {},
                "60100/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/usr/local/bin/myapp.sh"
            ],
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 251598116,
        "VirtualSize": 251598116,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/eswk8dr035tjndxu403dt0sq3/diff:/var/lib/docker/overlay2/s2g2bsphvcr1n3vxl3bo5rtz0/diff:/var/lib/docker/overlay2/q1cca91kj9ktkx4zeha2exlan/diff:/var/lib/docker/overlay2/uoy5wlul5wckt4ve0ri05y1am/diff:/var/lib/docker/overlay2/95670f3fb328cac58f738837cbda8f42ac6cc24f88f81afa54c9dc0056dcb432/diff",
                "MergedDir": "/var/lib/docker/overlay2/ood8wx8geq0onadvf4az5x89p/merged",
                "UpperDir": "/var/lib/docker/overlay2/ood8wx8geq0onadvf4az5x89p/diff",
                "WorkDir": "/var/lib/docker/overlay2/ood8wx8geq0onadvf4az5x89p/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:405c9a3fe367001cbf2b464d42eceaaef6cc83b044174752da8492ad551d2334",
                "sha256:f6260b6f70e7c90ad088d8d02090b7f33de98dd45729ad6e2ea51bd410d78d39",
                "sha256:63f404887ab65dee14d90f6a7165621c5166318ca1df25e361c7d1cb966343c6",
                "sha256:ed066320f2957fd10ff961f56108ab9b828b584e92fb331e70ed0cd34f194677",
                "sha256:0646670f3b2e67fce767aba32303bd582a0086ccef60de2fbcbf33dc8600072e",
                "sha256:c51fd6bae3dce587a51122573114c1d3267fcb95d26ac7367fbf5cbda577c6c7"
            ]
        },
        "Metadata": {
            "LastTagTime": "2023-11-04T01:11:17.038371583Z"
        }
    }
]
```
</details>

# Docokerコンテナを起動
```bash
docker-compose up -d
```

<details>
<summary>実行ログ（★部分が実行コマンド）</summary>

```bash
#docker-compose.ymlがあるディレクトリに移動
#「usr/local/docker/container01」ディレクトリに「docker-compose.yml」が配置されている事を確認
[ec2-user@ip-xxx-xx-xx-xx docker]$ cd container01/
[ec2-user@ip-xxx-xx-xx-xx container01]$ ls -la
total 4
drwxr-xr-x. 2 root root  32 Nov  4 01:10 .
drwxr-xr-x. 3 root root  78 Nov  4 00:53 ..
-rw-r--r--. 1 root root 139 Nov  4 01:10 docker-compose.yml
#Docokerコンテナを起動
[ec2-user@ip-xxx-xx-xx-xx container01]$ docker-compose up -d
[+] Building 0.0s (0/0)                                                                                                             docker:default
[+] Running 2/1
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s[+] Running 2/2
 ? Network container01_default  Created                                                                                                       0.1s
 ? Container container01-ftp-1  Started
```
</details>

# Dockerプロセスの確認
```bash
[ec2-user@ip-xxx-xx-xx-xx container01]$ docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS                                                                                                      NAMES
045bf39f84bc   al2023/vsftpd   "/usr/local/bin/myap…"   2 minutes ago   Up 2 minutes   0.0.0.0:21->21/tcp, :::21->21/tcp, 0.0.0.0:60000-60100->60000-60100/tcp, :::60000-60100->60000-60100/tcp   container01-ftp-1
```

# ユーザ「ftp-user」を新規作成
```bash
#「ftp-user」を追加
[ec2-user@ip-xxx-xx-xx-xx container01]$ sudo adduser --home /home/ftp-user ftp-user　★
#「ftp-user」のパスワードを設定
[ec2-user@ip-xxx-xx-xx-xx container01]$ sudo passwd ftp-user　★
Changing password for user ftp-user.
New password:                                                 ★パスワードを入力
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
```

# 「/etc/vsftpd/user_list」に作成したユーザ「ftp-user」を追加
```bash
[ec2-user@ip-xxx-xx-xx-xx container01]$ cat /etc/vsftpd/user_list　★
ftp-user
# 「/home/ftp-user」ディレクトリの権限を確認
[ec2-user@ip-xxx-xx-xx-xx container01]$ ls -la /home/　★
total 0
drwxr-xr-x.  4 root     root      38 Nov  4 05:35 .
dr-xr-xr-x. 18 root     root     237 Nov  1 22:43 ..
drwx------.  5 ec2-user ec2-user 140 Nov  4 05:28 ec2-user
drwx------.  2 ftp-user ftp-user  62 Nov  4 05:35 ftp-user
```

# Dockerfileのビルド結果を確認
```bash
#コンテナ名：ftp（docker-compose.ymlに記述）を指定し、bashでコンテナ内に入る
docker-compose exec ftp bash　★
#Dockerfileで記述したCOPYコマンドでファイルがコピーされているか確認（例：myapp.sh）
ls -la /usr/local/bin/　★
```
<details>
<summary>実行ログ（★部分が実行コマンド）</summary>

```bash
[ec2-user@ip-xxx-xx-xx-xx container01]$ docker-compose exec ftp bash　★
bash-5.2# pwd
/usr/local/docker
bash-5.2# ls -la /usr/local/bin/　★
total 4
drwxr-xr-x. 1 root root 22 Nov  5 06:38 .
drwxr-xr-x. 1 root root 17 Nov  5 06:38 ..
-rwxr-xr-x. 1 root root 75 Nov  4 00:22 myapp.sh
```
</details>

# TeraTerm5からFTP接続とパッシブモードでのデータ通信の確認
```bash
ftp>open [FTPサーバのElasticIP]
Name ([FTPサーバのElasticIP]): ftp-user
Password:
```

<details>
<summary>実行ログ（★部分が実行コマンド）</summary>

```bash
#「xx.xxx.xxx.xxx」部分はFTPサーバのElasticIP
ftp> open xx.xxx.xxx.xxx
Connected to xx.xxx.xxx.xxx (xx.xxx.xxx.xxx).
220 Welcome to blah FTP service.
Name (xx.xxx.xxx.xxx:ec2-user): ftp-user　★「ftp-user」を入力
331 Please specify the password.
Password:　　　　　　　　　　　　　　　　★パスワードを入力
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/ftp-user" is the current directory
```
</details>

# クライアント側で取得するディレクトリにファイルは存在しない事を確認
```bash
#FTP client
#「/usr/local/ftp_sample」には、ファイルは存在しない事を確認
[ec2-user@ip-xxx-xx-xx-xxx ftp_sample]$ pwd
/usr/local/ftp_sample
[ec2-user@ip-xxx-xx-xx-xxx ftp_sample]$ ls -l
total 0
```

# FTPサーバ上に配置されているファイルを確認（get対象）
```bash
#FTP server
#「/usr/local/ftp_sample/ftp_server_sample.txt」を確認
[ec2-user@ip-xxx-xx-xx-xxx ~]$ cd /usr/local/ftp_sample/
[ec2-user@ip-xxx-xx-xx-xxx ftp_sample]$ ls -l
total 4
-rwxrwxrwx. 1 ftp-user ftp-user 33 Oct 21 13:52 ftp_server_sample.txt　★getするファイル
```

# クライアント側でFTPサーバに接続し、getコマンドにてファイルを取得
```bash
#FTP client
[ec2-user@ip-xxx-xx-xx-xxx ftp_sample]$ ftp

#FTP client -> FTP serverに接続
ftp> open xx.xxx.xxx.xxx　　　　　　　　　　　　　　　　　★ftpでFTP serverに接続
Connected to xx.xxx.xxx.xxx (xx.xxx.xxx.xxx).
220 Welcome to blah FTP service.
Name (xx.xxx.xxx.xxx:ec2-user): ftp-user　　　　　　　　　★ftpに接続するユーザを入力
331 Please specify the password.
Password:　　　　　　　　　　　　　　　　　　　　　　　　★ftpに接続するパスワードを入力
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /usr/local/ftp_sample/　　　　　　　　　　　　　　★ディレクトリを「usr/local/ftp_sample」に移動（FTPサーバ上）
250 Directory successfully changed.
ftp> ls　　　　　　　　　　　　　　　　　　　　　　　　　★「usr/local/ftp_sample」ディレクトリ配下を確認（FTPサーバ上）
227 Entering Passive Mode (xx,xxx,xxx,xxx,234,103).
150 Here comes the directory listing.
-rwxrwxrwx    1 1001     1001           33 Oct 21 13:52 ftp_server_sample.txt　★「ftp_server_sample.txt」が存在している事を確認（FTPサーバ上）
226 Directory send OK.
ftp> get ftp_server_sample.txt　　　　　　　　　　　　　　★getコマンドで「ftp_server_sample.txt」を取得
local: ftp_server_sample.txt remote: ftp_server_sample.txt
227 Entering Passive Mode (xx,xxx,xxx,xxx,234,104).
150 Opening BINARY mode data connection for ftp_server_sample.txt (33 bytes).
226 Transfer complete.
33 bytes received in 4e-05 secs (825.00 Kbytes/sec)
```

# クライアントにて、取得したファイルが「/usr/local/ftp_sample」に存在するか確認
```bash
#FTP client
#「xxx-xx-xx-xxx」部分はFTP client側のIPアドレス
[ec2-user@ip-xxx-xx-xx-xxx ftp_sample]$ pwd
/usr/local/ftp_sample
[ec2-user@ip-xxx-xx-xx-xxx ftp_sample]$ ll
total 4
-rw-r--r--. 1 ec2-user ec2-user 33 Oct 23 11:51 ftp_server_sample.txt　★「ftp_server_sample.txt」が存在
```

</details>