Programming/OS, Program, Framework Tip

macOS - AMD Hackintosh 에서 Docker 돌리기 새로운 방법

awesometic 2022. 4. 6. 12:02
반응형

원래는 docker-machine을 사용해서 VirtualBox 백엔드로 Docker를 사용할 수 있었습니다만, 사실 docker-machine 은 2019년 deprecated 되어서 2022년 현재는 더 이상 사용할 수 없는 방법이 되었습니다.

 

GitHub - docker/machine: Machine management for a container-centric world

Machine management for a container-centric world. Contribute to docker/machine development by creating an account on GitHub.

github.com

저도 제 Hackintosh 에서 Docker 사용을 포기하고 있었는데 며칠 전 아래 Github Gist 에서 새로운 방법을 찾았습니다. :)

 

Docker and Docker Compose on AMD OSX Hackintosh via Docker Machine

Docker and Docker Compose on AMD OSX Hackintosh via Docker Machine - docker-compose-hackintosh.md

gist.github.com

이 글은 위 Gist 댓글 중 jakoritarleite 님께서 올리신 내용을 기반으로 작성하겠습니다.


Kubernetes의 minikube를 사용하는데, minikube는 Kubernetes 클러스터를 쉽게 설정해주는 프로그램입니다.

로컬 Kubernetes 클러스터를 설정할 때 minikube 옵션으로 가상화 드라이버를 VirtualBox로 설정하는 방법입니다.

Docker CLI 가 minikube가 생성한 Kubernetes 클러스터를 사용하게 함으로써 Docker를 사용할 수 있도록 하는 것 같습니다.

일단 macOS 의 HomeBrew 를 사용해 minikube와 docker, docker-compose를 설치해줍니다. docker-compose는 사용하지 않으시면 설치하지 않으셔도 됩니다.

brew install minikube docker docker-compose

VirtualBox가 설치되어 있지 않다면 마찬가지로 brew로 설치해주셔도 됩니다.

brew install virtualbox

그리고 minikube로 VirtualBox를 사용하는 Kubernetes 클러스터를 하나 만들어줍니다.

minikube start --driver=virtualbox --keep-context

아래 스크린샷은 재실행했을 때의 모습입니다.

마지막으로 Docker CLI 에서 minikube의 환경을 사용하도록 아래 명령어를 입력합니다.

eval $(minikube docker-env)

이제 Docker 명령어를 입력해보시면 잘 작동하는 것을 보실 수 있습니다.

이미 여러 개의 Docker container 가 돌고 있는데, kubernetes 클러스터에서 필요로 하는 컨테이너들인 걸로 보입니다. 무시하고 사용하면 될 듯 합니다.


근데 몇 가지 문제가 있습니다. 쉽게 쉽게 가진 않네요 :)

 

  • localhost 사용 불가

VirtualBox 내에서 돌고 있기 때문에 Docker 컨테이너의 IP로 접근할 때 localhost가 먹지 않습니다. 이 문제는 /etc/hosts 에 minikube로 부터 얻은 IP 를 등록해서 해결할 수 있습니다.

$ minikube ip
192.168.59.100

출력되는 IP를 아래와 같이 /etc/hosts 맨 마지막 줄에 minikube란 이름으로 등록해주세요.

$ cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost

192.168.59.100  minikube

이제 Docker 컨테이너에 접근할 때 localhost 대신 minikube로 사용하시면 됩니다. 만약 3000번 포트를 사용하는 컨테이너가 있다고 친다면, 아래와 같이 접근하면 되겠죠.

http://minikube:3000

 

  • mount 사용 불가

Docker 이미지를 사용할 때 많은 경우 호스트의 디렉토리를  Docker 컨테이너 내 디렉토리와 바인딩해야 합니다. 근데 위와 같은 경우 이 mount가 기존에 사용하던 방식대로 바로 작동하진 않습니다.

만약 아래와 같이 docker-compose를 작성한다면,

