現象
EC2内で、ドキュメント通りにubuntu内にDocker Engineの立ち上げ。
/home/ubuntu
でhttpdのDockerコンテナをドキュメント通りに起動
$ 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。
ちなみに、さわって学ぶクラウドインフラ docker基礎からのコンテナ構築を読み進めてる中で遭遇しました。
調査
権限の改善
コンテナの出力を見ると、ファイルへのアクセス権限がないらしい
$ 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問題
# 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/
EC2にsshできなくなった問題
え?Permission denied?
$ ssh -i ~/.ssh/docker.pem ubuntu@[EC2のpublic IPv4]
ubuntu@[EC2のpublic IPv4]: Permission denied (publickey).
EC2のコンソールから直接Connectはできる。sshができない。
EC2のドキュメントを見ると、なんと/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