리눅스/DCOS

DC/OS에서 서비스 배포 시 Docker run 옵션 사용

Seob 2019. 9. 25. 12:44
반응형

안녕하세요.

DC/OS에서 서비스 테스트를 할 때 Docker run 의 옵션 등이 필요하여 찾아보고 정리한 내용 입니다.

미리 mesos 혹은 marathon 을 사용해보신분들은 이미 알고 계셨을 내용이기도 합니다.

 

· 개요

DC/OS에서 구동되는 서비스에 추가적인 호스트 등록이 필요한 상황이였습니다.

 

이를 위해 Dockerfile 을 작성하고 아래와 같은 형식으로 도커 이미지를 빌드한 뒤 컨테이너 실행 할 때 /etc/hosts 파일이 초기화되어 의미가 없었습니다.

RUN echo 1.1.1.1 seob >> /etc/hosts

위와 같은 문제를 해결하기 위해서 CMD 를 어플리케이션 실행 명령이 아닌 스크립트를 구동하도록 변경했습니다.

· run.sh
cat /root/hosts >> /etc/hosts && java -jar service.jar

· Dockerfile
COPY hosts /root/hosts
COPY run.sh /root/run.sh
CMD bash run.sh

정상적으로 /etc/hosts 파일에 원하던 호스트 등록이 완료되었지만 진행하던 서비스(일부만)에서는 위와 같은 경우를 했을 때 문제가 발생했었습니다.

 

이렇게 구동된 컨테이너를 아래와 같이 명령어를 내렸을 때에도 반응은 없었습니다.

(정상적으로는 해당 컨테이너가 종료된 후 DC/OS에 의해 다시 구동이 되어야 합니다.)

docker kill -s=SIGINT <Container ID>

올바른 방법이 아니라고 판단했고 다른 방법을 찾아봤습니다.

 

· 문제 해결

DC/OS 대쉬보드에서 옵션을 아무리 찾아봤지만 해결되지 않았지만 아시는 것처럼 DC/OS은 컨테이너 오케스트레이션 플랫폼인 Marathon 기반으로 도커를 운영하고 있습니다.

 

서비스의 Json 을 구성 할 때 Marathon 형식을 그대로 사용하면 되는 겁니다.

 

: Docker run --add-host 명령어

$ docker run --help
Options:
      --add-host list                         Add a custom host-to-IP mapping (host:ip) (default [])

 

: DC/OS 서비스 Json 파일

{
  "id": "/seob",
  "backoffFactor": 1.15,
  "backoffSeconds": 1,
  "container": {
    "portMappings": [],
    "type": "DOCKER",
    "volumes": [],
    "docker": {
      "image": "nginx:latest",
      "forcePullImage": false,
      "privileged": false,
      "parameters": [
        {
          "key": "add-host",
          "value": "seob:1.1.1.1"
        }
      ]
    }
  },
  "cpus": 0.1,
  "disk": 0,
  "instances": 1,
  "maxLaunchDelaySeconds": 3600,
  "mem": 128,
  "gpus": 0,
  "networks": [
    {
      "mode": "container/bridge"
    }
  ],
  "requirePorts": false,
  "upgradeStrategy": {
    "maximumOverCapacity": 1,
    "minimumHealthCapacity": 1
  },
  "killSelection": "YOUNGEST_FIRST",
  "unreachableStrategy": {
    "inactiveAfterSeconds": 0,
    "expungeAfterSeconds": 0
  },
  "healthChecks": [],
  "fetch": [],
  "constraints": []
}

위에 보시는 것처럼 parameters 부분의 key 값을 옵션을 할당하고 value에는 옵션에 들어갈 내용을 작성하면 됩니다.

이렇게 작성하신 뒤 배포하시고 배포된 컨테이너를 확인하시면 정상적으로 --add-host 옵션을 사용한 것을 볼 수 있습니다.

$ docker exec -it 5da cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
1.1.1.1 seob
172.17.0.2      5da4cce1579a

 

간단한 테스트로 진행한 것이기 때문에 --add-host 외에 다른 옵션은 테스트 해보지 않았지만 형식만 제대로 갖추어 작성한다면 정상적으로 동작 할 껍니다.

반응형