- daemon 설정 파일을 설정하여 원격지에서 remote Api 를 통해 명령을 전달하게 할 수 있다
- 기존에는 Go 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 를 기반으로 모니터링이 가능하다
#!/usr/bin/python3
import docker
client=docker.from_env()
print(client.containers.run("alpine", ["echo", "hello", "all"]))
- docker 패키지의 from_env 함수를 사용하면 docker 에 접속해서 명령을 전달할 수 있다
- alpine 은 불필요한 것을 모두 제거한 가벼운 linux 이다. 뒤에 [ ] 는 생성된 컨테이너에게 전달할 명령어이다
- 컨테이너 생성 및 실행 명령어는 containers.run 이다
docker login 하고, 파일에 실행 권한을 부여한 뒤, 스크립트 파일을 실행하자
생성된 명령 전달의 결과를 print 했으므로, 잘 출력된다
#!/usr/bin/python3
import docker
client=docker.from_env()
test=client.containers.run("nginx",detach=True)
print(test.id)
#!/usr/bin/python3
import docker
client=docker.from_env()
for ctn in client.containers.list():
print(ctn.id)
#!/usr/bin/python3
import docker
client=docker.from_env()
for ctn in client.images.list():
print(ctn.id)