Docker(도커)란 애플리케이션을 빠르게 구축/테스트/배포할 수 있는 소프트웨어 플랫폼이다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너 안에는 라이브러리, 코드, 런타임 등 소프트웨어 실행에 필요한 모든 것이 포함되어 있다.
나는 아래 영상을 보고 Docker의 전체적인 느낌과 개념을 이해했었다!
https://youtu.be/chnCcGCTyBg?si=YkKG9BFQ_lsHm4Go
지난 사이드 프로젝트에서 처음 도커를 접해보았는데... 세상에 이런 게 있구나 싶어서 놀라웠고... 파이썬 가상환경 (심지어 conda) 만 써오던 나에겐 신세계였다.
우선 파이썬 가상환경은 다른 PC와 공유가 어려웠지만, 도커는 이런 가상환경을 하나의 도커 파일로 만들 수 있기 때문에 설정을 공유하는데 드는 시간을 줄일 수 있다는 장점이 있었다.
또한 도커와 VM을 함께 비교해본다면, 도커의 컨테이너 구조는 위 그림처럼 따로 Host Operating System에 접근할 필요가 없기 때문에 컴퓨터의 물리적 시스템(메모리)을 좀 더 효율적으로 사용할 수 있게 된다.
하지만 좀 더 검색해보니... 도커의 가상환경은 실제 GPU와 연결될 수 없다고 한다. 윈도우 도커에서는 GPU 도커 이미지파일이 제공되지 않기 때문에 딥러닝 개발환경을 구축하는 데는 어려움이 있다. 하지만 리눅스에선 Nvdia-Docker를 사용해 관련 이미지들을 다운받을 수 있다고 한다. (근데 난 딥러닝은 안 하니까 그냥 계속 도커만 써도 될 듯...)
이런 도커의 장점을 업무에서도 활용해보고 싶어서 업무용 윈도우 노트북에 도커를 설치하고 Python과 PostgreSQL 컨테이너를 생성해보고자 한다.
1. 도커 설치
우선 윈도우에는 기본적으로 리눅스가 설치되어있지 않기 때문에 WSL (Linux용 Windows 하위 시스템) 을 설치해줘야 한다. WSL을 사용하면 Linux 배포판 (ex. Ubuntu, OpenSUSE, Kali, Debian, Arch Linux 등) 을 설치할 수 있으며 윈도우에서 직접 리눅스 애플리케이션, 유틸리티, Bash 명령어를 사용할 수 있다!
설치 과정은 아래 블로그를 참고하였다.
1) WSL 활성화
가장 먼저 윈도우 파워셸을 관리자 모드로 열어준 다음에 아래 명령어를 차례대로 실행해준다.
$ wsl --install
-- wsl 버전 기본값 2로 변경
$ wsl --set-default-version 2
WSL2로 리눅스나 우분투를 사용하고자 하는 경우엔 추가 설정이 필요하다. 하지만 도커만 설치하는 경우엔 요 두 명령어만으로도 충분하다.
설치를 마치면 위 사진과 같은 메시지가 등장한다.
2) Docker Desktop 설치
WSL 설치를 마쳤으면 아래 페이지에서 윈도우용 도커 설치 프로그램을 다운로드 받아준다.
https://www.docker.com/products/docker-desktop/
이렇게 설치된 도커 데스크탑 프로그램은 WSL2를 백엔드로 도커 엔진을 실행하게 된다.
2. Python 컨테이너 만들기
도커 설치 이후 가장 먼저 파이썬 컨테이너를 만들어줬다. 아까 설치한 도커 데스크탑 프로그램 안에서도 컨테이너 관리가 가능하지만 bash 명령어 공부를 목적으로 bash 쉘을 이용해 컨테이너를 만들어주었다.
방금 설치한 도커는 WSL, 즉 리눅스와 연결되어있기 때문에 파워셸이 아닌 linux를 열어 아래 명령어를 입력해주었다.
가장 먼저 도커에서 Python 이미지를 내려받아주었고..
docker pull python
그 이후 방금 다운로드 받은 Python 이미지를 사용해 새로운 컨테이너를 실행해주었다.
docker run -v //c/Users/sung0/Desktop/사용자경로:/app -it --name python python
여기서 막혔던 부분이 있었는데... 윈도우에선 도커의 볼륨 마운트 경로를 지정할 때, 경로 구분자로 역슬래시를 사용해야 한다. 하지만 도커는 -v 옵션에서 경로 구분자로 슬래시를 사용하기 때문에 평소처럼 폴더 경로를 그대로 복사해서 사용하면 오류가 발생한다.
만약 볼륨 지정에 계속 오류가 발생한다면
✅ 경로 구분자를 슬래시로 변경
✅ 윈도우 경로의 첫번째 문자가 'C:/' 일 경우 '//c/' 로 변경
위 두 가지를 다시 체크해보면 좋을 것 같다!!
이렇게 만들어진 파이썬 컨테이너는 VS Code 환경과도 연결시켜두었다. 이 과정은 윈도우 환경과 맥 환경이 동일하게 진행되었다.
3. PostgreSQL 컨테이너 생성
그리고 PostgreSQL 컨테이너를 생성해주었다.
docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=<비밀번호> -e TZ=Asia/Seoul -d postgres:latest
이렇게 컨테이너를 생성해주고 나서 별도의 옵션 설정 없이 docker exec 명령어를 사용해 컨테이너에 접근하게 된다면 root 계정으로 컨테이너에 들어오게 된다. 하지만 PostgreSQL는 일반적으로 root 계정이 아닌 다른 사용자 계정을 사용하여 접속하는 것을 추천하기 때문에 계정 생성, 데이터베이스 생성 등 여러가지 명령어에 제한이 걸리게 된다...
따라서 도커에서 PostgreSQL 컨테이너를 생성하면 기본적으로 만들어지는 사용자인 postgres를 사용하여 컨테이너에 접근해주는 게 좋다!
docker exec -it <컨테이너 이름 또는 ID> psql -U postgres
새로운 계정을 만들고 해당 계정의 권한을 설정해주었다.
--계정 생성
create role <계정명> with login password <비밀번호>;
--데이터베이스 생성 권한
alter user <계정명> with createdb;
--superuser 권한 설정
alter user <계정명> with superuser;
--특정 db에 대한 접근권한 부여
grant all privileges on database <DB명> to <계정명>;
아래부터는 나의 삽질 기록...ㅜㅜ
그리고 테스트용 데이터로는 PostgreSQL 공식에서 제공해주는 샘플 데이터베이스를 사용해보려고 한다.
PostgreSQL : DVD Rental Database
그리고 이 데이터를 PostgreSQL로 불러오기 위해 여러가지 방법을 사용해보았다...
1안) tar 파일 불러와서 pg_restore 명령어 사용해 테이블 추가
(→ 실패... Python의 psycopg2 패키지에선 해당 명령문이 실행이 안 되더라)
2안) 그럼 subprocess 패키지 불러온 뒤, subprocess.run(command)를 실행하면?
(→ 실패... 요 subprocess.run 함수를 tar 파일 내 테이블 개수만큼 반복해서 실행해줘야함 ㅜㅜㅋㅋㅋㅋㅋ 저는 자동화가 하고 싶은 건데요...? 😂)
3안) 그냥 도커 컨테이너 자체에서 pg_restore 명령어를 실행해주자 (→ 현재 진행 중!!)
(PostgreSQL 컨테이너 안에 tar 파일 복사해서 넣어주기 → exec로 pg_restore 명령어 실행)
업데이트 되는 내용은 계속해서 추가해보겠다...