원래는 docker-machine을 사용해서 VirtualBox 백엔드로 Docker를 사용할 수 있었습니다만, 사실 docker-machine 은 2019년 deprecated 되어서 2022년 현재는 더 이상 사용할 수 없는 방법이 되었습니다.
저도 제 Hackintosh 에서 Docker 사용을 포기하고 있었는데 며칠 전 아래 Github Gist 에서 새로운 방법을 찾았습니다. :)
이 글은 위 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를 쓰는게 이렇게 많은 부분에서 불편하긴 합니다.
근데 그나마도 가능하다는 점이 전 참 좋네요. 여전히 램 많고 용량 많은 리얼맥은 너무 비싸요. :)
'Programming > OS, Program, Framework Tip' 카테고리의 다른 글
Windows 11 - 윈도우 업데이트에서 드라이버 자동 업데이트 막기 (2) | 2022.11.01 |
---|---|
AMD 해킨토시에서 docker-machine으로 Docker 사용하기 (2) | 2021.03.25 |
Homebrew의 Apple Silicon (M1) 정식 지원 시작, 설치 방법 (0) | 2021.02.23 |
라이젠 3900X + 기가바이트 X570 어로스엘리트 EFI 깃허브 공유 (6) | 2021.01.11 |