0부터 시작하는 Docker 공부 - Docker Engine Architecture & Python 으로 Docker 사용하기

Jaehong Lee·2022년 8월 23일
1
post-thumbnail

1. Docker Engine Architecture

출처 : https://hemanta.io/a-detailed-guide-to-docker-engine/

  • Docker 의 모든 명령어는 API로 Docker daemon 에 전달된다. Api 로 명령을 전달할 때, 로컬에 설치된 Docker daemon 에는 localhost 주소로 전달된다
    • daemon 설정 파일을 설정하여 원격지에서 remote Api 를 통해 명령을 전달하게 할 수 있다
    • 기존에는 Go API 를 통해 명령어를 daemon 에 전달한 것이다

Docker cli 클라이언트가 Daemon 에 명령을 전달할 때는 API 를 사용한다. Daemon 은 API 형태의 명령만을 받아들이고, 클라이언트에서 내린 명령을 해석하지 못하므로, 클라이언트에서 명령을 내리면 중간에서 API 형태로 해석되어 Daemon 에 전달된다

  • 만약, Daemon 에 직접 명령을 전달하고 싶으면, API 형식으로 명령을 내려야 한다
  • 명령에 대한 전달과 같은 처리는 daemon 이 해준다

  • 실질적인 명령 처리는 containerd 가 한다. containerd 는 컨테이너 life cycle 을 관리한다. K8S 에서 통신하는 Docker runtime 은 과거에는 daemon 이었지만, 현재는 containerd 이다

    • containerd 에게 명령이 전달되면, containerd 는 자식 프로세스인 contained_shim 을 생성한다. shim 과 runc 와 생성되는 컨테이너는 1 대 1 관계이다
    • shim 은 생성된 컨테이너와 통신하며, 해당 컨테이너에 대한 정보를 containerd 에게 전달해준다
    • 컨테이너 생성을 위해서는 shim 은 runc 를 호출한다. runc 는 namespace 와 cgroup , chroot 를 사용하여 컨테이너를 생성 및 실행해주고, 작업이 끝나면 runc 는 종료된다
  • Docker daemon 에게 Cli 가 명령을 전달하기 위해 통신할 때는 소켓을 사용하는데, 이 소켓 이름이 docker.sock 이다

    • 이 파일 안에는 daemon 과 통신한 Data 가 저장되있다
    • 해당 파일을 통해 통신 Data 를 기반으로 모니터링이 가능하다

2. Python 으로 Docker 사용하기

  • Python API 로 명령을 전달해보자

패키지 설치 및 파일 생성

  • pip 패키지를 설치하자
  • pip 를 통해 Docker 패키지를 설치하자
  • Python 파일을 하나 생성하자
  • Python3 가 설치된 경로를 확인하고, 생성한 Python 파일을 편집기로 열어주자

Python 스크립트 작성

#!/usr/bin/python3

import docker
client=docker.from_env()

print(client.containers.run("alpine", ["echo", "hello", "all"]))
  • 위와 같이 Python 스크립트를 작성하자
    • docker 패키지의 from_env 함수를 사용하면 docker 에 접속해서 명령을 전달할 수 있다
    • alpine 은 불필요한 것을 모두 제거한 가벼운 linux 이다. 뒤에 [ ] 는 생성된 컨테이너에게 전달할 명령어이다
    • 컨테이너 생성 및 실행 명령어는 containers.run 이다

실행 및 확인

  • docker login 하고, 파일에 실행 권한을 부여한 뒤, 스크립트 파일을 실행하자

  • 생성된 명령 전달의 결과를 print 했으므로, 잘 출력된다

컨테이너 생성 후 ID 출력하기

#!/usr/bin/python3

import docker
client=docker.from_env()

test=client.containers.run("nginx",detach=True)
print(test.id)
  • 위와 같이 작성하자
  • 잘 실행된다
  • 컨테이너가 잘 생성되서 실행 중인 것을 확인할 수 있다

컨테이너 ID list 출력하기

#!/usr/bin/python3

import docker
client=docker.from_env()

for ctn in client.containers.list():
    print(ctn.id)
  • 위와 같이 작성하고, 실행하자
  • 잘 출력된다

이미지 ID list 출력하기

#!/usr/bin/python3

import docker
client=docker.from_env()

for ctn in client.images.list():    
    print(ctn.id)
  • 위와 같이 작성하면 된다
  • 잘 출력된다
profile
멋진 엔지니어가 될 때까지

0개의 댓글