Try   HackMD

將 Docker 的影像投影到 Mac 上

由於近日在 Mac 上執行 SDL2 的時候遇到一些問題,發現這問題是在 Mac 上才會有的,到 Linux 上反而就沒事了,因此我打算直接使用 Docker ,並且藉由 X11 把畫面投影在 Mac 上。
以下是我踩過很多坑之後得到的作法!

Create a Docker container

$ docker run ubuntu:18.04
$ docker ps -a

你可以藉由第一個指令創建一個 ubuntu 18.04 的 container ,並且用第二個指令看到他的 container ID 。

Enter Docker terminal

$ docker start {container ID}
$ docker exec -it {container ID} /bin/bash

第一個指令會執行一個 docker 的 container ,第二個指令會給你一個該 container 的 CLI 。

如果你對 docker rundocker exec 有疑問的話,他倆的解釋如下:
docker run creates a new container and optionally sets the initial command to run inside it.
docker exec is used for running additional commands inside existing containers.

$ docker run -it ubuntu:18.04 /bin/bash

你甚至可以用這個指令直接創建並同時進入該 container 的 CLI 。

安裝 X11

https://www.xquartz.org/

$ brew install --cask xquartz
$ sudo reboot

我使用 homebrew 去下載,下載完要記得 reboot !
之後可以用 command + space 去點擊開啟 XQuartz ,或是任何方法都行啦,打開它就行了。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

你會看到這個可愛的小視窗就跑出來囉!

安裝 SDL2

因為我是要用 SDL2 ,所以我要載 SDL2 ,看你的需求,你也可能會用其他東西,反正這不是必要,這是給需要載 SDL2 的人看的。

$ apt upgrade
$ apt install libsdl2-dev libsdl2-2.0-0 -y;
$ apt install libjpeg-dev libwebp-dev libtiff5-dev libsdl2-image-dev libsdl2-image-2.0-0 -y;
$ apt install libmikmod-dev libfishsound1-dev libsmpeg-dev liboggz2-dev libflac-dev libfluidsynth-dev libsdl2-mixer-dev libsdl2-mixer-2.0-0 -y;
$ apt install libfreetype6-dev libsdl2-ttf-dev libsdl2-ttf-2.0-0 -y;

Container Setup

由於這個 ubuntu 什麼都沒有,你要自己裝

$ apt install git vim wget unzip

Setup

接著到了重頭戲啦~~
這邊我搞超級久
但到最後發現挺簡單的
首先你先到你自己的 Terminal ,如果你還在 container 的 CLI ,你就輸入 exit 就可以退出了。
到了 Terminal 你就輸入

$ docker exec -it -e DISPLAY=host.docker.internal:0 {container ID} /bin/bash

這樣代表你要在這個 container 中加入 DISPLAY 這個環境變數,如果你不這樣做,你其實也可以:

$ docker exec -it {container ID} /bin/bash
$ export DISPLAY=host.docker.internal:0 

你可以直接進入 container 裡面 export DISPLAY 這個環境變數。
這邊順帶一提,你每一次進入 container 都必須這樣做,但如果你覺得這樣每次都要做很笨,你可以直接修改 container 的 .bashrc

$ vim ~/.bashrc
## 修改 .bashrc ,在文件尾部加上
export DISPLAY=host.docker.internal:0 

這麼一來每一次開啟他都會自動幫你 export DISPLAY 了喔!

好接著呢你到 XQuartz 裡面輸入:

$ xhost +localhost

最後你到你的 container 去執行你的 SDL 程式或是任何 GUI ,你就可以順利看到你可以在你的 Mac 上看到 container 的畫面了!
太開心了吧

Reference

  1. https://gist.github.com/aaangeletakis/3187339a99f7786c25075d4d9c80fad5