본문 바로가기

Codestates AI 부트캠프/4. Data Engineering

[데이터 엔지니어링] 3-1 Docker

1. Docker

윈도우 환경에서 애플리케이션을 개발해 완성했다. 이를 서버로 보내 배포하고자 하는데 서버는 리눅스다. 게다가 파이썬 버전 등 여러가지 환경이 맞지 않는다. 이 경우에 필요한 것이 docker다. 내가 만든 코드와 환경을 묶어서 docker image로 만들어 서버로 보낸다. 서버는 image를 받아서 container로서 활성화 시켜서 코드를 실행시킬 수 있다.

 

도커 공식문서 https://docs.docker.com/engine/reference/commandline/container_run/#options

 

docker container run

docker container run: See [docker run](run.md) for more information.

docs.docker.com

 

1-1 아나콘다 가상환경, 가상 머신과 다른 점은?

아나콘다 가상환경은 파이썬 라이브러리, 프레임워크 등의 설치와 버전 관리만 할 수 있다. OS는 관리할 수 없다. 반면 가상머신은 OS까지 관리할 수 있지만, 개별 OS를 탑재하고 있기에 아주 무겁다. 그래서 여러 가상머신을 운용하기란 쉽지 않다. 도커는 아나콘다보다 다양한 환경을 관리하고, 가상머신보다는 가볍다. 

 

1-2 도커파일 / 이미지 / 컨테이너 / 레지스트리

- 도커 파일

어플리케이션을 구동하기 위한 설명서. 파일, 프레임워크, 라이브러리, 환경변수, 구동 스크립트 등을 포함

 

- 이미지

실행을 위한 코드, 시스템 환경 등 실행에 필요한 모든 것이 포함되어 있다. 이렇게 만들어진 이미지는 변경이 불가능하다. 파이썬에서 클래스의 개념과 비슷. 이걸로 각각의 컨테이너를 찍어낼 수 있다.

 

- 컨테이너

샌드박스같은 개별적 환경에서 이미지를 이용하여 어플리케이션 구동한다. 이미지는 불변이지만 컨테이너는 수정 가능하다. 컨테이너에서 수정이 되어도 이미지에는 영향을 미치지 않는다.

 

- 레지스트리

도커 이미지를 보관하고 공유하는 곳. 퍼블릭과 프라이빗으로 나뉜다. 퍼블릭에는 도커 허브, 깃허브 패키지가 있다. 프라이빗으로는 AWS, GCP, Azure과 같은 클라우드 서비스가 있다. 대부분의 회사는 프라이빗 레지스트리를 이용한다. 

 

1-3 도커 이미지 사용 과정

① 도커 프로그램 실행

② 공유된 레지스트리에서 이미지를 당겨온다

③ 당겨온 이미지를 이용해 컨테이너 실행

 

 

 

2. docker 실행 (파워쉘, 아나콘다 프롬프트 등에서 실행)

- docker 프로그램 실행시킨 후 정상적으로 연결되었는지 확인

docker info


- image 불러오기
아래 예시 image는 docker hub에 저장된 것
이미지 주소 : '계정명/레포지토리:태그명'의 형태

docker image pull docker/whalesay:latest

 

- 이미지 목록 확인

docker image ls

 

- 불러온 이미지로 컨테이너 실행

'temp'라는 컨테이너명을 option으로 할당하여 컨테이너 실행하고 명령어 입력

# docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container run --name temp docker/whalesay:latest cowsay boo

 

- 컨테이너 리스트 확인
docker 프로그램 UI에서도 확인할 수 있다

docker container ps -a

 

- 컨테이너 중단

컨테이너 리스트에서 name을 확인할 수 있다

# docker container stop [컨테이너명]
docker container stop temp


- 컨테이너 삭제

이용이 끝난 컨테이너는 메모리를 잡아먹으므로 지우도록 하자. 이때, 컨테이너에서 exit된 상태여야 한다

# docker container rm [컨테이너명]
docker container rm temp

 

- 컨테이너 실행시킨 후 바로 삭제하기

docker contain run temp_2  --rm docker/whalesay cowsay boo

 

- 브라우저 통해서 컨테이너 실행시키기 (Flask app 등)

docker run -p 3000:3000 이미지주소 
# docker ps를 입력하면 컨테이너의 PORTS를 확인할 수 있다. PORTS에 따라 3000:80, 3000:5000 등으로 수정해 실행시키면 된다

 

- 로컬 파일을 컨테이너로 옮기기

만약 코드가 컨테이너에 없고 로컬에 저장되어 있다면? 하지만 컨테이너 환경을 통해 실행하고 싶다면?

# docker container cp [복사할 로컬 파일 경로] [컨테이너명]
docker container cp ./ mystifying_keller:

 

- 컨테이너 내의 파일을 로컬로 옮기기

# docker cp [컨테이너명:복사할 파일 경로] [옮겨올 로컬 경로]
docker cp my-container:/usr/local/apache2/queen_track .

 

 

 

[질문] *두개의 도커 컨테이너를 연결한다는 게 무슨 뜻일까?

 

두개의 독립적인 컨테이너를 함께 작동하도록 설정하는 것. 컨테이너 간 통신과 데이터 공유가 가능하다. 연결 방법에는 세가지가 있다.

 

도커 네트워크 : 도커는 네트워크를 생성할 수 있다. 두개 컨테이너를 하나의 네트워크에 연결해두면 통신이 가능해진다.

링크(Link) 설정 : --link 옵션을 사용하여 컨테이너를 링크시킬 수 있었습니다. 그러나 현재 버전의 도커에서는 비추

③ 도커 컴포즈(Docker Compose) 사용 : 도커 컴포즈는 여러 개의 도커 컨테이너를 정의하고 구성하기 위한 도구. 컴포즈 파일에서 컨테이너 간의 의존 관계와 연결을 정의할 수 있다.