【備忘録】EC2 ubuntu内でDockerのhttpd(Apache)コンテナを起動してアクセスしても、403 Forbiddenとなる問題

# 現象

EC2内で、[ドキュメント](https://docs.docker.com/engine/install/ubuntu/)通りにubuntu内にDocker Engineの立ち上げ。

`/home/ubuntu`でhttpdのDockerコンテナを[ドキュメント](https://hub.docker.com/_/httpd)通りに起動

```
$ docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
```

WEBサーバとして`http://[EC2のpublic IPv4]:8080`にアクセスしたが、403 Forbidden。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/aae64906-c82a-247d-661f-bf75da91a7d4.png)

ちなみに、[さわって学ぶクラウドインフラ　docker基礎からのコンテナ構築](https://www.amazon.co.jp/dp/B089VZXX63)を読み進めてる中で遭遇しました。

# 調査

## 権限の改善

コンテナの出力を見ると、ファイルへのアクセス権限がないらしい

```
$ docker logs --follow my-apache-app
[Thu Jul 28 14:42:38.033124 2022] [core:error] [pid 8:tid 139789340034816] (13)Permission denied: [client ***] AH00035: access to /index.html denied (filesystem path '/usr/local/apache2/htdocs/index.html') because search permissions are missing on a component of the path
[EC2のpublic IPv4] - - [28/Jul/2022:14:42:38 +0000] "GET / HTTP/1.1" 403 199
```

ホストとコンテナ内だと、userがubuntu -> rootになってることが発覚
多分下の問題と同じ。
参考: [dockerでvolumeをマウントしたときのファイルのowner問題
](https://qiita.com/yohm/items/047b2e68d008ebb0f001)

```
# EC2のホストで
$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),118(netdev),119(lxd),999(docker)

# コンテナ内に侵入
$ docker container exec -it my-apache-app bash
$ id
uid=0(root) gid=0(root) groups=0(root)
```

コンテナ内の`/usr/local/apache2/htdocs/`の権限が所有者だけになってるから、rootではアクセスできないのかな。

```
# コンテナ内
$ ls -ld /usr/local/apache2/htdocs/
drwx------ 5 1000 1000 4096 Jul 28 14:30 /usr/local/apache2/htdocs/
```

権限を無理矢理付与したら、アクセスはできた。

```
$ chmod 707 /usr/local/apache2/htdocs/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/0718b198-f4c1-abf2-81ca-4611a599d974.png)

## EC2にsshできなくなった問題

え？Permission denied？

```
$ ssh -i ~/.ssh/docker.pem ubuntu@[EC2のpublic IPv4]
ubuntu@[EC2のpublic IPv4]: Permission denied (publickey).
```

EC2のコンソールから直接Connectはできる。sshができない。

EC2の[ドキュメント](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-fix-permission-denied-errors/)を見ると、なんと`/home`以下のディレクトリの権限がおかしいとsshできないらしい。

> Linux ホームディレクトリ (/home) であれば、(0755/drwxr-xr-x) にする必要があります。
ユーザーのホームディレクトリ (/home/ec2-user/) であれば、(0700/drwx------) にする必要があります。
.ssh ディレクトリのアクセス許可 (/home/ec2-user/.ssh) であれば、(0700/drwx------) にする必要があります。

いや別にそこの権限は変えてないし、って思ってConnectしたEC2内で権限を確認すると、いつの間にか`/home/ubuntu`の権限が変わってる！

```
$ ls -ld /home/ubuntu/
drwx---rwx 5 ubuntu ubuntu 4096 Jul 28 14:30 /home/ubuntu/
```

Dockerのマウントって、ディレクトリの権限変更もホスト側に反映するんだ？！って驚きました。
あと、ホストの`/home/ubuntu/`と、コンテナ内の`/usr/local/apache2/htdocs/`の権限が対応してマウントされるのも驚きポイントでした。
(ここはよくわかってないので、詳しい方いたら参考資料ください笑)

とりあえず権限戻す。

```
$ chmod 700 /home/ubuntu/
$ ls -ld /home/ubuntu/
drwx------ 5 ubuntu ubuntu 4096 Jul 28 14:30 /home/ubuntu/
```

これでsshできることを確認。
ただし、これによってWEBサーバとしては403 Forbiddenになってしまう。


# 解決策

- `/home/ubuntu`の権限はいじっちゃダメ
- しかしWEBサーバとしてアクセスはしたいので、コンテナ内の`/usr/local/apache2/htdocs/`の権限は変えたい
- ていうか権限設定が重要な`/home/ubuntu`自体にマウントさせているのがまずいのでは？
- じゃあ適当なディレクトリ掘って、そことマウントさせれば良いんじゃね？

ってことで以下で解決しました。

```
$ mkdir /home/ubuntu/docker
$ docker run -dit --name my-apache-app -p 8080:80 -v /home/ubuntu/docker:/usr/local/apache2/htdocs/ httpd:2.4
```