ゆるくエンジニア日記

職業はシステムエンジニア。日々の学びや感じたことをゆるく記録していきます。

docker runとdocker-composeでのportの違い

コンテナ技術の勉強として、DockerでアプリとDBをつないでみた。
その時にポートの設定で少し詰まったところと、検証してみてわかったことがあったので、備忘録。

イメージ

それぞれの違い

docker runの場合
docker runで立ち上げた場合、コンテナ間の通信には、外部アクセス用のポートが使用される。

docker-composeの場合
docker-compose upで立ち上げた場合は、コンテナ間の通信はその内部のポートが使用される。

docker run で構築する場合の手順

※アプリ・DBそれぞれ単体で立ち上げて動作することは確認済みの前提。

1. ネットワークを作成する

アプリとDBをつなぐためのネットワークを作成する。

docker network create hoge_network

2. アプリ側のコンテナを作成する

※ここでは、Tomcatに対してSpringBootで作成したアプリケーションを構築したものを想定する。

2-1. アプリケーション定義ファイルの作成

作成するアプリ側の定義ファイルは、以下の通り。

spring:
  datasource:
    url: jdbc:postgresql://db:5433/hogedb
    username: postgres
    password: postgres
    driver-class-name: org.postgresql.Driver
  jpa:
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    show-sql: true
    hibernate:
      ddl-auto: none

ここで、urlに指定するホスト名には、docker runする時に指定するネットワークのエイリアス名。ポート番号は、外部から接続するためのポート番号を指定する。

2-2. Dockerfileの作成

イメージを作成するために、Dockerfileを作成する。

# Dockerfile
FROM tomcat:9.0.64
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
ENV WAR_FILE target/*.war
WORKDIR $CATALINA_HOME
COPY ${WAR_FILE} webapps/hoge.war
2-3. イメージの作成

ビルド用のコマンドを実行する。

docker build -t hoge_user/hoge .
2-4. コンテナの立ち上げ

イメージができたら、docker runを実行する。

docker run -dp 8888:8080 --name hoge_container --network hoge_network --network-alias app hoge_user/hoge

少し日本語訳すると、

  • 先ほどビルドして作成した[ hoge_user/hoge ]というイメージを使って、コンテナを作成・起動する。
  • コンテナの名前は、[ hoge_container ]として作成する。
  • コンテナ外からのアクセスは8888ポートで受け付け、コンテナ内の8080ポートとしてポートフォワードする。
  • ネットワークは、[ hoge_network ]に入り、ホスト名を[ app ]とする。

3. DB側のコンテナを作成する

※DB側コンテナのベースとなるイメージはpullしている前提。

3-1. DB側のコンテナの立ち上げ

postgres:14.0のイメージを使用して、コンテナを作成・起動する。

docker run -it -d `
--network hoge_network --network-alias db `
--name hoge_postgres `
-e POSTGRES_PASSWORD=postgres `
-e POSTGRES_DB=hogedb `
-e POSTGRES_USER=postgres `
-p 5433:5432 `
postgres:14.0

アプリ側と同じように、コンテナの名前とポートフォワーディング、ホスト名の設定を行う。

docker-compose で構築する場合の手順

この場合は、docker-compose.ymlファイルさえ作成すれば準備は完了する。

1. docker-compose.ymlの作成

version: '3.6'
services:
  app:
    container_name: hoge_container
    image: hoge_name/hoge
    ports:
      - 8888:8080
    depends_on:
      - db
  db:
    container_name: hoge_postgres
    image: postgres:14.0
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: hogedb
    ports:
      - 5433:5432
  

2. コンテナの立ち上げ

下記のコマンドを実行する。-fオプションで指定しているのは、1で作成したdocker-compose.ymlのファイルパス。

docker-compose -f docker-compose.yml up -d

まとめ

今の自分にはdocker-composeを使った方が楽に感じる。
でもたぶんどこかでdocker runで構築しないといけないような場面もでてくる気がする。