DC/OS에서 서비스 배포 시 Docker run 옵션 사용
안녕하세요.
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 외에 다른 옵션은 테스트 해보지 않았지만 형식만 제대로 갖추어 작성한다면 정상적으로 동작 할 껍니다.