다음을 통해 공유


서비스 컨테이너

Azure DevOps Services

파이프라인에 하나 이상의 서비스를 지원해야 하는 경우 작업당 서비스를 만들고, 연결하고, 정리해야 할 수 있습니다. 예를 들어 파이프라인은 파이프라인의 각 작업에 대해 새로 만든 데이터베이스 및 메모리 캐시에 액세스해야 하는 통합 테스트를 실행할 수 있습니다.

컨테이너파이프라인이 의존하는 서비스를 실행하는 간단하고 이식 가능한 방법을 제공합니다. 서비스 컨테이너사용하면 컨테이너화된 서비스의 수명 주기를 자동으로 만들고, 네트워크를 만들고, 관리할 수 있습니다. 각 서비스 컨테이너는 필요한 작업에서만 액세스할 수 있습니다. 서비스 컨테이너는 모든 종류의 작업에서 작동하지만 컨테이너 작업에서 가장 일반적으로 사용됩니다.

요구 사항

  • 서비스 컨테이너는 a 또는 ENTRYPOINT.를 CMD 정의해야 합니다. 파이프라인은 인수 없이 제공된 컨테이너에 대해 실행됩니다 docker run .

  • Azure Pipelines는 Linux 또는 Windows 컨테이너를 실행할 수 있습니다. Linux 컨테이너용 호스트된 Ubuntu 컨테이너 풀 또는 Windows 컨테이너용 호스트된 Windows 풀을 사용할 수 있습니다. 호스트된 macOS 풀은 컨테이너 실행을 지원하지 않습니다.

참고 항목

서비스 컨테이너는 클래식 파이프라인에서 지원되지 않습니다.

단일 컨테이너 작업

다음 예제 YAML 파이프라인 정의는 단일 컨테이너 작업을 보여줍니다.

resources:
  containers:
  - container: my_container
    image: buildpack-deps:focal
  - container: nginx
    image: nginx

pool:
  vmImage: 'ubuntu-latest'

container: my_container
services:
  nginx: nginx

steps:
- script: |
    curl nginx
  displayName: Show that nginx is running

이전 파이프라인은 Docker Hub에서 컨테이너 및 buildpack-deps 컨테이너를 가져온 nginx 다음 컨테이너를 시작합니다. 컨테이너는 이름으로 서로 연결할 수 있도록 함께 services 네트워크로 연결됩니다.

이 작업 컨테이너 nginx 내에서 호스트 이름은 Docker 네트워킹을 사용하여 올바른 서비스로 확인됩니다. 네트워크의 모든 컨테이너는 자동으로 모든 포트를 서로 노출합니다.

단일 비컨테이너 작업

다음 예제와 같이 작업 컨테이너 없이 서비스 컨테이너를 사용할 수도 있습니다.

resources:
  containers:
  - container: nginx
    image: nginx
    ports:
    - 8080:80
    env:
      NGINX_PORT: 80
  - container: redis
    image: redis
    ports:
    - 6379

pool:
  vmImage: 'ubuntu-latest'

services:
  nginx: nginx
  redis: redis

steps:
- script: |
    curl localhost:8080
    echo $AGENT_SERVICES_REDIS_PORTS_6379

이전 파이프라인은 최신 nginx 컨테이너를 시작합니다. 작업이 컨테이너에서 실행되고 있지 않으므로 자동 이름 확인이 없습니다. 대신 .localhost 이 예제에서는 포트를 8080:80 명시적으로 제공합니다.

다른 방법은 런타임에 임의 포트를 동적으로 할당하도록 하는 것입니다. 그런 다음 변수를 사용하여 이러한 동적 포트에 액세스할 수 있습니다. 이러한 변수는 다음과 같은 형식 agent.services.<serviceName>.ports.<port>을 사용합니다. Bash 스크립트에서는 프로세스 환경을 사용하여 변수에 액세스할 수 있습니다.

앞의 예제 redis 에서는 호스트에 임의의 사용 가능한 포트가 할당됩니다. 변수에는 agent.services.redis.ports.6379 포트 번호가 포함됩니다.

여러 작업

서비스 컨테이너는 동일한 서비스의 여러 버전에 대해 동일한 단계를 실행하는 데에도 유용합니다. 다음 예제에서는 여러 버전의 PostgreSQL에 대해 동일한 단계를 실행합니다.

resources:
  containers:
  - container: my_container
    image: ubuntu:22.04
  - container: pg15
    image: postgres:15
  - container: pg14
    image: postgres:14

pool:
  vmImage: 'ubuntu-latest'

strategy:
  matrix:
    postgres15:
      postgresService: pg15
    postgres14:
      postgresService: pg14

container: my_container

services:
  postgres: $[ variables['postgresService'] ]
steps:
- script: printenv

포트

