개요
이번 포스팅에서는 파이썬의 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()
를 사용해 일반 문자열로 변환해야 한다.