그 외/Docker

[Docker] 도커란? (+도커 세팅), Docker Compose

SweetDev 2020. 4. 25. 19:14

도커 

윈도우에서 설정을 다 해놨는데 배포 서버는 우분투라면..

분명히 설정때문에 힘든 부분이 있을 것이다!

 

팀원들끼리도 다른 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 도커 이미지를 고른 이유는

  1. Xgboost, Catboost, Lightgbm등 Boosting 계열의 패키지를 지원합니다.
  2. 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