Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Docker용 Python 라이브러리 API 활용 가이드

Docker용 Python 라이브러리 API를 사용하면 컨테이너, 이미지, 클러스터, 스웜(Swarm) 등 다양한 Docker 객체에 접근하고, 이를 자유롭게 조작하고 관리할 수 있습니다. Docker 명령어로 가능한 거의 모든 작업을 Python 코드로 처리할 수 있기 때문에, Django나 Flask처럼 Python으로 작성된 애플리케이션을 운영하면서 동일한 스크립트 안에서 Docker 컨테이너까지 함께 관리하고 싶을 때 특히 유용합니다.

docker-py 패키지 설치

Docker용 Python 라이브러리 API를 사용하려면 먼저 docker-py라는 패키지를 설치해야 합니다. 아래의 pip 명령어로 간단히 설치할 수 있습니다. Python 2 환경이라면 pip3 대신 pip를 사용하세요.

pip3 install docker-py

이제 Docker Python 클라이언트 라이브러리 API의 주요 기능들을 하나씩 살펴보겠습니다.

Docker 데몬에 연결하기

API를 통해 Python 스크립트 내부에서 Docker 명령을 실행하려면, 가장 먼저 Docker 데몬에 연결해야 합니다. 다음과 같은 방식으로 클라이언트 객체를 생성할 수 있습니다.

#import client
from docker import client

#create a client object to connect to the daemon
myClient = client.Client(base_url='unix://var/run/docker.sock')

데몬 연결이 완료되면 이후의 모든 Docker 작업을 이 클라이언트 객체를 통해 수행할 수 있습니다.

컨테이너 목록 조회

연결 후에는 다음 명령으로 로컬 머신에 존재하는 모든 컨테이너 목록을 가져올 수 있습니다. 참고로 권한 오류를 피하려면 명령을 실행하기 전에 반드시 root 사용자로 로그인되어 있어야 합니다.

myClient.containers()

이 명령은 각 컨테이너의 ID, 연결된 이미지와 이미지 ID, 라벨, 포트, 상태 등의 정보를 포함한 전체 목록을 반환합니다.

컨테이너 생성하기

새로운 컨테이너를 만들 때는 클라이언트 객체의 create_container 메서드를 사용합니다.

myContainer=myClient.create_container(image='ubuntu:latest',command='/bin/bash')

위 코드는 ubuntu 이미지로부터 컨테이너를 생성하고, bash 셸을 열거나 원하는 다른 명령을 지정할 수 있게 해줍니다.

컨테이너가 실제로 생성되었는지 확인하려면 아래와 같이 컨테이너 ID를 출력해 보면 됩니다.

print(myContainer['Id'])

컨테이너 검사(Inspect)

특정 컨테이너의 상세 정보를 확인하려면 inspect_container 메서드를 사용합니다.

myClient.inspect_container('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')

검사하려는 컨테이너의 ID를 인자로 전달하면 되며, 필요하다면 이름(Name), 생성일(Created), 실행 경로(Path) 같은 특정 필드만 골라서 조회할 수도 있습니다.

myClient.inspect_container('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')['Name']

myClient.inspect_container('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')['Created']

myClient.inspect_container('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')['Path']

컨테이너 커밋과 재시작

컨테이너의 현재 상태를 이미지로 저장하려면 commit 메서드를 사용하며, 태그(tag)를 함께 지정할 수도 있습니다.

myClient.commit('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5', tag='container1')

위 명령은 해당 컨테이너의 ID를 반환합니다. 컨테이너를 재시작할 때는 해당 컨테이너가 여전히 존재하는지 확인해야 하므로, 예외 처리를 위해 try-except 블록으로 감싸는 것이 좋습니다.

try:
myClient.restart('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')
except Exception as e:
print(e)

이미지 관리

모든 이미지 목록을 조회하려면 클라이언트 객체의 images 메서드를 사용합니다.

images = myClient.images()

반환된 목록에서 첫 번째 이미지의 세부 정보를 출력하려면 다음과 같이 작성합니다.

print(images[0])

특정 이미지를 검사할 때는 inspect_image 메서드에 이미지 ID를 인자로 전달하면 됩니다.

myClient.inspect_image('9140108b62dc87d9b278bb0d4fd6a3e44c2959646eb966b86531306faa81b09b')

볼륨 관리

이제 볼륨을 다루는 몇 가지 유용한 명령을 살펴보겠습니다. 전체 볼륨 목록은 volumes 메서드로 조회할 수 있습니다.

volumes = myClient.volumes()

첫 번째 볼륨의 세부 정보를 출력하려면 다음과 같이 합니다.

print(volumes['Volumes'][0])

볼륨을 새로 생성할 때는 볼륨 이름과 드라이버 이름을 지정해야 하며, 필요에 따라 추가 옵션도 함께 설정할 수 있습니다.

volume=myClient.create_volume(name='myVolume1', driver='local', driver_opts={})

볼륨이 정상적으로 생성되었는지 확인하려면 출력해 보면 됩니다.

print(volume)

생성된 볼륨의 상세 정보를 검사하려면 inspect_volume 메서드를 사용합니다.

myClient.inspect_volume('myVolume1')

볼륨이 마운트된 컨테이너 생성

볼륨을 마운트한 컨테이너를 만들 때는 다음 예시처럼 작성할 수 있습니다.

mounted_container = myClient.create_container(
   'ubuntu', 'ls', volumes=['/var/lib/docker/volumes/myVolume1'],
   host_config=myClient.create_host_config(binds=[
  '/var/lib/docker/volumes/myVolume1:/usr/src/app/myVolume1'
  ])
)

위 코드는 ubuntu 이미지로부터 컨테이너를 생성하고 진입점(entrypoint)을 ls로 지정한 뒤, 로컬 머신의 /var/lib/docker/volumes/myVolume1 경로에 있는 볼륨을 컨테이너 내부의 /usr/src/app/myVolume1 경로에 마운트합니다.

마무리

이번 글에서는 Python 스크립트를 사용해 Docker 컨테이너, 이미지, 볼륨 같은 Docker 객체를 생성하고 검사하고 관리하는 방법을 살펴보았습니다. Django나 Flask 기반 웹 애플리케이션, tkinter 기반 GUI 애플리케이션 등 Python 도구로 애플리케이션을 개발하면서 이를 Docker 컨테이너에서 운영하려는 경우, 명령줄 인터페이스(CLI)에서 명령을 일일이 실행하는 것보다 Python 스크립트로 Docker 명령을 작성해 관리하는 것이 훨씬 효율적이고 권장되는 방식입니다.