AVideo(YouPHPTube)をdockerを使用してインストールすることにしたのですがはまりました。本日はDockerのエラーに悩まされながら苦労した記録を残します。おかげでDockerが少しは理解できました。やはり実践してみることが重要です。
検索していたらgithubのページを見つけました。AVideoをDockerを使用して実現できるということなのでこの構文らしきものをコピペして始めることにしたのですが、そもそもこのやり方があまり良い方法ではなかった。
それでは作業をしていきましょう。ubuntu20.04Desktopにインストールするのでテキストエディタを開きこのGitHubの内容をコピペしてdocker-compose.ymlという名前で保存します。保存場所はログインしているユーザーのホームに適当なディレクトリ(avideo)を作成してそこに保存しました。変更するところは理解できていないのでen_USをja_JPに修正しただけです。
端末を起動してユーザーをrootに切り替えて作業します。先ほど保存したファイルがある場所に移動します。
sudo su -
cd /home/ユーザー名/avideo
Dockerを使用してインストールする前にDockerのネットワークを確認しておきます。
docker network ls
root@mamushipc:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
9d1127a33cd2 bridge bridge local
beb12a7e753c host host local
f9372a260a42 none null local
次のコマンドを実行するとコンテナはバックグラウンドで起動し、そのまま実行し続けるらしい。
docker-compose up -d
順調に進んでいると思ったら、最後にエラーが発生しました。Dockerfileがないと駄目らしい。
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount469008105/Dockerfile: no such file or directory
コマンドにミスがあると思いGitHubのページを見ていたら、次のコマンドがあったので実行したがエラーが発生しました。
docker build -t avideo .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/mamushi/avideo/Dockerfile: no such file or directory
ここでもDockerfileが無いと駄目らしい。この時点で全く理解せず実践している。空のDockerfileを作成して実行しましたが中身が無いのでエラーが発生しました。さすがに駄目でした。
touch Dockerfile
docker build -t avideo .
root@mamushipc:/home/mamushi/avideo# touch Dockerfile
root@mamushipc:/home/mamushi/avideo# ls
Dockerfile docker-compose.yml
root@mamushipc:/home/mamushi/avideo# docker build -t avideo .
Sending build context to Docker daemon 4.096kB
Error response from daemon: the Dockerfile (Dockerfile) cannot be empty
先ほどは最後の最後でエラーが出たが、それまでの過程で何かしらダウンロードしていたので確認してみるとデータベースとphpmyadminのイメージが存在していました。
docker image ls
root@mamushipc:/home/mamushi/avideo# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb latest 100166b773f8 3 days ago 414MB
phpmyadmin/phpmyadmin latest 5682e7556577 8 weeks ago 524MB
Dockerfileについて検索していると同じ人のページがあり、中身があるDockerfileを見つけました。テキストエディタを開き同様にしてコピペして保存しました。保存場所はdocker-compose.ymlと同じ場所です。
docker build -t avideo .
再度、コマンドを試みるがまたも最後にエラーが発生しました。
COPY failed: file not found in build context or excluded by .dockerignore: stat install: file does not exist
どうやらこんなに単純な方法では無理らしい。リポジトリのクローンを作成しなければならないようです。だいたいわかってきたのでインストールするマシンをAWSのフリープランで作成したインスタンスにすることにしました。もうすぐ期限切れになるので今のうちに使い倒しておく。
その前に、余分なイメージを削除します。エラーばかりでコンテナは起動しているはずが無いので削除はしなくていいはずです。またボリュームという概念があり、これも削除したが空いたスペースは0Bだった。
docker rmi [IMAGE ID]
docker volume prune
これから多用しそうなコマンドをメモしておきます。イメージを一括削除するコマンドです。
docker rmi $(docker images -q) ;
ここからはAWSに作成したインスタンスでの作業となります。OSはUbuntu20.04です。AVideoはWordPressと同様にPHPやデータベースを必要とします。データベースだけをAWSにあるRDSを使用したかったのですがやり方がわからないので諦めることにした。お世辞にもフリープランで高スペックとはいえないので、できれば切り離したかった。
まずはリポジトリのクローンを作成します。これを実行すると、実行したディレクトリの下の階層にディレクトリが作成され、その中にファイルがあります。
git clone https://github.com/WWBN/AVideo.git
cd AVideo
docker buildコマンドは、 Dockerfileと「 コンテクスト ( context ) 」からDockerイメージを構築するコマンドです。
docker build -t avideo .
イメージの作成なので起動したコンテナやコンテナ一覧を見ても何もないはずです。
docker ps
docker ps -a
イメージを確認するとavideoとubuntu/apache2の、2つがありました。
どちらから起動するか不明ですがavideoのイメージからコンテナを作成することにました。
docker runを実行するとコンテナの作成と同時に、起動もするとのことです。
オプション
「-it」ホストとコンテナの標準入出力を繋げる
「-d」バックグラウンドで実行
「-p」ホストマシンのポート:コンテナのポートでポートフォワード(ポートフォワーディング)
「–name」コンテナに名前をつける
ポート番号は何を指定するか不明でしたが、コンテナで80を使用し、ホストで8080を使用することにしました。avideotestという名前でコンテナを作成します。
docker run -it -d -p 8080:80 --name avideotest avideo:latest
早速確認すると、コンテナは作成されているが起動はしていない状態です。このコマンドは起動もするということなのですがその通りにはなりません。仕方が無いので強引に起動してみる。
docker start avideotest
しかし、起動ができません。ログを確認してみる。
docker logs avideotest
standard_init_linux.go:228: exec user process caused: no such file or directory
このエラーを解析して解決するのは困難と考え、一度コンテナを削除することにしました。
docker system prune
webサーバーが起動していないと駄目なのかと考え、apacheのコンテナを作成することにしました。
docker run -it -d --name apache ubuntu/apache2:2.4-20.04_edge
今度はコンテナを起動することに成功したので、ブラウザで確認してみます。
http://awsの外部IPアドレス
しかし、接続できません。実行しているコンテナに入るコマンドを入力してみることにしました。
docker exec -it [CONTAINER ID] bash
curl http://localhost/
exit
curlが無かったがコンテナ内に入ることは確認できました。このコンテナのIPアドレスを確認するコマンドを入力してみます。
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [CONTAINER ID]
するとプライベートIPアドレスが表示されたのでcurlコマンドを入力してWebサーバーにアクセスできるか試してみます。
curl http://172.17.0.2
apacheのデフォルトページのソースらしきものが表示されたので正常に実行はされているようです。
これでは外部からアクセスできないので、先ほどと同様にしてコンテナを停止して削除します。今度はコンテナとホストにポート番号を割り振りポート転送をするコマンドを入力してみます。
docker stop apache
docker system prune
docker run -it -d -p 8080:80 --name apache ubuntu/apache2:2.4-20.04_edge
docker ps
root@ip-172-31-7-75:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
avideo latest 5770803d0ca1 2 hours ago 2.02GB
ubuntu/apache2 2.4-20.04_edge 4997bebcae88 8 days ago 178MB
root@ip-172-31-7-75:~# docker run -it -d -p 8080:80 –name apache ubuntu/apache2:2.4-20.04_edge
e568c83bc3584b8e9cc8642b00cfa1a8634838fc3d0469b8fbe6f3c108bc3d3f
root@ip-172-31-7-75:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e568c83bc358 ubuntu/apache2:2.4-20.04_edge “apache2-foreground” 21 seconds ago Up 19 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp apache
OS自体のファイヤーウォールは無効になっているが、AWSではインバウンドルールに追加する必要があります。ブラウザでアクセスするとapacheのデフォルトページを表示することができました。
あとはAVideoのコンテナを起動できない問題が残っています。そういえばdocker-compose.ymlがあったのでDocker Composeのコマンドを試すことができます。
docker-compose up --build -d
実行中のコンテナを確認するコマンドを入力するとAVideoのコンテナはあるが、状態がRestartingとなっています。ポート番号もありません。マシンスペックが低いので起動できないのか、他に間違っているところがあるのかどうかは不明です。