티스토리 뷰

맥/윈도에서도 도커를 쓰고 싶어요!!


겉으로 보이는 증상은 그렇지만, 기술적으로는 도커 호스트와 도커 클라이언트가 다른 머신인 상황이다.



이 유명한(?) 그림의 출처는 1989에 출간된 Total Quality Management인데, 지금도 개정판이 나온다능~ ㄷㄷㄷ

  1. 도커 호스트는 반드시 리눅스 머신이어야 하기 때문에, 맥/윈도에서는 별도의 진짜 리눅스 머신을 준비하던가, virtualboxvmware 등을 이용해서 가상의 리눅스 머신을 준비한다. boot2docker를 사용하면 간단하게 윈도/맥에서 virutalbox로 Tiny Core Linux 배포판을 사용하는 도커 호스트를 만들 수 있다.
  2. 도커 호스트에서는 도커 데몬이 tcp 소켓으로도 요청을 받도록(기본은 unix 도메인 소켓으로만 요청을 받음) 설정하고,
  3. 도커 클라이언트에서는 -H 옵션이나 DOCKER_HOST 환경 변수를 사용해서 tcp 소켓을 통해 도커 데몬에 요청을 보내도록 설정한다.
  4. 포트 매핑(-p), 볼륨 매핑(-v 옵션)을 사용할 때 주의하자.


boot2docker로 충분하다면... 이 글은 엄한 삽질일 뿐~ 안녕히 가세요~~ m(_ _)m


내 경우엔, 작고 가볍고 docker와 궁합이 잘맞는 CoreOS를 거금(!)을 주고 구입한 VMware Fusion에 올려서 도커 호스트로 쓰고 있어서 약간(?)의 삽질이 필요하다.


CoreOS를 한 문장으로 요약하면 LXC/docker/fleetd/etcd등을 활용하여 OS 수준에서 개별 서비스의 HA/LB를 지원하는 리눅스 배포판이다. CoreOS에 대해서는 다음에 따로 얘기할 기회가 있을랑가 없을랑가... 일단 넘어가자~


Step by Step: in Docker in CoreOS in VMware in MacOSX


이 부분은 처음 올렸던 삽질기를 좀 더 자세히 풀 어 쓴 것이니, 이미 봤고 이해했다면 스킵하시길~


이 글에서는 맥 osx(도커 클라이언트)와 CoreOS(도커 호스트)를 구분하기 위해 shell prompt를 각각 MACOSXCOREOS로 해두었다.


  1. CoreOS가 제공하는 VMware용 이미지 다운로드 & 설치 & 실행하고:
    MACOSX$ curl -LO http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vmware_insecure.zip
    MACOSX$ unzip coreos_production_vmware_insecure.zip
    MACOSX$ open coreos_production_vmware_insecure.vmx
    

