docker runとdocker-composeでのportの違い
コンテナ技術の勉強として、DockerでアプリとDBをつないでみた。
その時にポートの設定で少し詰まったところと、検証してみてわかったことがあったので、備忘録。
イメージ
それぞれの違い
docker run
で立ち上げた場合、コンテナ間の通信には、外部アクセス用のポートが使用される。
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
で構築しないといけないような場面もでてくる気がする。