📌
ブラウザからDockerコンテナを起動する
はじめに
どうしてもブラウザからサーバー上にある別のDockerコンテナを起動しないといけなかったので実装した。
前提
- Dockerを使用して構築している。
- docker-composeコマンドが使用できる。
- nginxをproxy-serverとして使用している。
ファイル構成
├ docker-compose.yml
├ nginx
├ templates
│ └ default.conf.template
├─ Dockerfile
├─ start.sh
└ example.sh
Dockerイメージ作成
- Dockerfile
- start.shをENTRYPOINTやCMDに設定しない理由はdefault.confで環境変数を読み込ませたいから。独自に設定してしまうと読み込めなくなってしまう。
- 権限をつけるのはGitLabのCI/CDを使用してイメージを作成すると最適な権限にしてくれないので、必要な権限を予めつけておく。
- nginxのイメージは1.19以降を使用する。
FROM nginx
# timezone変更
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# 必要なパッケージインストール
RUN apt-get update \
&& apt-get install -y tzdata fcgiwrap spawn-fcgi wget \
&& wget https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz \
&& tar xfz docker-latest.tgz docker/docker \
&& mv docker/docker /usr/local/bin/docker \
&& chmod +x /usr/local/bin/docker \
&& rm -rf docker \
&& rm ./*.tgz
# 権限をつけるのが重要
COPY ./start.sh /docker-entrypoint.d/start.sh
COPY ./example.sh /exampledir/example.sh
- start.sh
/etc/init.d/fcgiwrap start
chmod 777 /var/run/fcgiwrap.socket
chmod 777 /var/run/docker.sock
nginx -g 'daemon off;'
- example.sh
- ブラウザから呼び出すシェルファイル。
- Dockerコンテナを起動するコマンドを記載する。
#!/bin/sh
cecho(){
echo "<pre>"
eval "$1"
echo "</pre>"
}
echo 'Content-type: text/html'
echo ''
echo '<!DOCTYPE html>'
echo '<head><meta charset="UTF-8"><title>Title</title></head>'
echo '<body>'
echo '<h1>Something about process</h1>'
# 用途に合わせてdockerコマンドは変える
cecho "docker run --rm --name CONTAINERNAME ${IMAGE_NAME}"
echo '</body>'
echo '</html>'
- imageを作成する
docker build -t nginx:original ./nginx
default.conf.template
- example.shに環境変数を読み込めるようにしたかったので、docker-compose.yml→default.conf.template→example.shの流れで環境変数を渡す。
- docker-compose.yml→default.conf.templateへ環境変数を読み込ませる機能はnginx:1.19以降から使えるようになったみたい。
-
nginx/templates/default.conf.template
みたいなファイル構成、ファイル名にするのが重要。内部で/etc/nginx/conf.d/
に*.templateファイルを出力してくれる。 - ブラウザから
http://servername/exampledir/example.sh
にアクセスするとexample.shが実行される。
適宜必要な設定を記載する
~~~
location ~ ^/exampledir/.*\.sh$ {
root /;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nignx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# example.shに読み込む環境変数を定義する
fastcgi_param IMAGE_NAME ${IMAGE_NAME};
}
docker-compose.yml
version: '3'
services:
nginx:
image: nginx:original
container_name: nginx-contianer
ports:
- "80:80"
volumes:
- /var/www/html:/var/www/html
- /var/run/docker.sock:/var/run/docker/sock
- ./nginx/templates/default.conf.template:/etc/nginx/templates/default.conf.template
environment:
IMAGE_NAME: other-continer-image:tag
# 起動したいほかのサービスの設定を記載する
最後
- 以下のコマンドを実行してコンテナを立ち上げてから、シェルにアクセスするurlへアクセスすれば任意のコンテナを起動することができる。
docker-compose up -d
Discussion