Profile picture

[Python] 도커 SDK 제어해보기 - 컨테이너 조회 / 컨테이너 명령 실행 등

JaehyoJJAng2024년 11월 01일

개요

이번 포스팅에서는 파이썬의 docker 라이브러리를 활용하여 도커 컨테이너를 제어하는 방법에 대해 기록해보려고 한다!


1. 도커 SDK를 사용한 API 호출

파이썬용 Docker SDK를 설치하면 CLI 명령 없이도 컨테이너 정보를 가져오는 것이 가능하다.

그러기 위해서는 먼저 아래 명령을 실행하여 Docker SDK를 설치해주자.

pip install docker

1-1. 컨테이너 목록 가져오기

Docker SDK 설치가 완료 되었다면 이제 컨테이너 목록을 가져오는 코드를 작성해볼거다.


컨테이너 목록을 가져오는 코드는 다음과 같다.

import docker
from docker.model.containers import Container

def get_docker_containers() -> None:
    try:
        client = docker.from_env()
        containers: list[Container] = client.containers.list()
        for container in containers:
            print(f"Container ID: {container.id}")
            print(f"Name: {container.name}")
            print(f"Image: {container.image.tags}")
            print(f"Status: {container.status}")
            print("-" * 40)
    except docker.errors.DockerException as e:
        print(f"Error: {e}")

# 사용 예시
get_docker_containers()

여기서 특정 컨테이너만 가져오고 싶으면 container_name 이라는 변수를 하나 만들어 거기에 컨테이너 이름을 지정하고,

if로 분기 해주면 쉽게 처리 가능하다.

import docker
from docker.model.containers import Container

container_name: str = "my-app-server"

def get_docker_containers() -> None:
    try:
        client = docker.from_env()
        containers: list[Container] = client.containers.list()
        for container in containers:
            if container.name == container_name:
                print(f"Container ID: {container.id}")
                print(f"Name: {container.name}")
                print(f"Image: {container.image.tags}")
                print(f"Status: {container.status}")
                print("-" * 40)
    except docker.errors.DockerException as e:
        print(f"Error: {e}")

# 사용 예시
get_docker_containers()


2. 컨테이너 내부에서 명령 실행하기

도커 SDK에서는 컨테이너 내부 명령 실행을 위한 exec_run 메소드를 제공한다!


사용 방법은 다음과 같다.

import docker

def exec_command_in_container(container_name_or_id, command):
    try:
        client = docker.from_env()
        container = client.containers.get(container_name_or_id)
        exit_code, output = container.exec_run(command, tty=True)
        if exit_code == 0:
            return output.decode('utf-8')
        else:
            print(f"Command failed with exit code {exit_code}")
            return None
    except docker.errors.DockerException as e:
        print(f"Error: {e}")
        return None

# 사용 예시
container_id = "your_container_id"
command = "ls /"  # 실행할 명령어
output = exec_command_in_container(container_id, command)
if output:
    print(output)

여기서 주의할 점은 Docker SDK는 실행 결과를 바이트(Byte) 문자열로 반환하므로 .decode()를 사용해 일반 문자열로 변환해야 한다.


Loading script...