컨테이너 리소스 또는 인라인 컨테이너를 호출할 때 다음 예제와 같이 컨테이너에 노출할 배열 ports 을 지정할 수 있습니다.

resources:
  containers:
  - container: my_service
    image: my_service:latest
    ports:
    - 8080:80
    - 5432

services:
  redis:
    image: redis
    ports:
    - 6379/tcp

ports 동일한 Docker 네트워크의 컨테이너가 기본적으로 모든 포트를 서로 자동으로 노출하므로 작업이 컨테이너에서 실행되는 경우 지정할 필요가 없습니다.

작업이 호스트 ports 에서 실행 중인 경우 서비스에 액세스해야 합니다. 포트는 폼 <hostPort>:<containerPort> 을 사용하거나 <containerPort> 끝에 선택적으로 /<protocol> 사용합니다. 예를 들어 6379/tcp 호스트 컴퓨터의 임의 tcp 포트 6379에 바인딩된 포트를 통해 노출합니다.

호스트 컴퓨터의 임의 포트에 바인딩된 포트의 경우 파이프라인은 작업이 포트에 액세스할 수 있도록 양식 agent.services.<serviceName>.ports.<port> 의 변수를 만듭니다. 예를 들어 agent.services.redis.ports.6379 호스트 컴퓨터에서 임의로 할당된 포트로 확인합니다.

볼륨

볼륨은 서비스 간에 데이터를 공유하거나 작업의 여러 실행 간에 데이터를 유지하는 데 유용합니다. 볼륨 탑재를 양식<source>:<destinationPath>volumes 배열로 지정합니다. 여기서 <source> 명명된 볼륨 또는 호스트 컴퓨터의 절대 경로일 수 있으며 <destinationPath> 컨테이너의 절대 경로입니다. 볼륨의 이름은 Docker 볼륨, 익명 Docker 볼륨 또는 호스트의 탑재를 바인딩할 수 있습니다.

services:
  my_service:
    image: myservice:latest
    volumes:
    - mydockervolume:/data/dir
    - /data/dir
    - /src/dir:/dst/dir

참고 항목

Microsoft 호스팅 풀을 사용하는 경우 각 작업이 완료된 후 호스트 컴퓨터가 정리되므로 작업 간에 볼륨이 유지되지 않습니다.

시작 옵션

서비스 컨테이너는 컨테이너 작업과 동일한 컨테이너 리소스를 공유합니다. 즉, 동일한 시작 옵션을 사용할 수 있습니다.

상태 확인

서비스 컨테이너가 HEALTHCHECK지정하는 경우 에이전트는 필요에 따라 컨테이너가 정상 상태가 될 때까지 기다렸다가 작업을 실행할 수 있습니다.

서비스 예제를 사용하는 여러 컨테이너

다음 예제에는 PostgreSQL 및 MySQL 데이터베이스 컨테이너에 연결된 Django Python 웹 컨테이너가 있습니다.

  • PostgreSQL 데이터베이스는 주 데이터베이스이며 해당 컨테이너의 이름은 지정 db됩니다.
  • 컨테이너는 db 볼륨 /data/db:/var/lib/postgresql/data을 사용하며 3개의 데이터베이스 변수를 통해 env컨테이너에 전달됩니다.
  • 컨테이너는 mysql 포트 3306:3306를 사용하며, 을 통해 env전달되는 데이터베이스 변수도 있습니다.
  • 컨테이너가 web 포트 8000를 사용하여 열려 있습니다.

이 단계에서 pip 는 종속성을 설치한 다음 Django 테스트를 실행합니다.

작업 예제를 설정하려면 두 개의 데이터베이스를 사용하여 Django 사이트를 설정해야 합니다. 이 예제에서는 manage.py 파일이 루트 디렉터리에 있고 Django 프로젝트도 해당 디렉터리 내에 있다고 가정합니다. 그렇지 않은 경우 .에서 /__w/1/s/manage.py test경로를 업데이트 /__w/1/s/ 해야 할 수 있습니다.

resources:
  containers:
    - container: db
      image: postgres
      volumes:
          - '/data/db:/var/lib/postgresql/data'
      env:
        POSTGRES_DB: postgres
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
    - container: mysql
      image: 'mysql:5.7'
      ports:
         - '3306:3306'
      env:
        MYSQL_DATABASE: users
        MYSQL_USER: mysql
        MYSQL_PASSWORD: mysql
        MYSQL_ROOT_PASSWORD: mysql
    - container: web
      image: python
      volumes:
      - '/code'
      ports:
        - '8000:8000'

pool:
  vmImage: 'ubuntu-latest'

container: web
services:
  db: db
  mysql: mysql

steps:
    - script: |
        pip install django
        pip install psycopg2
        pip install mysqlclient
      displayName: set up django
    - script: |
          python /__w/1/s/manage.py test