Python

[Python] Docker SDK를 통한 도커 다루기

비번변경 2023. 7. 18. 17:44

개요

2023.07.11 - [Airflow] DockerOperator를 살펴보면서 Python을 이용해 Docker를 다룰 수 있다는 것도 알게 되었다.

그렇다면 방법을 알아보는 게 인지상정……까지는 아니지만 궁금하니 간단히 정리해보려고 한다.

 

 

Docker SDK for Python

Docker SDK for Python은 Docker Engine API을 사용하기 위한 Python 라이브러리다. 컨테이너 실행이나 관리와 같은 docker 명령어로 할 수 있는 모든 작업을 Python 애플리케이션 내에서 수행할 수 있게 해 준다. 

공식 문서 : https://docker-py.readthedocs.io/en/stable/#

 

 

라이브러리 설치

Docker SDK를 사용하기 위해서는 라이브러리 설치가 필요하다.

pip install docker

 

 

모듈 임포트

설치한 Docker 라이브러리는 아래와 같이 import하여 사용할 수 있다.

import docker

 

 

클라이언트 정의

Docker 데몬과 통신하기 위해서는 클라이언트를 선언해야 한다. from_env 함수를 이용하면 기본 소켓/구성을 사용하여 Docker 데몬과 연결할 수 있다.

import docker

client = docker.from_env()

 

컨테이너 실행

컨테이너를 다룰 때는 containers 모듈을 이용하는 것 같다. 컨테이너 실행 시에는 containers.run 함수에 실행할 이미지와 명령어를 전달한다.

import docker

client = docker.from_env()
print(client.containers.run('python:3.8.17-slim', 'echo "hello, world!"'))

실행한 컨테이너는 docker ps 명령으로 확인할 수 있다. 이 컨테이너는 즉시 실행이 완료되는 컨테이너라 중지 상태로 남아있었고, 컨테이너 이름은 랜덤 하게 지정되었다.

만약 백그라운드로 실행해야 한다면 detach 옵션에 True를 전달해준다.

container = client.containers.run("bfirsh/reticulate-splines", detach=True)

 

 

컨테이너 목록 확인

containers.list 함수를 이용하면 docker ps 명령과 동일한 결과를 얻을 수 있다. 기본적으로 실행 중인 컨테이너 목록을 확인할 수 있으며, 중지된 컨테이너까지 확인하고 싶을 때는 매개변수에 all=True로 지정하여 호출한다.

import docker

client = docker.from_env()
print(client.containers.list(all=True))

 

 

컨테이너 관리

특정 컨테이너를 중지하거나 삭제, 로그를 확인하고 싶을 때는 containers.get 함수로 작업할 컨테이너 객체를 얻은 후 작업한다.

 

컨테이너 중지 / docker stop

import docker

client = docker.from_env()
container = client.containers.get('a15443e1bb00')
container.stop()

 

로그 확인 / docker logs

import docker

client = docker.from_env()
container = client.containers.get('a15443e1bb00')
print(container.logs())

 

컨테이너 삭제 / docker rm

import docker

client = docker.from_env()
container = client.containers.get('a15443e1bb00')
print(container.remove())

docker ps 명령으로 위에서 실행했던 a15443e1bb00 컨테이너가 삭제된 상태임을 확인할 수 있다.

 

 

이미지 목록 확인

컨테이너와 유사하게 images.list 함수를 이용해 docker images 명령과 동일한 결과를 얻을 수 있다.

import docker

client = docker.from_env()
print(client.images.list())

 

 

참고 문서

https://docs.docker.com/engine/api/sdk/examples/

https://docker-py.readthedocs.io/en/stable/index.html