Skip to main content

서비스 컨테이너 정보

서비스 컨테이너를 사용하여 데이터베이스, 웹 서비스, 메모리 캐시 및 기타 도구를 워크플로에 연결할 수 있습니다.

참고: GitHub 호스트 실행기는 현재 GitHub Enterprise Server에서 지원되지 않습니다. GitHub public roadmap에 예정된 향후 지원에 대해 자세히 알아볼 수 있습니다.

서비스 컨테이너 정보

서비스 컨테이너는 워크플로에서 애플리케이션을 테스트하거나 운영하는 데 필요할 수 있는 서비스를 호스트하는 간단하고 이식 가능한 방법을 제공하는 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 호스트에 매핑해야 합니다. 자세한 내용은 "서비스 컨테이너 정보"을(를) 참조하세요.

서비스 컨테이너 만들기

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 }}

추가 참고 자료