참고: 2014.07.29 현재 CoreOS alpha는 docker 1.1.x, CoreOS beta는 docker 1.0.x 이다.

  1. CoreOS 콘솔(VMware의 vm 창)에 가서 (엔터 땅땅치면) 화면에 나오는 IP를 으로 확인하고:

    MACOSX$ ssh -i insecure_ssh_key core@192.168.xxx.xxx
    COREOS$
    
  2. 매번 -i insecure_ssh_key 하기 귀찮으면, 진짜 ssh key로 변경하고:

    MACOSX$ scp -i insecure_ssh_key ~/.ssh/id_rsa.pub core@192.168.xxx.xxx:/home/core/.ssh/authorized_keys
    MACOSX$ ssh core@192.168.xxx.xxx
    COREOS$
    
  3. 매번 IP로 접속하기 귀찮으면, /etc/hosts에 추가하고(이 글에서는 donald라는 이름을 붙였다):

    MACOSX$ cat >> /private/etc/hosts
    192.168.xxx.xxx donald
    ^D
    MACOSX$ dscacheutil -flushcache
    
  4. ssh로 접속해서, 남들 다하는 hello world 한 번 해보고:

    MACOSX$ ssh core@192.168.xxx.xxx
    COREOS$ docker run /bin/echo hello world
    Unable to find image 'ubuntu' locally
    Pulling repository ubuntu
    ba5877dc9bec: Download complete
    511136ea3c5a: Download complete
    ...
    2318d26665ef: Download complete
    hello world
    COREOS$
    

    처음에는 우분투 이미지 다운받느라 오래 걸림.

  5. 맥 터미널에서, 남들 다하는 hello world 한 번 해봤더니:

    MACOSX$ docker -H tcp://192.168.xxx.xxx:2375 run ubuntu /bin/echo hello world
    2014/07/24 14:04:07 Cannot connect to the Docker daemon. Is 'docker -d' running on this host?
    MACOSX$
    

    당근 안되겠지~ 나도 그 정도는 알아~~

  6. CoreOS의 docker 데몬이 tcp 요청을 받도록 설정하고:

    COREOS$ sudo sh -c "cat > /etc/systemd/system/docker-tcp.socket"
    [Unit]
    Description=Docker Socket for the API
    [Socket]
    ListenStream=2375
    BindIPv6Only=both
    Service=docker.service
    [Install]
    WantedBy=sockets.target
    ^D
    COREOS$ sudo systemctl enable docker-tcp.socket
    COREOS$ sudo systemctl stop docker
    COREOS$ sudo systemctl start docker-tcp.socket
    COREOS$ sudo systemctl start docker
    COREOS$ docker -H tcp://localhost:2375 run ubuntu /bin/echo hello world
    hello world
    COREOS$
    

    앞에서 우분투 이미지 다운받았다면 이번엔 금방 끝남.

  7. 다시 도전! 맥 터미널에서, 남들 다하는 hello world 한 번 해보면:

    MACOSX$ docker -H tcp://192.168.xxx.xxx:2375 run ubuntu /bin/echo hello world
    hello world
    MACOSX$
    
  8. 매번 -H tcp://192.168.xxx.xxx 하기 귀찮으면, DOCKER_HOST 환경변수 설정하고:

    MACOSX$ export DOCKER_HOST="tcp://192.168.xxx.xxx:2375"
    MACOSX$ docker run ubuntu /bin/echo hello world
    hello world
    MACOSX$
    


이 정도로 만족하고 그냥 쓰면 좋았을 것을...


VMware 창이 눈에 밟히네... Orz


터미널(CLI)에서 VMware 제어하기


그래서~~ 삽질을 조금 더 해 보았습니다~



참고: VMware가 제공하는 공식 문서 Using vmrun to Control Virtual Machines을 참조하시길...


  • 먼저, vmrun 명령 사용하기 편하게 링크

    $ ln -s /Applications/VMware Fusion.app/Contents/Library/vmrun /usr/local/bin/
    
  • 옵션없이 vmrun 명령을 실행하면 뻔한~ 도움말이 나온다:

    $ vmrun
    vmrun version 1.13.2 build-1887983
    Usage: vmrun [AUTHENTICATION-FLAGS] COMMAND [PARAMETERS]
    ...
    


vm 시작하고 종료하기

  • vm 시작

    $ vmrun start <path-to-vmx-file> [nogui|gui]
    
  • vm 종료|리셋|정지

    $ vmrun stop|rest|suspend <path-to-vmx-file> [soft|hard]
    


VMware의 guest IP 얻기


  • VMware Fusion 6 이상
$ vmrun getGuestIPAddress <path-to-vmx-file>

그러나...

  1. --> VMware guest(여기서는 CoreOS)에 VMware Tools를 설치해야하고...
  2. --> 커널 모듈을 컴파일해야 하고...
  3. --> 그럴려면 gcc를 깔아야 하고...
  4. --> 나는야 CoreOS?!
  5. --> 흠... 역시 CoreOS 커스텀 이미지를 만들어야 하는건가...
  6. --> 그건 리눅스에서만 할 수 있고...
  7. --> 리눅스를 설치해야...?!!
  8. --> 리눅스가 있으면 내가 이 삽질을 왜 하는겨?? -_-;;;
  9. --> 난 누구? 여긴 어디?

  • VMware Fusion 5 이하

