환경 : docker 1.12, host mac 


맥에서 docker container를 테스트할 수 있는 환경과 linux에서 동작하는 docker를 개발하고 있다.




docke의 /data/start.sh는 주로 데몬으로 사용하는데, 만약 이미지를 만드는 도중에 디버깅을 해야 하거나, push하기 전에 container로 띄워서 불필요한 내용을 정리해야 할 상황이 생길 수 있다. 그 때를 위한 예제이다.




먼저 centos를 기반으로 하고, 여러 애플리케이션이 들어가 있는 도커 이미지를 만들었다. 


$ docker build -t google-sandbox -f Dockerfile .



/data/start.sh 파일이 docker에 존재하지 않으면, docker run 커맨드로 실행을 시킬려면 에러가 발생한다.



$ docker run -i -t --name test google-sandbox /bin/bash

sh: /data/start.sh: No such file or directory




Dockerfile에 이렇게 추가해도. 실행이 되지 않는다. 즉 dummy script는 안된다.


RUN mkdir -p /data && touch /data/start.sh



그래서 docker 이미지에 /data/start.sh에 먼가 길게 동작하는 스크립트로 만든다.


RUN mkdir -p /data && echo $'#/bin/bash\n\
while true; do echo hello world; sleep 10000; done\n\
'\
> /data/start.sh


그리고, docker를 실행한다. 



(가장 중요한 부분은 -d 이다!!)

$  docker run --name test -d google-sandbox /bin/bash -c "echo 1"

ae5f0d3ec968f55c0893d68a23d9033f62471555aa0b65785af946cf86eeec44


$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

ae5f0d3ec968        google-sandbox       "/docker-entrypoint.s"   3 seconds ago       Up 2 seconds                            test



$ docker exec -i -t test /bin/bash

(docker 서버로 진입)

[root@ae5f0d3ec968 /]# ls -al

total 96

....


쉘을 종료했다가 나갔다가도 다시 들어올 수 있다.

$  docker exec -i -t google-sandbox1 /bin/bash
[root@ ae5f0d3ec968 /]#


로그를 보면 /data/start.sh가 실행하고 있음을 확인할 수 있다.


$ docker logs 컨테이너ID

hello world




참고로, 데몬(-d)를 주지 않으면 /data/start.sh의 실행 모드 이동되니. 쓰지 않도록 한다.


$ docker run -i -t --name google-sandbox google-sandbox /bin/bash

hello world

(대기)






참고 자료

https://docs.docker.com/engine/tutorials/dockerizing/

https://docs.docker.com/engine/reference/run/

https://docs.docker.com/v1.10/engine/quickstart/





참고로 테스트하면서 자주 만드는 명령어 추가.


* 사용하지 않는 docker 컨테이너 삭제하기


docker rm `docker ps -a -q`


Posted by '김용환'
,