회사에서 도커 및 k8s 환경을 올해 도입할 예정이라, 기존에 컨테이너 환경에서 작업을 해보지 않았던 사람들끼리 교재를 선정해 실습 스터디를 진행해보기로 하였다.
사내에서 사용중인 환경은 M1 맥을 사용하고 있고, 현재 유료 서비스로 전환된 도커데스크탑을 사용할 수 없어(소프트웨어 구매 신청은 하였지만 아직 승인이 되지 않은 상태이다..) 우선은 스터디 진행을 위해 colima를 이용하여 도커 및 쿠버네티스 환경을 마련하기로 하였다.
colima는 맥 환경에서 사용가능하도록 컨테이너 환경(Runtime)을 제공해주는 프로젝트인데, 시작시 나오는 메시지를 봐서는 내부적으로 QEMU를 이용하여 리눅스를 구동하고 있는 것으로 보인다. (깃허브 문서를 확인해보니 정확히는 Lima에서 동작하는 Containerd를 구현해놓은 프로젝트이고, Lima는 맥에서 리눅스를 운용하는 프로젝트로 보인다. 즉, QEMU 머신 자체는 lima에서, containerd 구동은 colima에서 담당하는 것으로 보인다)
기본적인 도커 사용법 스터디는 이전에 진행을 하였고, 이번에는 실습/모범사례 위주로 진행하는 스터디가 될 것으로 보인다.
앞으로 빠르게 스터디를 진행해서 팀 내에서 컨테이너 환경으로 이주할 때 원활하게 진행될 수 있도록 해야겠다.
새 컴퓨터의 경우 ARM환경의 Mac OS를 사용하고 있기 때문에 로컬 환경을 리눅스로 변경하기 힘든 상황이어서 (사실 변경하고자 하면 가능하지만 앱등이라서 굳이 애플 기기에 설치하고 싶지는 않았다) 가상환경에 리눅스를 올려서 도커를 설치해 사용하기로 하였다.
간단히 검색해 본 결과 리눅스를 올리기 위해 가장 적합한 가상머신의 경우 UTM으로 보여 UTM을 이용한 도커 환경을 구축하는 것으로 진행하였다.
UTM 가상환경에 우분투 설치
UTM에 올릴 리눅스 배포판은 Ubuntu를 이용하기로 하였다. Ubuntu를 지금까지 개인적으로 사용했었고, 윈도우 WSL 환경에서도 Ubuntu를 이용하고 있어 굳이 다른 배포판을 설치하지는 않았다.(회사에서는 서버용으로 CentOS를 사용하고 있긴 하지만…)
Ubuntu는 현재 기준(2023.01.08) 가장 최신의 LTS 버전(22.04.1 LTS)을 사용하였으며, 굳이 GUI 환경을 사용하지 않기에 Server 버전을 다운로드 받았다. (https://ubuntu.com/download/server)
리눅스 설치 중 설정은 전부 default로 진행하였고 ssh의 경우에만 별도 옵션 활성화를 통해 외부에서 ssh를 이용한 접속이 진행되도록 설정하였다.
또한 가상환경의 기본 네트워크 설정은 초기에 Shared Network로 되어있는데 이 경우 게스트OS와 호스트OS 간 통신이 가능하도록 VLAN을 구성하게 된다. 이 경우 게스트OS에 외부 접근이 되지 않으므로 Bridged 모드로 네트워크 모드를 변경하여 집에서 사용하는 LAN(공유기의 사설 네트워크)에서 주소를 할당받을 수 있도록 설정하였다. (네트워크 설정과 관련된 더 자세한 정보는 공식 문서를 참고. https://docs.getutm.app/settings-qemu/devices/network/network/)
Docker 설치
Ubuntu를 설치한 후 docker를 설치하였다.
이미 많은 사람들이 UTM환경에 도커를 설치하는 작업을 진행하였고, 공유된 문서들이 많아 해당 문서들을 참고하여 설치를 진행하였다.
다만, 참고한 문서의 경우 현재 사용할 수 없는 명령으로 이뤄진 부분이 있어 공식문서를 참고하여 해당 부분만 설치 명령어를 변경하였다. (https://docs.docker.com/engine/install/ubuntu/)
1) 도커 설치
sudo apt update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# Add docker's official GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# command to set up the repository
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# update apt package index
sudo apt update
# install the latest version of docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# (Optionally) verifying docker engine installation
sudo docker run hello-world
2) Docker Daemon의 Remote API 설정
sudo vim /lib/systemd/system/docker.service
ExecStart에 -H tcp://0.0.0.0:2375 옵션을 추가
3) HOST OS에서 원격 도커 접속 설정
환경변수 DOCKER_HOST에 게스트OS(우분투) 설정 (tcp://guest.ip.add.ress)
Docker 환경 테스트
게스트 OS에 도커를 설치한 후 원격으로 도커 엔진 제어가 정상적으로 이뤄지는지 가장 만만한 아파치(httpd) 컨테이너를 이용하여 확인하였다. Bridged 모드로 네트워크를 구성하고 외부에서 접속할 수 있도록 공유기에서 포트포워딩 설정을 해주었기에 공인IP를 통해서도 정상적으로 접속이 되는 것을 확인할 수 있었다.
부팅시 리눅스 이미지가 실행되도록 설정
이제 남은 것은 항상 리눅스 이미지가 실행될 수 있도록 설정하는 부분이다. 컴퓨터를 사용 중 굳이 UTM을 종료할 생각은 없어 부팅시에만 UTM 이미지가 실행만 되면 되는 상황으로 UTM의 실행을 자동화 하는 방법을 찾던 중 Automator를 이용하여 UTM을 부팅시 자동으로 실행하는 방법이 있어 그대로 적용하였다.