はじめに
Dockerを使用してngixとTomcat、PostgreSQLの環境を構築します。
Dockerのインストールがまだの場合、こちらの記事を参考にインストールしてください。
docker composeを使用して、まずは、必要最低限の設定で動作を確認します。
プロジェクト名
まずは、プロジェクト名を決めます。この記事では、プロジェクト名は「my-project」とします。
プロジェクト名を決めたら、適当な場所に決定したプロジェクト名のフォルダを作成します。
docker-compose.yml
プロジェクト名フォルダの直下に、docker-compose.ymlを作成します。
docker-compose.ymlにはnginx、tomcat、postgresqlの定義を記載します。
なお、postgresqlの環境設定値については、ご自身の環境に合わせて任意に変更してください。
#version 3.8 services: nginx: # サービス名(Nginx) build: # Dockerfileを使用してイメージからビルドを行う context: ./nginx # Dockerfileの場所 container_name: nginx # コンテナ名。指定が無い場合「プロジェクト名_サービス名_1」という名前で作成される tomcat: # サービス名(Tomcat) build: context: ./tomcat container_name: tomcat postgres: # サービス名(PostgreSQL) build: context: ./postgres container_name: postgres environment: POSTGRES_DB: hogehoge POSTGRES_USER: hogehoge POSTGRES_PASSWORD: fugafuga PGPASSWORD: fugafuga
docker-compose.ymlの1行目にversionの記載がある記述例を良く見かけますが、この記述は不要です。書かれていても起動時にワーニングが出力されるだけでエラーにはなりませんが、この例では、versionはコメントアウトしています。
Dockerfile
DockerHubで提供されているイメージを元に、拡張させたコンテナを作成するためにはDockerfileを作成する必要があります。
nginx
最初にnginxのDockerfileを作成します。
FROM nginx:latest
Tomcat
続いて、TomcatのDockerfileを作成します。
動作確認の為、webapps.distにあるすべてのアプリをwebappsに移動しています。
FROM tomcat:latest WORKDIR /usr/local/tomcat/webapps/ RUN mv /usr/local/tomcat/webapps.dist/* ./ && rmdir /usr/local/tomcat/webapps.dist
PostgreSQL
最後に、PostgreSQLのDockerfileを作成します。
FROM postgres:latest
実行
以下、コマンドで、実行します。
docker compose up -d
以下のコマンドを実行して、3つのコンテナが実行されていることを確認します。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c6d4b9c321e6 docker-nginx "/docker-entrypoint.…" 1 minutes ago Up 1 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx 41303bddf9f5 docker-tomcat "catalina.sh run" 1 minutes ago Up 1 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat 0297c95fac40 docker-postgres "docker-entrypoint.s…" 1 minutes ago Up 1 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres
localhostにアクセスしてみます。nginxのトップページが表示されます。
同様に、localhost:8080にアクセスして、tomcatの管理ページが表示されることを確認します。
続いて、コンテナ内にある設定ファイル、ログファイルをホスト側で管理できるように修正します。
まず、以下のようにフォルダを作成します。
./my-project
├─nginx
│ ├conf
│ ├log
│ └Dockerfile
├─tomcat
│ ├conf
│ ├log
│ ├webapps
│ └Dockerfile
├─postgres
│ ├conf
│ ├data
│ ├init
│ ├log
│ └Dockerfile
└docker-compose.yml
続いて、Nginx、Tomcat、PostgreSQLの設定ファイルを取得します。
docker cp nginx:/usr/share/nginx/html/ ./nginx/html/ docker cp nginx:/etc/nginx/conf.d/default.conf ./nginx/conf/ docker cp tomcat:/usr/local/tomcat/conf/ ./tomcat/conf docker cp postgres:/var/lib/postgresql/data/pg_ident.conf ./postgres/conf/ docker cp postgres:/var/lib/postgresql/data/pg_hba.conf ./postgres/conf/ docker cp postgres:/var/lib/postgresql/data/postgresql.conf ./postgres/conf/
コンテナを終了します。
docker compose down
Postgresqlのvolumeを作成します。
docker volume create db_data
作成したvolumeの詳細を確認します。
docker volume inspect db_data
[ { "CreatedAt": "yyyy-MM-ddThh:mm:ss+09:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/db_data/_data", "Name": "db_data", "Options": null, "Scope": "local" } ]
docker-compose.yml
docker-compose.ymlを以下のように修正します。
#version: "3.8" services: nginx: build: context: ./nginx container_name: nginx depends_on: # TomcatとPostgreSQLの起動を待つ - tomcat - postgres restart: always volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/log:/var/log/nginx ports: - 80:80 tomcat: build: context: ./tomcat container_name: tomcat depends_on: - postgres restart: always ports: - 8080:8080 volumes: - ./tomcat/conf:/usr/local/tomcat/conf - ./tomcat/log:/usr/local/tomcat/logs postgres: build: context: ./postgres container_name: postgres restart: always ports: - 5432:5432 environment: POSTGRES_DB: hogehoge POSTGRES_USER: hogehoge POSTGRES_PASSWORD: fugafuga PGPASSWORD: fugafuga TZ: Asia/Tokyo volumes: - ./postgres/conf/postgresql.conf:/etc/postgres/postgresql.conf - ./postgres/conf/pg_hba.conf:/etc/postgres/pg_hba.conf - ./postgres/conf/pg_ident.conf:/etc/postgres/pg_ident.conf - ./postgres/init:/docker-entrypoint-initdb.d - ./postgres/log:/var/log/postgresql - db_data:/var/lib/postgresql/data volumes: db_data: external: true
default.conf
先ほどコピーしたnginxの設定ファイルdefault.confを以下のように修正します。
server { listen 80; listen [::]:80; server_name localhost; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://tomcat:8080/; #root /usr/share/nginx/html; #index index.html index.htm; }
コンテナを立ち上げます。
docker compose up -d
localhostにアクセスします。Tomcatのトップページが表示されることが確認できます。
コメント