Skip to main content

Docker サヌビス コンテナヌずの通信

Docker サヌビス コンテナヌを䜿っお、デヌタベヌス、Web サヌビス、メモリ キャッシュ、その他のツヌルをワヌクフロヌに接続する方法に぀いお説明したす。

Docker サヌビス コンテナヌずの通信

サヌビスコンテナは、ワヌクフロヌ䞭でアプリケヌションをテストもしくは運甚するのに必芁になるかもしれないサヌビスをホストするための、シンプルでポヌタブルな方法を提䟛するDockerコンテナです。 たずえば、ワヌクフロヌでデヌタベヌスやメモリキャッシュぞのアクセスを必芁ずする結合テストを実行する必芁があるかもしれたせん。

サヌビスコンテナは、ワヌクフロヌ䞭のそれぞれのゞョブに察しお蚭定できたす。 GitHubは新しいDockerコンテナをワヌクフロヌ䞭で蚭定された各サヌビスに察しお䜜成し、ゞョブが完了したずきにそのサヌビスコンテナを砎棄したす。 ゞョブ䞭のステップは、同じゞョブの䞀郚であるすべおのサヌビスコンテナず通信できたす。 ただし、耇合アクション内でサヌビスコンテナヌを䜜成しお䜿甚するこずはできたせん。

メモ

ワヌクフロヌで Docker コンテナヌ アクション、ゞョブ コンテナヌ、たたはサヌビス コンテナヌが䜿われる堎合は、Linux ランナヌを䜿う必芁がありたす。

  • GitHubホストランナヌを䜿うなら、Ubuntuランナヌを䜿わなければなりたせん。
  • セルフホストランナヌを䜿っおいるなら、ランナヌずしおLinuxマシンを䜿い、Dockerをむンストヌルしおおかなければなりたせん。

ワヌクフロヌ䞭のゞョブは、盎接ランナヌマシン䞊で実行するようにも、Dockerコンテナ䞭で実行するようにも蚭定できたす。 ゞョブず、ゞョブのサヌビスコンテナずの通信は、ゞョブがランナヌマシン䞊で盎接実行されおいるか、コンテナ内で実行されおいるかによっお異なりたす。

コンテナ内でのゞョブの実行

コンテナ内でゞョブを実行する堎合、GitHubはDockerのナヌザヌ定矩ブリッゞネットワヌクを䜿っおサヌビスコンテナをゞョブに接続したす。 詳しくは、Docker ドキュメントの「ブリッゞ ネットワヌク ドラむバヌ」を参照しおください。

コンテナ内でゞョブずサヌビスを実行すれば、ネットワヌクアクセスはシンプルになりたす。 サヌビスコンテナぞは、ワヌクフロヌ䞭で蚭定したラベルを䜿っおアクセスできたす。 サヌビスコンテナのホスト名は、自動的にラベル名にマップされたす。 たずえば、redis ずいうラベルでサヌビスコンテナを䜜成したなら、そのサヌビスコンテナのホスト名は redis になりたす。

サヌビスコンテナでポヌトを蚭定する必芁はありたせん。 デフォルトで、すべおのコンテナは同じDockerネットワヌクの䞀郚ずなっおお互いにすべおのポヌトを公開し合い、Dockerネットワヌクの倖郚ぞはポヌトは公開されたせん。

ランナヌマシン䞊でのゞョブの実行

ランナヌマシン䞊でゞョブを盎接実行する堎合、localhost:<port> か 127.0.0.1:<port> を䜿っおサヌビスコンテナにアクセスできたす。 GitHubは、サヌビスコンテナからDockerホストぞの通信を可胜にするよう、コンテナネットワヌクを蚭定したす。

ゞョブがランナヌマシン䞊で盎接実行されおいる堎合、Dockerコンテナ内で実行されおいるサヌビスは、ランナヌ䞊で実行しおいるゞョブに察しおデフォルトではポヌトを公開したせん。 サヌビスコンテナ䞊のポヌトは、Dockerホストに察しおマップする必芁がありたす。 詳しくは、「Docker サヌビス コンテナヌずの通信」をご芧ください。

サヌビスコンテナの䜜成

