[Docker] 컨테이너 내에서 외부 호스트의 API 이용하기 Computer Tip

오랫만에 글을 올립니다.
이번에는 같이 일을 하고 있는 동료가 요청한 내용인데
필요에 따라 도커 이미지를 미리 다 만들어 놓은 상태에서
컨테이너를 새롭게 더 띄우거나 하는 것을 외부에서가 아니라
내부 컨테이너에서 해야 하는 필요가 생겼습니다.

해당 내용을 리서치하고 우분투 서버 20.04에서 
테스트해 보았습니다.

다음은 그 내용입니다.

우선 결론적으로 다음과 같은 docker-compose.yaml 을 만들었습니다.

version: "3.1"
services:
  my-service:
    image: python:3.8-buster
    container_name: pydocker
    environment:
      - DOCKER_HOST=tcp://docker-socket-proxy:2375
    command: sleep 10000
  docker-socket-proxy:
    image: tecnativa/docker-socket-proxy
    environment:
      - AUTH=1
      - POST=1
      - SECRETS=1
      - IMAGES=1
      - SERVICES=1
      - TASKS=1
      - NODES=1
      - CONTAINERS=1
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock

위의 내용 중에서 docker-socket-proxy 라는 컨테이너가 외부 호스트의 중계 역할을
하는 것입니다.

보안에 따라 여러 기능으로 동작을 제어할 수 있습니다.

일반적으로 바로 이용하게 되면 내부 컨테이너 중에서 마음대로
외부 docker를 조종하여 문제가 발생할 소지가 크기 때문에
그 부분을 많이 신경써야 하지만 다 인지하고 있다고 가정합니다.

위에서 my-service는 pydocker 라는 컨테이너 이름으로 실행되고 
python docker SDK 를 이용하여 호스트의 docker를 구동시켜 보려 합니다.

나중에 ubuntu 이미지가 필요한데 
미리 설치해 놓습니다.

docker pull ubuntu

그 다음,
docker-compose up -d
으로 컨테이너를 돌리고,

다음의 명령으로 pydocker 컨테이너에 접속해서 테스트해 봅니다.

docker exec -it pydocker bash
와 같이 pydocker 컨테이너에 bash를 띄워,

pip install docker
로 docker SDK를 설치하고,

python
을 구동시켜,

>>> import docker
>>> client = docker.from_env()
>>> client.containers.run("ubuntu", "echo hello world")
'hello world\n'

위와 같이 테스트 해 보면 잘 되는 것을 알 수 있었습니다.

필요에 따라 pydocker를 원하는 파이썬 Backend 동작을 하도록 하고,
해당 내용으로 이미지를 만들어 이용하면 될 것 같습니다.


어느 분께는 도움이 되셨기를 ..



덧글

댓글 입력 영역

구글애드텍스트