Ubuntu 20.04にDockerコンテナ構築スクリプト

スポンサーリンク
スポンサーリンク

はじめに

Ubuntu20.04にDockerコンテナを構築するためのスクリプトについて説明します。

使用しているスクリプトは、githubにvm-configurateとして公開しているのでgithubからダウンロードするかここからダウンロードしてください。

vm-configurateのフォルダ構成については、下のリンクを参照してください。

/guest-share/ubuntu-20.04/docker-start.sh

Dockerコンテナを起動するためのスクリプトです。

スクリプトファイルの場所をカレントディレクトリにしています。

SCRIPT_DIR=$(dirname "$0")
cd "$SCRIPT_DIR"

docker-compose.ymlファイルのあるdockerディレクトリをカレントディレクトリにしています。

cd "docker"

/guest-share/ubuntu-20.04/docker/ENVファイルに定義している内容を元に”docker-compose.yml”で使用可能な環境変数定義ファイル”.env”を作成し読み込み直しています。

サンプルでは、Dockerコンテナのボリュームの永続化パスをスクリプトの実行位置を基準としたフォルダパスとし、サイトのBase URLにUbuntuのホスト名として”.env”ファイルに保存しています。

sed -e "s|\[VOLUME_HOME\]|$(cd "../../" && pwd)/docker-volumes|g" \
	-e "s|\[HOST_NAME\]|$(hostname)|g" "ENV" > ".env"
. ".env"

.envファイルからDockerコンテナのボリュームを永続化するためのパスを読み込んでディレクトリを作成しています。

while read line
do
	if [[ ${line} =~ ^VOLUME_.*$ ]]; then
		dirName=${line#*=}
		mkdir -p "${dirName}"
	fi
done < ".env"

Jenkinsコンテナのボリュームの保存先となるディレクトリの所有者と所有グループをuid1000に変更しています。

JenkinsコンテナはUID1000で実行されているため、ボリュームの保存先ディレクトリの所有者UIDが1000以外であった場合、アクセス権がないためエラーとなります。このエラーを防ぐためディレクトリの所有者のUIDを1000に変更しています。

chown -R 1000:1000 "${VOLUME_JENKINS_HOME}"

Dockerコンテナを現在のカレントディレクトリにあるdocker-compose.ymlに記述されているコンテナの構成を元に起動します。

-dパラメータでDockerコンテナをターミナルとは異なるプロセスで実行するように指定しています。パラメータを指定しなかった場合、Dockerコンテナが終了するまでコマンドが終了しなくなります。

docker-compose up -d

/guest-share/ubuntu-20.04/docker/ENV

docker-compose.ymlで使用する環境変数のファイル.envの元になるファイルです。

基準となるURLを定義しています。

[HOST_NAME]は、docker-start.shでUbuntuに設定されているホスト名に置換されて.envファイルに保存されます。

BASE_URL=http://[HOST_NAME]

パスワードシードが必要なコンテナに対して設定するシード値を定義しています。

PASSWORD_SEED=password_seed

コンテナのボリュームの永続化先となるディレクトリを定義しています。

[VOLUME_HOME]は、docker-start.shでスクリプトの実行ディレクトリを元に置換されて.envファイルに保存されます。

VOLUME_JENKINS_HOME=[VOLUME_HOME]/jenkins/home
VOLUME_GROWI_DATA=[VOLUME_HOME]/growi/data
VOLUME_GROWI_MONGODB_CONFIGDB=[VOLUME_HOME]/growi-mongodb/configdb
VOLUME_GROWI_MONGODB_DB=[VOLUME_HOME]/growi-mongodb/db
VOLUME_GROWI_ELASTICSEARCH_DATA=[VOLUME_HOME]/growi-elasticsearch/data
VOLUME_GROWI_ELASTICSEARCH_PLUGINS=[VOLUME_HOME]/growi-elasticsearch/plugins
VOLUME_GROWI_ELASTICSEARCH_CONFIG=[VOLUME_HOME]/growi-elasticsearch/config
VOLUME_GROWI_REDIS_DATA=[VOLUME_HOME]/growi-redis/data

/guest-share/ubuntu-20.04/docker/docker-compose.yml

docker-compose.ymlは、Docker Composeがコンテナの構成を記述するためのファイルです。

docker-compose.ymlファイルのファイルフォーマットのバージョンを指定しています。

version: '3.8'

サービスの定義を行います。

サンプルでは、jenkins・growi・growi-mongodb・growi-elasticsearch・growi-redis・growi-plantumlをサービスとして定義しています。

services:

Jenkinsコンテナの構成を定義しています。

imageでDocker Hubのjenkins/jenkinsを使用するように指定しています。

container_nameで、コンテナの名前をjenkinsに指定しています。

portsで、コンテナ上のポート番号8080と9000をUbuntuのポート番号8080と9000にマッピングし外部からポート番号8080と9000でJenkinsにアクセス出来るようにしています。

volumesで、コンテナの”/var/jenkins_home”ディレクトリをjenkins_homeにマウントしています。

restartで、Dockerが起動した時に自動的にコンテナを起動するように設定しています。

  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - '8080:8080'
      - '9000:9000'
    volumes:
      - 'jenkins_home:/var/jenkins_home'
    restart: always

Growiコンテナの構成を定義しています。

imageでDocker Hubのwseek/growiを使用するように指定しています。

container_nameで、コンテナの名前をgrowiに指定しています。

portsで、コンテナ上のポート番号3000をUbuntuのポート番号80にマッピングし外部からポート番号80でGrowiにアクセス出来るようにしています。

depends_onで、growiサービスに依存関係のあるサービスを指定して、コンテナの起動順序を設定しています。

environmentで、Growiコンテナの環境変数を設定しています。

volumesで、コンテナの/dataディレクトリをgrowi_dataにマウントしています。

restartをalwaysに設定することDockerが起動した時に自動的にコンテナを起動するように設定しています。

  growi:
    image: weseek/growi
    container_name: growi
    ports:
      - 80:3000
    depends_on:
      - growi-mongodb
      - growi-elasticsearch
      - growi-redis
      - growi-plantuml
    environment:
      - BASE_URL=${BASE_URL}
      - PASSWORD_SEED=${PASSWORD_SEED}
      - MONGO_URI=mongodb://growi-mongodb:27017/growi
      - ELASTICSEARCH_URI=http://growi-elasticsearch:9200/growi
      - REDIS_URL=redis://growi-redis:6379/growi
      - MATHJAX=1
      - PLANTUML_URI=//growi-plantuml:8080
      - FILE_UPLOAD=local
    volumes:
      - growi_data:/data
    restart: always

コンテナのマウント先となるボリュームを定義しています。

volumes:

Comment

スポンサーリンク