[Docker] 개념

olxtar·2023년 3월 21일
0
post-thumbnail

Comment

Docker에 대한 개념을 잡아보자

Reference :
도커(Docker)와 가상머신(Virtual Machine) 비교
도커 컨테이너(Container)와 이미지(Image)란?
Docker vs. Virtual Machines
도커와 컨테이너의 이해(1/3) [!] 도커관련 명령어 등 잘 설명되어 있어서 추가 20231027




Docker?

[+] Immutable : adj. 변경할 수 없는, 불변의
[+] Paradigm : n. 전형적인 예(양식), 패러다임, 실례

  • 옛날에는 개개인들이 물리적인 서버를 직접 운영함
  • 호스팅 서비스가 생김 Reference : 호스팅 서비스란? \rightarrow 호스트 서버 구입 및 설치에 시간, 비용이 많이 듦
  • 가상화 \rightarrow 클라우드 환경 발전
  • 가상서버 임대
  • 가상서버의 수가 너무 많아지고 개인이 일일이 환경 세팅하기가 어려워짐
  • Immutable Infrastructure Paradigm 생김
  • \uparrow 대표적인 예가 Docker Container


Immutable Infrastructure는 OS와 서비스환경(어플리케이션, 소스코드, 라이브러리 등의 서버에 설치하는 것들)들을 이미지화(실행파일화)하여 배포, 또한 가급적 변경하지 않는 어떤 불변하는 덩어리, 즉 인프라 개념

따라서 서비스 환경의 업데이트는 서비스 환경 자체를 변경하는 것이 아닌 다른 이미지로의 교체를 의미함




Container vs Virtual Machine


\uparrow 뭐 아직 위 그림을 정확하게 이해하기는 어렵지만 포인트는 Guest OS라는 것의 존재 유무. 도커(컨테이너)는 1개의 OS를 다수의 Application가 공유하는 반면 Virtual Machine은 각각의 Application이 각각의 OS를 보유한다는 점에 집중해보자

1. Container

1개의 Host OS위에 Docker Engine을 설치하여 다수의 서비스, 즉 Application을 운영하는 형태. Application 단위의 Container에는 OS가 포함되어 있지 않으므로 상대적으로 가벼움


2. VM(Virtual Machine)

가상머신이란 1개의 서버를 다수개의 서버로 전환하는 개념으로 생성됨.
1개의 Host OS에서 다수의 Guest OS를 사용. 각 VM은 독립되어 있고 OS를 포함하므로 상대적으로 무거우나 보안성 측면에서는 좋음.






Container and Image

Docker는 서비스 환경,인프라 부분을 이미지(실행파일, 데몬이미지처럼?)화하여 가급적 변경하지 않고 사용한다.


✅ 도커 이미지(Docker Image)

  • 정의 : 도커 이미지는 컨테이너를 만들기 위한 '설계도''스냅샷'이다. 이 이미지에는 소프트웨어와 소프트웨어를 실행하는데 필요한 모든 것들이 들어가 있음. 즉 소스코드, 라이브러리, 세팅값등을 모두 가지고 있다.
  • 특징 : 이미지 자체는 실행되지 않는 '정적인 파일'이며 이미지를 통해서 다수개의 컨테이너를 만들 수 있음

✅ 도커 컨테이너(Docker Container)

  • 정의 : 컨테이너는 도커 이미지를 기반으로 실행 중인 '실제 애플리케이션'이며 이미지의 설계도에 따라 만들어진거임
  • 특징 : 컨테이너는 동적으로 실행중이게되며, 데이터와 상태를 가지고 있음. 따라서 실행되면서 상태가 변화할 수 있음. 종료하여도 메모리에서 삭제되지 않고 남아있으며, 삭제 시 해당 Container에서 생성된 파일들이 모두 삭제된다. (1개의 Docker Image로부터 생긴 각 Container들은 모두 독립적이다.)





Docker의 일반적인 사용

(개인이 Docker를 통해서 본인만의 세팅된 개발환경을 '이미지화' 해놓는 관점에서의 사용 프로세스)

  1. 개발 환경 설정 : 자신의 PC에 개발도구, 라이브러리 등을 설치하고 기타 설정을 한다.
  2. Docker 이미지 생성 : Dockerfile을 작성하여 환경을 정의하고 Docker 이미지를 Build
  3. Docker 컨테이너 실행 및 테스트
  4. Docker 이미지 공유 : 내가 만든 이미지를 Docker Hub 또는 개인 레지스트리에 Push하여 공유

[+] 다른 사람 또는 다른 PC에서 (내가 만든) Docker 이미지를 통해 Build 및 컨테이너를 생성하면 그 PC, 즉 다른 사람 또는 다른 PC의 자원을 사용하는 것
[+] 내 PC에서 Docker 이미지 Build 이후 컨테이너를 생성하여 접근 Port등을 다른 사람에게 공유하면 내 PC의 자원을 사용하는 것


🔰 Docker Image vs Dockerfile
쉽게 말하면 Dockerfile은 Docker Image를 Build하는 파일이다. 따라서 도커 이미지를 공유할때 이미지 자체(Heavy함)를 공유할 수도 있지만 Dockerfile(Light함)을 공유하여 공유된 PC에서 도커 이미지를 Build할 수 있다.






Docker Compose

[+] compose : com- 함께, pos- 두다, ~을 구성하다, 작곡하다, 활자로 짜다

Docker Compose는 여러 Docker 컨테이너를 정의, 실행, 관리할 수 있게 도와주는 도구. 주로 docker-compose.yml 파일을 통하여 서비스를 정의하고 여러 컨테이너를 실행함.
(쉽게 생각해서 1개의 이미지를 빌드하려면 Dockerfile, 여러개의 이미지 빌드 및 관리하려면 Docker Compose)

