Project/[약올림] Final Project

[Milestone 그 이후] Docker 개념 잡기 및 Quick Start

HJChung 2021. 1. 22. 11:04

학습시킨 딥러닝 모델을 docker를 활용한 tf서빙으로 배포하기 위해 docker에 대해 알아본 것을 정리하고자 한다. 

 

 

 

1. Docker란

애플리케이션은 하드웨어, OS, 미들웨어 등 인프라 환경에 민감하게 반응할 때가 많다.

특히 개발 환경과 테스트 환경에서는 동작을 잘 하다가 제품 환경에서는 동작하지 않는 경우도 있다. (실제 첫번째 프로젝트때 배포때문에 너무 많은 고생을 했다. 로컬환경에서는 되는데 왜 배포환경에서는 이런 저런 에러가 발생하지?! 싶은 일들..)

 

도커는 이미지를 이용해, 어느 환경에서든 '이미지'안에 적힌 내용을 그대로 실행시킬 수 있다.이미지' 안에 서버 세팅에 대한 모든것을 적어놓고, 그 이미지를 실행시키면 어딜 가던 '이미지' 안에 적힌 서버셋팅 환경을 도커가 만들어준다.

이미지? 컨테이너?

도커는 애플리케이션 뿐만 아니라 실행에 필요한 시스템 환경을 모아서 컨테이너(Container)로 관리해준다. 

도커 이미지로 만든 도커 컨테이너는 도커가 설치되니 곳이면 그 환경이 Windows 든, macOS 든, Linux 든, 온프레미스(On-premise) 든 클라우드든 상관 없이 동일하게 작동한다. 

 

참고한 한 블로그에서는 이미지를 붕어빵 도면, 컨테이너는 이 붕어빵 도면을 통해 만든 붕어빵 틀로 비유한다. 

그러면 이 붕어빵 틀로 만든 붕어빵들은 어떤 환경이든, 우리나라에서 만들어지든, 미국에서 만들어지든,.. 같은 규격으로 동일하게 만들어질 것이다. 

2. Docker의 기능

1) 이미지를 만드는 Build

도커는 애플리케이션 실행에 필요한 모든 파일을 모아서 도커 이미지로 만든다.

docker build -t  [이미지이름지정]  -f  [실행시킬도커파일]
# -t : 붕어빵 틀의 이름을 정한다.
# -f : 어떤 도면을 이용해 붕어빵 틀을 만들지를 정한다. 

#출처: https://miticoncrete.tistory.com/33?category=1058989

이처럼 명령어로 만들 수도 있지만 자동으로 빌드와 배포를 하는 CI/CD 환경에서는 도커 설정 파일(Dockerfile)을 이용해 자동으로 만들 수도 있다고 한다. (자동생성은 아직 감이 잘 되지 않는다. 해봐야 알 것 같다ㅠ)

 

2) 이미지를 가지고 컨테이너를 생성해서 동작시키는 Run

도커는 도커 이미지를 가지고 컨테이너를 생성해서 동작시킬 수 있다.

docker run -d -p [로컬port] : [dockerport] --volume=$(pwd):/app/ -t [실행시킬이미지이름]
# 붕어빵 틀이 실제로 작동할 수 있도록 전기를 연결시켜야 하고 이걸 run이라고 생각해보자. 
# - p : 붕어빵 틀을 처음 만들 때 계획한 전기 포트의 V와 다른 곳에서 만들 때의 전기포트 V를 일치시킨다
# --volume : 이 옵션을 이용하면, 붕어빵 틀에 어떤 변경이 생길 때마다 새로운 붕어빵 틀을 만들어 줄 필요가 없다. 
# $(pwd) : /app/: 내 로컬 상의 경로와 /app/의 경로를 똑같은 경로로서 도커 환경에서 인식시킨다는 소리이다.
# -t : 전기를 연결시킬 붕어빵 틀의 이름이 어떤 것인지 정해준다.

#출처: https://miticoncrete.tistory.com/33?category=1058989

3) 이미지를 공유하는 Ship

도커 이미지를 업로드해서 공유하는 저장소를 도커 레지스트리(Docker Registry)라고 하고, 대표적으로는 도커의 공식 레지스트리인 Docker Hub 가 있다. 여기서 Ubuntu 나 CentOS 같은 OS 이미지, MySQL, Redis, MongoDB, Nginx 와 같은 미들웨어, OpenJDK, Golang, NodeJS 와 같은 플랫폼 이미지등을 pull명령어로 받을 수 있다. 

