# 將 Docker 的影像投影到 Mac 上 由於近日在 Mac 上執行 SDL2 的時候遇到一些問題,發現這問題是在 Mac 上才會有的,到 Linux 上反而就沒事了,因此我打算直接使用 Docker ,並且藉由 X11 把畫面投影在 Mac 上。 以下是我踩過很多坑之後得到的作法! ## Create a Docker container ```shell $ docker run ubuntu:18.04 $ docker ps -a ``` 你可以藉由第一個指令創建一個 ubuntu 18.04 的 container ,並且用第二個指令看到他的 container ID 。 ## Enter Docker terminal ```shell $ docker start {container ID} $ docker exec -it {container ID} /bin/bash ``` 第一個指令會執行一個 docker 的 container ,第二個指令會給你一個該 container 的 CLI 。 如果你對 `docker run` 和 `docker 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. ```shell $ docker run -it ubuntu:18.04 /bin/bash ``` 你甚至可以用這個指令直接創建並同時進入該 container 的 CLI 。 ## 安裝 X11 https://www.xquartz.org/ ```shell $ brew install --cask xquartz $ sudo reboot ``` 我使用 homebrew 去下載,下載完要記得 reboot ! 之後可以用 `command + space` 去點擊開啟 XQuartz ,或是任何方法都行啦,打開它就行了。 ![圖片](https://hackmd.io/_uploads/BkE2FzWm0.png) 你會看到這個可愛的小視窗就跑出來囉! ## 安裝 SDL2 因為我是要用 SDL2 ,所以我要載 SDL2 ,看你的需求,你也可能會用其他東西,反正這不是必要,這是給需要載 SDL2 的人看的。 ```shell $ 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 你就輸入 ```shell $ docker exec -it -e DISPLAY=host.docker.internal:0 {container ID} /bin/bash ``` 這樣代表你要在這個 container 中加入 DISPLAY 這個環境變數,如果你不這樣做,你其實也可以: ```shell $ docker exec -it {container ID} /bin/bash $ export DISPLAY=host.docker.internal:0 ``` 你可以直接進入 container 裡面 export DISPLAY 這個環境變數。 這邊順帶一提,你每一次進入 container 都必須這樣做,但如果你覺得這樣每次都要做很笨,你可以直接修改 container 的 .bashrc ```shell $ vim ~/.bashrc ## 修改 .bashrc ,在文件尾部加上 export DISPLAY=host.docker.internal:0 ``` 這麼一來每一次開啟他都會自動幫你 export DISPLAY 了喔! 好接著呢你到 XQuartz 裡面輸入: ```shell $ xhost +localhost ``` 最後你到你的 container 去執行你的 SDL 程式或是任何 GUI ,你就可以順利看到你可以在你的 Mac 上看到 container 的畫面了! 太開心了吧 ## Reference 1. https://gist.github.com/aaangeletakis/3187339a99f7786c25075d4d9c80fad5