Docker Compose의 주요 개념

  1. 서비스 (Service) : 애플리케이션의 특정 기능을 수행하는 컨테이너의 정의, 예를 들어 ...
  2. 프로젝트 (Project) : 여러 개의 서비스로 구성된 애플리케이션 (= docker-compose.yml 단위?)
  3. 볼륨 (Volume) : 데이터의 영구 저장을 위해 사용되는 Docker Storage. 컨테이너가 재시작, 삭제되어도 데이터는 유지
    [!] 해당 Volume은 Docker Container 상에 위치하여
  4. 네트워크 (Network) : 서비스 간의 통신을 위한 가상 네트워크, Docker Compose는 기본적으로 프로젝트 별로 1개의 네트워크를 생성함


기타 용어 및 개념

[+] 호스트 PC : 확실하진 않지만, Docker Container, Services, Project 단위를 개설한 PC라고 생각하면 된다 \simeq 로컬PC
[+] 어느 호스트 PC에서 생성된 Docker Container 내의 디렉토리들은 (docker compose등으로 볼륨 연결을 하지 않으면) 호스트 PC와는 별개로 Container Volume으로만 관리된다. (이는 Container가 삭제되기 전까지 Docker Desktop을 통해서 확인할 수 있음, 즉 Docker Container 상에 떠있는 볼륨이라고 생각하면 됨)
[+] 호스트 PC와 Docker Container 간의 디렉토리를 연동, 즉 동기화도 가능하다. 아래 내용을 확인해보자

# docker-compose.yml 파일
name: 프로젝트 네임
services:
	olxtar_Services1:
    	image: 해당 서비스가 사용할 Docker Image
        container_name: 해당 서비스로 생성될 Container의 이름
        build:
        	context: .     
            # Docker Image가 따로 Build되어 있지 않고 Dockerfile만 존재(docker-compose.yml과 동일경로)한다면 이처럼 작성 시 Dockerfile을 참조하여 image를 빌드한다.
        ports:
        	- 8888:8888
        volumes:
        	# 해당 서비스 Container에서 사용 및 Docker Desktop에 저장될 볼륨을 정의
            - 볼륨명: Docker Volume으로 관리될 Container상의 디렉토리
            
            # 호스트PC 디렉토리 <-> Container상 디렉토리 동기화 하는 방법
        	- type: bind
              source: 호스트PC(docker-compose.yml이 존재하는 로컬PC)의 디렉토리 경로
              target: Container상의 디렉토리
        working_dir: 해당 서비스 Container 생성 시 working directory
        command: start-notebook.py --NotebookApp.token='my-token'
        # 컨테이너 시작 시 실행될 명령어로 Jupyter 이미지에 기본적으로 포함된 start-notebook.py를 실행, 즉 Jupyter Notebook 실행
        
	olxtar_Services2:
    	...
        
        
volumes:
	# 서비스 단에서 정의해준 volume을 여기에서 정의하여 '이름'등을 통해서 Docker Desktop - Volumes에서 관리 가능
    # 예를들어 olxtar_Services1 - volumes - '볼륨명'을 관리하고자 한다면...
    볼륨명:
    	name: olxtar_Services1_volume

[+] Docker Desktop, 즉 로컬에만 존재하는 이미지를 Docker Hub에 Push하려면 Tag를 해야된다?



예시를 통한 Docker 이해

아래와 같은 Dockerfile과 이미지 빌드, 컨테이너 실행 명령어 예시를 통해 Docker를 이해해보자

[Dockerfile]

FROM tensorflow/tensorflow:2.16.1-jupyter
# Docker Hub - 레포지토리에 존재하는 Tensorflow 기본이미지를 베이스 이미지로 가져온다

RUN pip install torch==2.2.1
# 해당 명령어를 실행; PyTorch 설치

RUN echo "default_pass" > /jupyter.pass
# jupyter.pass라는 파일을 만들면서 "default_pass"라는 문자열을 삽입함. 
# change_password.sh라는 파일을 통해 default_pass를 이용하여 Jupyter환경 접속 비밀번호를 세팅하기 위한 명령어임

COPY ./change_password.sh /root/.jupyter/change_password.sh
# (현재 Dockerfile이 위치한 디렉토리의) change_password.sh를 /root/.jupyter 경로로 복사

USER root

CMD ["/bin/bash","/root/.jupyter/change_password.sh"]
# 해당 Image를 통해 실행되는 Container 시작 시 Bash셀 실행 및 change_password.sh 실행

RUN mkdir -p /tf/areumict
# /tf/areumict 디렉토리 생성
# -p 명령어는 parents의 뜻으로 위 디렉토리 생성 시 /tf와 같은 상위디렉토리가 존재하지 않아도 생성해줘라라는 뜻

COPY ./sessions /tf/areumict/sessions
COPY ./code-logging /tf/areumict/code-logging
# (Dockerfile 위치 디렉토리 내) sessions, code-logging 디렉토리를 모두 복사함

🔰(Dockerfile 내 명령어에서의) CMD vs RUN

  • CMD : (해당 Dockerfile을 통해 빌드된 이미지를 통해 만들어지는 Container가 시작될때 실행되는 명령어
  • RUN : Image가 빌드될때 실행되는 명령어

ex)

FROM ubuntu:20.04

RUN apt-get update && apt-get install -y curl

CMD ["echo", "Hello, World!"]

Docker Image Build

sudo docker build -t areum/test_image:latest -f v1/cpu/Dockerfile v1/cpu/.

Docker Container Execution

docker run -itd \
-p 18888:8888 \
-v /home/ubuntu/workspace:/tf/ \
--name tf-server-cpu areum/test_image:latest \
/bin/bash /root/.jupyter/change_password.sh areumict01
profile
예술과 기술

0개의 댓글