1. Docker
윈도우 환경에서 애플리케이션을 개발해 완성했다. 이를 서버로 보내 배포하고자 하는데 서버는 리눅스다. 게다가 파이썬 버전 등 여러가지 환경이 맞지 않는다. 이 경우에 필요한 것이 docker다. 내가 만든 코드와 환경을 묶어서 docker image로 만들어 서버로 보낸다. 서버는 image를 받아서 container로서 활성화 시켜서 코드를 실행시킬 수 있다.
도커 공식문서 https://docs.docker.com/engine/reference/commandline/container_run/#options
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) 사용 : 도커 컴포즈는 여러 개의 도커 컨테이너를 정의하고 구성하기 위한 도구. 컴포즈 파일에서 컨테이너 간의 의존 관계와 연결을 정의할 수 있다.
'Codestates AI 부트캠프 > 4. Data Engineering' 카테고리의 다른 글
[데이터 엔지니어링] 2-4. NoSQL (0) | 2023.06.03 |
---|---|
[데이터 엔지니어링] 2-3. API (0) | 2023.06.03 |
[데이터 엔지니어링] 2-2. Crawling (1) | 2023.06.03 |
[데이터 엔지니어링] 1-4 파이썬으로 DB 불러오기 (0) | 2023.05.26 |
[데이터 엔지니어링] 1-3 SQL(2) (0) | 2023.05.26 |