Dev./Docker
[Docker] Docker API 사용
인쥭
2021. 5. 10. 17:49
반응형
참고:
1. 테스트 환경
- ec2 Instance 2 EA (ubuntu 18.04)
- docker version 20.10.2
- docker API version 1.41
- jq 1.5.1
2. docker.service 수정
- Instance IP 주소는 1.1.1.1, docker daemon용 포트는 33333으로 가정
- 다음과 같이 진행하여 기존 ExecStart를 주석처리하고 새 라인을 작성
root@ip-1-1-1-1:~# cd /lib/systemd/system
root@ip-1-1-1-1:/lib/systemd/system# ls docker*
docker.service docker.socket
root@ip-1-1-1-1:/lib/systemd/system# vi docker.service
# 생략
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 0.0.0.0:33333
# 후략
3. Docker daemon 재시작
- 재시작할 경우, 해당 인스턴스의 33333 포트로 Docker API에 접근이 가능하다.
root@ip-1-1-1-1:/lib/systemd/system# systemctl daemon-reload
root@ip-1-1-1-1:/lib/systemd/system# systemctl restart docker.service
root@ip-1-1-1-1:/lib/systemd/system# ps -ef | grep 33333
root 4315 1 0 16:39 ? 00:00:03 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 0.0.0.0:33333
root@ip-1-1-1-1:/lib/systemd/system# curl localhost:33333
{"message":"page not found"}
4. API Call
- 기본적으로 curl --silent localhost:33333, POST 메소드는 curl -X POST --silent localhost:33333으로 접근하였다.
a). docker ps
- 온갖 정보가 다 나오므로, 보안에 주의해야할 것으로 보임!
root@ip-1-1-1-1:/lib/systemd/system# curl --silent localhost:33333/containers/json | jq '.[0]'
{
"Id": "baed~~~",
# 너무 길어서 생략
b). docker ps -a
root@ip-1-1-1-1:/lib/systemd/system# curl --silent localhost:33333/containers/json?all=true | jq '.[0]'
{
"Id": "baed~~~",
# 너무 길어서 생략
c). docker stop
- POST 메소드를 사용한다.
root@ip-1-1-1-1:/lib/systemd/system# curl --silent localhost:33333/containers/baed3ac2c1f1709d37793295bb38948e6ce2b1b169ca049afb74901211eaa457/json | jq -r '.State.Status'
running
root@ip-1-1-1-1:/lib/systemd/system# curl -X POST --silent localhost:33333/containers/baed3ac2c1f1709d37793295bb38948e6ce2b1b169ca049afb74901211eaa457/stop | jq -r '.'
root@ip-1-1-1-1:/lib/systemd/system# curl --silent localhost:33333/containers/baed3ac2c1f1709d37793295bb38948e6ce2b1b169ca049afb74901211eaa457/json | jq -r '.State.Status'
exited
d). docker start
- POST 메소드를 사용한다.
root@ip-1-1-1-1:/lib/systemd/system# curl -X POST --silent localhost:33333/containers/baed3ac2c1f1709d37793295bb38948e6ce2b1b169ca049afb74901211eaa457/start | jq -r '.'
root@ip-1-1-1-1:/lib/systemd/system# curl --silent localhost:33333/containers/baed3ac2c1f1709d37793295bb38948e6ce2b1b169ca049afb74901211eaa457/json | jq -r '.State.Status'
running
root@ip-1-1-1-1:/lib/systemd/system# curl --silent localhost:33333/containers/baed3ac2c1f1709d37793295bb38948e6ce2b1b169ca049afb74901211eaa457/json | jq -r '.State.Health.Status'
healthy
5. docker 명령어를 통한 외부 호출
- docker -H [IP]:[PORT] [명령어]
- 보안 그룹으로 2.2.2.2 인스턴스로부터의 1.1.1.1:33333 접근이 허용되어 있는 것으로 간주한다.
ubuntu@ip-2-2-2-2:~$ docker -H 1.1.1.1:33333 ps
CONTAINER ID IMAGE
baed~~~ some_container~~~