はじめに
備忘録
タイトルの通りです。
どなたかのお役に立てれば幸いです。
ディレクトリ/ファイル構造
以下のような構造であるとします。
sample/
├─ web/
│ ├─ src/
│ │ └─test.php
│ └─ Dockerfile
│
├─ python/
│ ├─ src/
│ │ └─test.py
│ └─ Dockerfile
│
└─ docker-compose.yml
python/test.py
今回は以下のようなプログラムとします。
python/test.py
list = [
'Apple',
'Banana',
'Orange',
'Kiwi',
'Strawberry',
'Mango'
]
for data in list:
print(data)
web/
について
exec
関数を使って、$command
で指定したコマンドを実行するtest.php
を作ります。
test.php
<?php
$command = "docker exec -it sample-python3-1 python3 test.py";
exec($command, $response);
foreach ($response as $data) {
echo $data . "\n";
};
今回は、DooD
という仕組みを使って、Dockerコンテナの中でdocker
コマンドが使えるようにします。
この仕組みを使うためには、/var/run/docker.sock
のマウントに加え、Dockerをコンテナ内でインストールする必要があります。
まず、/var/run/docker.sock
をマウントします。
docker-compose.yml
のphp
サービスのところに、以下を追加します。
docker-compose.yml
php:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
つぎに、Docker
をインストールします。(ついでにDocker Compose
もインストールします。)
web/Dockerfile
に以下を追加します。
web/Dockerfile
RUN apt update
RUN apt install -y docker.io docker-compose
以下を実行することで、docker
コマンドが使える状態のコンテナを立ち上げられます。
$ docker compose up -d --build
以上でDooD
の準備が整いました。
次に、Dockerコンテナの中に入り、PHPファイルを実行します。
# Dockerコンテナ一覧を表示
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86023c6740d6 sample-web "docker-web-entrypoi…" 15 minutes ago Up 15 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp sample-web-1
91e6cb4dcf2c sample-python3 "python3" 15 minutes ago Up 15 minutes sample-python3-1
# コンテナに入る(コンテナ名には`docker ps`で確認したコンテナの名前)
$ docker container exec -it コンテナ名 bash
# 上記の場合
$ docker container exec -it sample-web-1 bash
root@0ac512c09b48:/var/www/html# # ← こんな感じに表示されればOK
# phpファイルを実行する
root@0ac512c09b48:/var/www/html# ls
test.php
root@0ac512c09b48:/var/www/html# php test.php
Apple
Banana
Orange
Kiwi
Strawberry
Mango