2015.03.10 16:23

아쉽지만 docker는 실행중인 컨테이너에 실시간으로 포트를 오픈하는 기능을 제공하지는 않는다. 


아래와 같은 방법들로 다시 시작해야 한다.


1. 컨테이너의 변경 사항이 없다면.. stop 후 docker run에 -p 옵션을 추가하여 실행하면 될 것이다.


2. 컨테이너의 변경 사항이 있다면 docker commit를 사용해서 변경된 내용이 적용된 컨테이너를 만들어서 -p 옵션으로 재실행한다. 


docker stop running_container

docker commit running_container new_container

docker run -p newport:newport new_container


저작자 표시 비영리 동일 조건 변경 허락
신고
2015.03.10 12:00

docker는 컨테이너를 실행하면서 컨테이너의 가상 디바이스에 RFC 1918 에 기술된 내용에 따라 private 영역의, 임의의 IP를 할당한다.


masquerading rule (표현이 재밌네 ^^)에 따라 할당한다고 하는데 상세한 건 "이 문서" 를 참고 바람.


어쨌든 중요한 건 ,host server에서 임의로 설정하기 때문에 이렇게 주어진 IP는 외부에서 알 수 없다.


container에 포함된 각종 어플리케이션에서는, 자신의 IP를 얻어와서 외부의 container 혹은 솔루션에 알려주어도 외부에서는 해당 컨테이너로 접근할 수 없다.


외부에서 container 자신에게 접속하게 하려면 (routable ip address를 사용하는) host 서버의 IP주소와 docker run 시 -p 옵션을 통해 호스트와 자신이 오픈하려는 포트를 매핑할 때 기술했던 호스트 서버의 Port를 전달해야만 한다. 하지만 host 서버의 IP 주소를 알아오는 방법은 수동으로 전달하지 않는 한, 존재하지 않는다.


이런 문제점을 해결하기 위해서는 routable ip address 할당이 필요하다.



일단 container에 할당된 IP를 알아보자. 


host 서버에서는 inspect 로 확인 가능하다.

docker inspect [container name] | grep IPAddress


(IP값만 딱!! 뽑아보기)

docker inspect [container name] | grep IPAddress | awk '{print $2}' | tr -d '",n'


혹은 exec를 사용해 운영중인 컨테이너로 접속해서 확인도 가능하다. 

docker exec -it [container name] bash

ifconfig


가장 간단한 방법은 docker run 시 --net=host라고 지정하는 것이다. 이 옵션을 사용하면 실행될 컨테이너의 eth0 interface에는 host의 eth0가 매핑된다. 간단한 서비스의 경우 큰 문제는 없지만, 같은 IP가 두개인 서버가 생기는 것과 유사한 문제가 발생할 수 있으니 주의가 필요하다. 물론 상황에 따라 유용할 수 있으니 알아두자.

(* 이곳 에서 --net=host로 검색하면 쉽게 내용을 찾아 볼 수 있다.)


두번째로는 dhcp 서버를 세팅하여 사용하는 방법이다. 이 글을 처음 쓸 때 이 부분을 정리하기 위해 작성을 시작했으나 회사 사정으로 dhcp 서버를 구성하려면 별도 스위치 장비를 활용해 기존 네트웍에서 분리를 해야 한다는 답변을 들었다. (c class 부족으로 늘리려면 회사 전체적으로 네트웍 설정을 바꿔야 한다고 한다. OTL ~~)


그래서 가장 잘 설명된 사이트 링크로 대체한다. "이곳"과 "저곳" 을 참고하실.. 나도 나중에 참고해서 다시 이 부분을 갱신해야 겠다. 


또다른 방법으로는 "pipework" 를 사용한 방법이 있다. 


글이 어째 용두사미가 되버렸네. dhcp 서버 딱 막히는 순간부터 맥 빠져버렸네. ㅠ_ㅜ






저작자 표시 비영리 동일 조건 변경 허락
신고
2015.02.10 16:41

(ubuntu 기준)


/etc/init.d/docker 의 DOCKER_OPTS에 --insecure-registry 정보를 추가하라고 되어 있는 안내가 있던데, 해보니 안됨. 


/etc/default/docker 파일을 열어 아래와 같이 추가 후 docker를 다시 시작하면 됨.


DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=localhost:5000" 


음.. 어차피 같은 옵션 처리일텐데 왜 안되지. /etc/init.d/docker에 추가할 때 문법이 틀린거였나?? 알송달송...

