[Docker] 도커란? (+도커 세팅), Docker Compose
도커
윈도우에서 설정을 다 해놨는데 배포 서버는 우분투라면..
분명히 설정때문에 힘든 부분이 있을 것이다!
팀원들끼리도 다른 OS를 쓰거나, 설정이 다르다면
'이런 버그 어떻게 해결해요?'
그러한 문제를 막기 위해서 사람들이 이것저것 시도해보았다.
처음에는 Virtual Machine을 만들어서 돌렸는데 얘는 너무 무거웠다. OS위에서 OS를 돌렸더니...
그래서 경량화된 프로세스의 개념으로 도커를 만들게 되었다.
Virtual Machine보다는 가벼운 'Container'의 개념으로 이해하면 된다.
일종의 '템플릿'을 만들어서
어느 환경에서나 빠르고 동일하게 쓸 수 있게 했다.
Docker Image와 Docker Container
설치하기
GUI
도커 공식 홈페이지에서 운영체제에 맞는 Docker Desktop을 설치한다.
CLI
# step 1: apt-get 업데이트
sudo apt-get update
# step 2: 이전 버젼 제거
sudo apt-get remove docker docker-engine docker.io
# step 3: 도커(Docker) 설치
sudo apt install docker.io
# step 4: 도커 서비스 시작
sudo systemctl start docker
sudo systemctl enable docker
# step 5: 잘 설치 되어있는지 버젼 체크
docker --version
이미지 고르기 - Kaggle
그러던 중 Kaggle에서도 도커 이미지를 제공하고 있다는 것을 알게 되었고, CPU와 GPU 버젼 이렇게 나누어서 지원하고 있습니다.
제가 Kaggle 도커 이미지를 고른 이유는
- Xgboost, Catboost, Lightgbm등 Boosting 계열의 패키지를 지원합니다.
- XGboost의 경우는 GPU도 지원합니다. (요놈이 워낙 느려서 GPU 없이는 좀 힘듭니다ㅠ)
사실 많은 딥러닝 image는 Xgboost가 없는 경우도 많고 GPU 지원은 더더욱 찾기 힘들었습니다..
지금 시점으로는 Kaggle 도커가 좋은 선택지 같다라는 판단하에 Kaggle 도커로 설치를 진행하지만, 다른 더 좋은 도커 Image를 찾으셨다면 그 이미지로 설치를 진행하셔도 무방합니다.
# step 1: git pull (캐글 도커 이미지)
git clone https://github.com/Kaggle/docker-python.git
# step 2:
cd docker-python
# step 3:
# CPU 버젼
./build --use-cache
# GPU 버젼
./build --gpu --use-cache
# step 4:
# CPU 버젼 실행 테스트
docker run --rm -it kaggle/python-build /bin/bash
# GPU 버젼 실행 테스트
docker run --runtime nvidia --rm -it kaggle/python-gpu-build /bin/bash
# step 5 (GPU 버전 설치자만)
(container) $ nvidia-smi
step3에서 에러가 나는 경우
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
백그라운드에서 도커가 실행되고 있지 않기 때문에 에러가 발생한다!
> sudo dockerd
docker run ubuntu:18.04
ubuntu 이미지가 로컬에 있으면 가져오고, 없으면 새로 다운로드 받는다.
docker run -it ubuntu:18.04 /bin/bash
도커를 실행시키는 명령어. 잘 실행되는 것을 확인할 수 있다.
docker ps -a
도커 컨테이너의 목록을 볼 수 있다. docker ps는 실행중인 컨테이너만 보여주는데, ps -a 하면 실행중이지 않은 컨테이너들도 확인할 수 있다.
docker rename d084ced19cb8 "컨테이너 이름"
도커의 이름을 바꿔준다.
docker start "컨테이너 이름"
도커를 켜준다. 도커 exec를 해주기 전에는 켜준다고 커멘드 라인을 쓸 수 있는 것은 아니다.
docker exec -it "컨테이너 이름" /bin/bash
// -it : input output
SSH 접속하는 것과 유사함.
// 맥에서 도커로 복사
docker cp Downloads/cau15841-pintos-qemu osproj_final:yejin
// gcc 컴파일러 설치하기
apt update
sudo apt install build-essential gcc perl qemu
apt-get install vim
tar 압축 해제
Docker Image 만들기
코드를 쓰고
pip list --not-required --format=freeze
Dockerfile을 만든다.
FROM 이미지이름:태그
COPY 로컬디렉토리 컨테이너내디렉토리
WORKDIR /컨테이너내디렉토리
ENV PYTHONPATH=/컨테이너내디렉토리
ENV PYTHONUNBUFFERED=1
RUN "실행할 리눅스 명령어"
CMD ["실행할 명령어", "인자", ...]
docker build "도커파일경로"
Docker Compose: 여러개의 도커 함께 쓰기
도커 A: Database
도커 B: 웹 서비스 라면? 어떻게 두개를 동시에 실행할까?
Docker Compose를 사용해서 여러 컨테이너를 한번에 실행하고 실행 순서, 의존도를 관리할 수 있다.
docker-compose.yml 파일에 작성하면 된다.
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7.12
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: my_database
ports:
- 3306:3306
app:
build:
context: .
environment:
DB_URL: mysql+mysqldb://root:root@db:3306/my_database?charset=utf8mb4
ports:
- 8000:8000
depends_on:
- db
restart: always
실행
docker-compose up