📌

ブラウザからDockerコンテナを起動する

2022/07/18に公開

はじめに

どうしてもブラウザからサーバー上にある別の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 --chmod=0655 ./start.sh /docker-entrypoint.d/start.sh
COPY --chmod=0777 ./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