저작자 표시 비영리 동일 조건 변경 허락
신고
2015.01.29 12:02

최종 확인!! 아래와  같이 하면됨.


실행은 아래와 같이 한다.

 sudo docker run -d \

 --name redis \

 -p 6379:6379 \

 -v /data_redis:/data:rw \                           => 데이타를 이곳으로 넣을 거야

 -v /data_redis/redis.conf:/etc/redis/redis.conf \ => conf 파일은 로컬에 있는 파일로 연동

 redis:2.8.19 redis-server /etc/redis/redis.conf    => 실행할 때 내가 지정한 conf로 실행


 그리고 redis.conf는 기본 정보에서.. 

log 옵션을 찾아 /data 로 수정하면 됨.


이상!!



=======================================================

== 아래는 이전에 잘 안되었던 경험. ==

redis-server를 실행할 때 conf 파일을 지정하지 않은 경우,


rdb 파일이 생성되는 곳은 redis-server를 실행한 경로에 생성된다. 


그래서 .. redis.conf안에 dir 옵션에 경로를 지정해서 실행하는 것을 추천한다.


docker에서 redis를 실행할 때... CMD나 ENTRYPOINT에 옵션으로 /etc/redis/redis.conf를 지정해도 되며, 가동 후 수정해서 재시작해도 됨.


docker로 만들 때는 아래와 같이 dockerfile을 만들어야 합니다.


CMD ["redis-server","/etc/redis/redis.conf"]

  (* entrypoint도 마찬가지.. )


이렇게 하면 서버 실행할 때 redis.conf 파일 적용해서 실행됨. 실행될 줄 알았는데 만들어지긴 하지만 실행은 안됨.


내가 어떤걸 잘못한건진 잘 모르겠지만.. ㅠ_ㅜ


일단 run 할 때 커멘드로 입력해 보았다. 

   X  접근 권한 문제로 conf 파일 리딩 불가 에러 발생.


그냥 redis-server만 실행. docker logs redis 로 보니 역시 config 파일 없이 실행되었음을 경고하는 문구 있음.


redis-cli 실행해서 CONFIG SET dir = /data 실행하니 적용된 듯. 어??!!!


run 할 때 -v 옵션으로 /data_redis:/data로 지정한 상태라.. 


redis-cli 에서 save 후 나와서 /data_redis에 보니 dump.rdb 보이네.


헐.. 된장. 


음.. 왜 cmd 옵션이 처음부터 잘 적용이 안되는 거지 -- 


이거 안되면 이미지 교체할 때 rdb 파일 공유 하려면 손 많이 타는데.. T-T


해외 커뮤니티 보니 다들 되는듯 하던데.. 


docker도 최신 버전으로 업데이트 했는데 --a 


어렵다. 자동으로 되야 사람 손을 안 타도 될텐데 -- 고칫덩이네... 쩝.!!










저작자 표시 비영리 동일 조건 변경 허락
신고
2015.01.29 11:06

최신 버전이 안받아져서 git에서 다운받아 빌드 시도.


폴더 하나 만들고.. (예..  docker_src)


들어가서 git init 입력.


git clone https://github.com/docker/docker.git


하면 다운 받아짐. 해당 폴더에서 make 하면 빌드 시작.


빌드가 완료되면 docker_src/bundles/1.4.1-dev/binary에 빌드된 파일이 생성됨.


/usr/bin으로 빌드된 파일 이동.


ln -sf /usr/bin/docker-1.4.1-dev /usr/bin/docker  로 대체.


docker version 실행하면 클라이언트 버전은 바뀌었지만, 서버 버전이 안바뀐 것을 확인할 수 있다. 


아쉽게 아래와 같은 에러가 발생함.


FATA[0000] Error response from daemon: client and server don't have same version (client : 1.17, server: 1.12)


docker를 다시 가동해야 함. 일단 기존에 가동중인 docker server를 중지

sudo service docker.io stop

/usr/bin/docker.io를 백업해두고 /usr/bin/docker-1.4.1-dev 를 /usr/bin/docker.io로 변경한다.

그리고 ln -sf /usr/bin/docker.io /usr/bin/docker 를 실행 

이제 서비스를 다시 가동한다.

sudo service docker.io start

다시 docker version을 실행하면 클라, 서버의 버전이 모두 바뀐 것을 확인할 수 있다. 

(* exec 커멘드가 필요해서 해봤음.)




저작자 표시 비영리 동일 조건 변경 허락
신고


티스토리 툴바