$ grep ethernet0 <path-to-vmx-file>
...
ethernet0.connectionType = "hosted"
ethernet0.addressType = "generated"
ethernet0.address = "00:11:22:33:44:55"
ethernet0.generatedAddress = "00:11:22:33:44:55"
...
$ cat /var/db/vmware/vmnet-dhcpd-vmnet8.leases
...
lease 192.168.xxx.xxx {
...
  hardware ethernet 00:11:22:33:44:55;
...
}
...
  1. 눈을 크게 뜨고 찾아봅시다~
  2. --> 벌써 노안인가... 잘 안보여 ㅠㅠ
  3. --> 스크립트 짤까?
  4. --> 귀찮... -_-;;;
  5. --> 그냥 IP를 고정하자!


VMware의 guest MAC/IP 고정


  • guest가 NAT/DHCP 네트웍 어댑터 사용해야 함.

  • (가상 랜카드의) MAC 고정

    $ vi <path-to-vmx-file>
    ethernet0.connectionType = "nat"
    ethernet0.addressType = "static"
    ethernet0.address = "00:11:22:33:44:55"
    
  • (특정 MAC에 할당할) IP 고정

    $ vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf
    host dock {
      hardware ethernet 00:11:22:33:44:55;
      fixed-address 192.168.xxx.xxx;
    }
    $ sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --configure
    $ sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --stop
    $ sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --start
    


VMware의 NAT 설정


예: VMware host(mac osx)으로 8080을 VMware guest(coreos) 80으로 전달:

$ vi /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf
[incomingtcp]
8080 = 192.168.xxx.xxx:80
$ sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --configure
$ sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --stop
$ sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --start


(VMware와는 무관하지만) /etc/hosts 파일 설정

예: 192.168.xxx.xxx의 호스트 이름을 donald로 설정:

$ cat >> /private/etc/hosts
192.168.xxx.xxx donald
^D
$ dscacheutil -flushcache

이제라도 만족하고 그냥 쓰면 좋았을 것을...


개발 하는 동안 만이라도... 작업 파일들 한 군데 몰아놓으면 안되겠니??


도커 클라이언트(mac osx) + 도커 호스트(coreos on vmware) + 도커 컨테이너(maybe ubuntu?) 파일 공유하기


경고: 이제부턴 결론 없는 삽질이므로 심신이 약하거나 삽질알러지가 있는 분들은... 안녕히 가세요 m(_ _)m


그리고... 삽질은 계속된다...


도커 호스트 <---> 도커 컨테이너

  • 데이터 볼륨(이라고 쓰고 디스크라고 읽는다)을 사용하거나 볼륨 매핑 -v 옵션으로 해결.


이건 나중에 따로 설명할 기회가 있을라나 없을라나... 아무튼 굉장히 중요한 부분인데...


궁금하면 Docker 프로젝트가 제공하는 공식 문서 Managing Data in Containers를 참조하시길...


도커 호스트 <---> 도커 클라이언트

  • 리눅스에서 도커를 사용하는 경우라면 도커 호스트와 클라이언트가 같은 머신이라... 공유하고 나발이고 없음.

  • 내 경우에는 도커 호스트는 VMware 가상 머신에서 굴러가는 CoreOS(즉, VMware guest), 도커 클라이언트는 맥 OSX(즉 VMware host)라서 VMware가 제공하는 공유 폴더로 해결...하고 싶었지만...


VMware의 공유 폴더는 리눅스 guest에서 보면 vmhgfs고, 이걸 쓰려면...

  1. --> VMware guest에 VMware Tools를 설치해야하고...
  2. --> 커널 모듈을 컴파일해야 하고...
  3. --> 그럴려면 gcc를 깔아야 하고...
  4. --> 나는야 CoreOS?!
  5. --> 흠... 역시 CoreOS 커스텀 이미지를 만들어야 하는건가...
  6. --> 그건 리눅스에서만 할 수 있고...
  7. --> 리눅스를 설치해야...?!
  8. --> 리눅스가 있으면 내가 이 삽질을 왜 하는겨?? -_-;;;
  9. --> 이건 어디선가 본 것만 같은... Orz


일단, nfs나 sshfs 같은 네트웍 파일 시스템을 쓰면 되겠지만...


에... 속도도 안나오고...


에... 결정적으로 뽀대가...


(아... 이 움짤 꼭 한번 써먹고 싶었는데... 이런 허접한 데 쓰게 될 줄이야ㅠㅠ)


that's not all folks yet

저작자 표시 동일 조건 변경 허락
신고
Creative Commons License
댓글
댓글쓰기 폼