Docker 컨테이너의 GUI를 Mac 쪽으로 건너뛰어 표시합니다.

3514 단어 DockerMac
vvfb, 머리 없는 docker 컨테이너에서 Selenium 실행 가능로 바뀌었지만 정말 실행되었나요, 아직 믿을 수 없어요...!
오랜만에 docker 용기 안에서 Selenium의 실행 화면이 맥 옆의 X로 날아갈 수 있을지 모르겠습니다.
시간이 많은 문제를 해결한 것 같아서 이런 방법의 비결이 여기저기 떨어졌다.
  • Docker Issue: how to use -e DISPLAY flag on osx? #8710
  • How to get a GUI to a Docker Container on OS X
  • Qiita: docker에서 mac로 GUI 응용 프로그램 시작하기
  • 조금 어리둥절했지만 지난번에 사용했던 것과 같은 테스트가 맥에서 실시됐다고 나와 그 노트가 됐다.

    당신은 실제로 무엇을 하고 있습니까?


    실제로 무엇을 하고 있는지 잘 모르기 때문에 공부도 함께 쓴다.
    절차는 다음과 같다.
  • 명령행 도구 "socat"추가
  • Xquartz 설치
  • 기본 &brew install 표준에 들어가지 않았기 때문에 카스트로 설치
  • X11의 환경을 조정한 후 socat TCP-LISTEN...그런 다음 포트 6000에서 대기(X용 포트)
  • docker run에서 환경 변수(DISPLAY)를 전달하고 GUI 응용 프로그램을 시작합니다.
  • Mac의 X 서버에 용기 옆에서 시작하는 응용 프로그램을 그려 주십시오
  • Mac의 터미널 처리는 "docker에서 Mac로 GUI 응용 프로그램 시작하기" 의 글에서 보듯이 이렇다.
    brew install socat
    brew install caskroom/cask/brew-cask
    brew cask install xquartz
    open -a XQuartz
    
    # socatを起動すると、そのまま待ち状態になるので、別ターミナルへ
    socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
    
    # 別ターミナルから、docker run実施。この時に、環境変数DISPLAYを指定。
    docker run -e DISPLAY=192.168.99.1:0 <GUIの入ったイメージ> <実行したいコマンド>
    
    상기 주의점은 -e DISPLAY=xxx에서 docker가 네트워크로 보는 Mac 측의 IP 주소를 지정하는 것입니다.
    ifconfig는 얻을 수 있기 때문에 이 예에서 192.168.99.1이다.
    % ifconfig
    .....
    vboxnet3: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        ether 0a:00:27:00:00:03
        inet 192.168.99.1 netmask 0xffffff00 broadcast 192.168.99.255
    

    얼른 일어나보세요!


    그럼 바로 실행합시다.
    며칠 전 만들어진 일본어 글씨체 입력이 인상적이어서 거기서 GUI 애플리케이션을 적절히 선택했다.(이번에는xbsh
    % docker run -it -e DISPLAY=192.168.99.1:0 --rm takano/protractor-webdriver-ja:1.0 xbsh
    
    잠시 후, Mac 측의 XQuartz가 시작되었고, xbsh 창이 표시됩니다.

    아이구!라는 느낌을 받았다.
    지난번에 쓴 두건의 프로트랙터 테스트도 xvfb 부분도 없이 프로트랙터로...명령을 내리면 크롬은 테스트를 수행하기 위해 Mac로 날아갈 것이다.

    좀 더 자세히


    이상, 하고 싶은 일은 여기서 마치겠습니다.
    모처럼의 기회인 만큼 무엇을 진행 중인지 다시 한번 확인해 보겠습니다.
    우선, socat은 일반적인 서버 간 통신 (포트 이용) 을 플러그인으로 변환할 수 있는 도구입니다.(맞아요. 잘 모르겠어요.)
    이걸로 docker 용기에서 docker 호스트를 통해 Mac port: 6000에 대한 요청을 Mac의 X용 플러그에 전달합니다.
    (exp. DISPLAY=/private/tmp/com.apple.launchd.GLgekQSd9H/org.macosforge.xquartz:0)
    Mac에서 tcpdump까지 위의 화면처럼 GUI 응용 프로그램이 시작될 때port6000에서 docker 호스트를 통해 docker 용기에서 시작하는 그림 그리기 통신이 발생합니다.

    제대로 작동하지 않을 때?


    이 방법을 사용하면 Mac 포트 6000에 대한 입국 통신이 발생합니다.
    docker 컨테이너에서 GUI 애플리케이션을 시작하면 Mac 측면의 화면도 그려지지 않고 방화벽에 가려질 수 있습니다.
    바이러스 대책 소프트웨어와 보안 소프트웨어의 설정을 확인하세요.
    사실 저는 이렇습니다. "어?"이런 상황이 됐어요.

    좋은 웹페이지 즐겨찾기