또한 내가 만든 애플리케이션도 이미지로 만들어서 업로드하고 공유할 수 있다.

 

3. Docker 설치

참고) whitepaek.tistory.com/38

Docker Desktop for Mac - hub.docker.com/editions/community/docker-ce-desktop-mac

 

흐아아 짱 귀엽다ㅎㅎ

 

4. Docker 명령어

버전 확인  $ docker -v
docker hub에서 이미지 다운로드 ⭐️  $ docker pull [이미지 명]
docker hubdp 이미지 올리기 ⭐️  $ docker push [docker hub] [이미지 명]:[태그]
다운로드된 이미지 목록 확인  $ docker images
docker 이미지 삭제  $ docker rmi [이미지ID]
컨테이너 생성  $ docker create [옵션] [이미지 명]
컨테이너 생성 및 실행  $ docker run [옵션] [이미지 명]
컨테이너 실행  $ docker start [컨테이너 명]
컨테이너 재실행⭐️  $ docker restart [컨테이너 명]
컨테이너 접속  $ docker attach [컨테이너 명]
컨테이너 정지 ⭐️  $ docker stop [컨테이너 명]
실행중인 컨테이너 목록 ⭐️  $ docker ps
정지된 컨테이너 목록  $ docker ps -a
컨테이너 명 변경  $ docker rename [기존 컨테이너 명] [새로운 컨테이너 명]
컨테이너 삭제  $ docker rm [컨테이너 명]
컨테이너의 디스크 사용량을 나타냄  $ docker system df
컨테이너 터미널 진입  $ docker exec -it [컨테이너명] bash
컨테이너 log확인  $ docker logs -f [컨테이너명]

5. Download Image & Start Docker Container

nginx라는 웹서버를 가지고 docker를 시작해보자. 

1. https://hub.docker.com 회원가입을 하고 검색창에 필요한 것을 검색한다. 

 

 

2. 이제 nignx image를 다운로드 받아보자. 

#터미널
docker pull nignx

3. 그리고 잘 다운받아졌는지 docker image를 확인해보자. 

#터미널
docker image ls

4. 이제 다운받은 이미지를 기반으로 도커 컨테이너를 실행시킨다. 

#터미널
docker container run --name [컨테이너 이름] -d -p 80:80 nginx
# -d: background에서 계속 실행되게 하는 명령
# -p: 포트 번호 (nginx는 웹서버이기때문에 기본적으로 80port를 사용한다. 이 80port를 내 pc의 80port와 연결)

※ 이 외에도 많은 [옵션]들이 있다. 

 

5. 그후 docker ps를 쳐보면 

#터미널
docker ps

앞서 run 한 웹서버라는 컨테이너가 실행중인 것을 볼 수 있다. 

그리고 localhost:80으로 들어가면, 

 

 

잘 나온다 :))

 

1~3과 동일한 방법으로 ubuntu이미지를 pull 받고 아래와 같이 run을 하면

 

 

지금까지 Docker가 무엇인지 아주 간단하게 알아보았고,

설치를 해 보았고,

docker hub에서 이미지를 다운받고 컨테이너를 생성해서 동작시켜보았다. 

 

리눅스를 잘 모르니 도커에 조금만 가까이 다가가려고 해도 턱턱 막히는게 느껴진다..ㅠ, 몇 달전 교수님께서 시스템소프트웨어 수업을 수강하라고 할 때 말 잘 들을껄.. 하는 후회가 된다. ㅠㅠ....

 

다음에는 docker를 사용해서 tf서빙을 해보고, 

그 다음에는 클라우드 서비스인 GCP(Google Cloud Platform)를 이용해 VM 인스턴스를 생성 후 도커를 설치하고 tf서빙을 해보고자 한다.

 

개발에 있어서 공부와 삽질 그리고 교수님의 조언은 언제나 옳다. 또한 내 게으름은 언제나 옳지 않다. 🤨

 

 

reference

도커 Docker 기초 확실히 다지기

docs.docker.com/docker-for-mac/

miticoncrete.tistory.com/33?category=1058989