【Docker】Nginx+Tomcat+PostgreSQL

Docker

はじめに

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のトップページが表示されることが確認できます。

コメント

タイトルとURLをコピーしました