version: "2.1"
services:
  mariadb:
    image: lscr.io/linuxserver/mariadb
    container_name: mariadb
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=awesometic
      - TZ=Asia/Seoul
      - MYSQL_DATABASE=awesometic
      - MYSQL_USER=awesometic
      - MYSQL_PASSWORD=awesometic
    volumes:
      - /Users/awesometic/Docker/mariadb:/config
    ports:
      - 3306:3306
    restart: unless-stopped
docker-compose up

아래와 같이 호스트와 바인딩된 /config 디렉토리에 대한 권한 문제로 에러가 납니다.

LinuxServer.io 의 MariaDB 이미지인데, 직접적인 권한 얘기는 없지만 InnoDB 서비스가 O_DIRECT 플래그를 파일에 쓸 수 없다고 하고 있죠.

그래서 우린 컨테이너에 사용되길 원하는 mount point를 minikube에 먼저 마운트해줘야 합니다.

제 경우 /Users/awesometic/Docker/volumes 라는 디렉토리를 만들어 사용해볼게요. 이 디렉토리를 minikube를 통해 Kubernetes 클러스터 내 /docker-volumes 디렉토리로 마운트해보겠습니다.

minikube mount /Users/awesometic/Docker/volumes:/docker-volumes

성공적으로 마운트가 되었으면, 이 창을 닫지 않고 둬야 합니다. terminate 시키거나 창을 닫으면 마운트가 다시 해제됩니다.

이 상태에서 위에 작성했던 docker-compose.yml 을 수정해 다시 적용해볼게요.

volumes 에 작성했던 항목을 호스트가 Kubernetes 클러스터 내 마운트된 /docker-volumes 디렉토리를 사용하도록 하면 됩니다.

이러면, Host -> Kubernetes Cluster -> Docker Container 순으로 두 번 타서 가게 됩니다.

version: "2.1"
services:
  mariadb:
    image: lscr.io/linuxserver/mariadb
    container_name: mariadb
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=awesometic
      - TZ=Asia/Seoul
      - MYSQL_DATABASE=awesometic
      - MYSQL_USER=awesometic
      - MYSQL_PASSWORD=awesometic
    volumes:
      - /docker-volumes/mariadb:/config
    ports:
      - 3306:3306
    restart: unless-stopped
docker-compose up

다시 로그를 보면 이번엔 에러 없이 잘 작동하는 것을 볼 수 있습니다. ... 사실 MariaDB 컨테이너를 한 번 더 재실행 해줘야 잘 됐는데, 이유는 잘 모르겠습니다. 이 이미지의 버그일까요? 어쨋든 잘 작동해서 다행입니다. :)

왼쪽은 MariaDB 컨테이너의 로그, 오른쪽은 열어뒀던 minikube mount 의 로그입니다. mount된 디렉토리의 변화가 감지될 때 마다 로그가 작성되는 것을 볼 수 있네요.

당연히, 호스트 내에서도 컨테이너의 파일들을 온전히 볼 수 있고, Docker 컨테이너에 들어가 MySQL 콘솔을 열 수도 있습니다.

또, 물론, MariaDB 의 경우 기본 포트인 3306 포트를 통해 DBMS를 사용할 수도 있습니다. localhost가 아닌 hosts에 등록한 minikube로요.

 

  • 재부팅 할 때마다 모두 새로 설정해야 함

이게 꽤 귀찮은 문제입니다. 매번 minikube로 Kubernetes 클러스터를 실행시켜 줘야 하고, 매번 eval로 Docker CLI 환경을 맞춰줘야 하며, 매번 minikube로 mount 해줘야 합니다.

이 부분은 각자의 방법으로 불편함을 해소할 수 있다고 생각합니다. 저는 쉘 스크립트를 하나 만들어 사용해보려고 합니다. 리눅스였으면 차라리 더 쉬웠을텐데, 맥에선 가장 바람직한 방법이 어떤 건지 잘 모르겠네요.


AMD Hackintosh에서 Docker를 쓰는게 이렇게 많은 부분에서 불편하긴 합니다.

근데 그나마도 가능하다는 점이 전 참 좋네요. 여전히 램 많고 용량 많은 리얼맥은 너무 비싸요. :)

반응형