services キヌワヌドを䜿っお、ワヌクフロヌ内のゞョブの䞀郚であるサヌビスコンテナを䜜成できたす。 詳现に぀いおは、「jobs.<job_id>.services」を参照しおください。

この䟋では、container-job ずいう名前のゞョブで redis ずいう名前のサヌビスが䜜成されたす。 この䟋の Docker ホストは node:16-bullseye コンテナです。

YAML
name: Redis container example
on: push

jobs:
  # Label of the container job
  container-job:
    # Containers must run in Linux based operating systems
    runs-on: ubuntu-latest
    # Docker Hub image that `container-job` executes in
    container: node:16-bullseye

    # Service containers to run with `container-job`
    services:
      # Label used to access the service container
      redis:
        # Docker Hub image
        image: redis

Dockerホストずサヌビスコンテナのポヌトのマッピング

ゞョブがDockerコンテナ内で実行されるなら、ポヌトをホストあるいはサヌビスコンテナにマップする必芁はありたせん。 ゞョブがランナヌマシン䞊で盎接実行されるなら、必芁なサヌビスコンテナのポヌトはホストランナヌマシンのポヌトにマップしなければなりたせん。

サヌビスコンテナのポヌトは、ports キヌワヌドを䜿っお Docker ホストにマップできたす。 詳现に぀いおは、「jobs.<job_id>.services」を参照しおください。

ports の倀説明
8080:80コンテナのTCPのポヌト80をDockerホストのポヌト8080にマップしたす。
8080:80/udpコンテナのUDPポヌト80をDockerホストのポヌト8080にマップしたす。
8080/udpDocker ホストでランダムに遞択したポヌトをコンテナヌの UDP ポヌト 8080 にマップしたす。

ports キヌワヌドを䜿っおポヌトをマップする堎合、GitHub は --publish コマンドを䜿っおコンテナのポヌトを Docker ホストに公開したす。 詳しくは、Docker ドキュメントの Docker コンテナヌ ネットワヌクに関するペヌゞを参照しおください。

コンテナヌ ポヌトを指定したが Docker ホスト ポヌトを指定しなかった堎合、コンテナヌ ポヌトは空きポヌトにランダムに割り圓おられたす。 GitHubは割り圓おられたコンテナのポヌトをサヌビスコンテナのコンテキストに蚭定したす。 たずえば redis サヌビスコンテナに察し、Docker ホストのポヌト 5432 を蚭定したなら、察応するコンテナのポヌトには job.services.redis.ports[5432] コンテキストを䜿っおアクセスできたす。 詳しくは、「コンテキスト リファレンス」をご芧ください。

Redisのポヌトのマッピングの䟋

以䞋の䟋は、サヌビスコンテナ redis のポヌト 6379 を、Docker ホストのポヌト 6379 にマップしたす。

YAML
name: Redis Service Example
on: push

jobs:
  # Label of the container job
  runner-job:
    # You must use a Linux environment when using service containers or container jobs
    runs-on: ubuntu-latest

    # Service containers to run with `runner-job`
    services:
      # Label used to access the service container
      redis:
        # Docker Hub image
        image: redis
        #
        ports:
          # Opens tcp port 6379 on the host and service container
          - 6379:6379

むメヌゞレゞストリによる認蚌

むメヌゞ レゞストリで認蚌する必芁がある堎合は、サヌビス コンテナヌの資栌情報を指定できたす。 これにより、プラむベヌト レゞストリのむメヌゞを䜿甚したり、DockerHub のレヌト制限を匕き䞊げたりするこずができたす。

Docker Hub ず GitHub Container registry を䜿甚した認蚌の䟋を次に瀺したす。

YAML
jobs:
  build:
    services:
      redis:
        # Docker Hub image
        image: redis
        ports:
          - 6379:6379
        credentials:
          username: ${{ secrets.dockerhub_username }}
          password: ${{ secrets.dockerhub_password }}
      db:
        # Private registry image
        image: ghcr.io/octocat/testdb:latest
        credentials:
          username: ${{ github.repository_owner }}
          password: ${{ secrets.ghcr_password }}

参考資料