Comment
Docker에 대한 개념을 잡아보자
Reference :
도커(Docker)와 가상머신(Virtual Machine) 비교
도커 컨테이너(Container)와 이미지(Image)란?
Docker vs. Virtual Machines
도커와 컨테이너의 이해(1/3) [!] 도커관련 명령어 등 잘 설명되어 있어서 추가 20231027
[+] Immutable : adj. 변경할 수 없는, 불변의
[+] Paradigm : n. 전형적인 예(양식), 패러다임, 실례
Immutable Infrastructure는 OS와 서비스환경(어플리케이션, 소스코드, 라이브러리 등의 서버에 설치하는 것들)들을 이미지화(실행파일화)하여 배포, 또한 가급적 변경하지 않는 어떤 불변하는 덩어리, 즉 인프라 개념
따라서 서비스 환경의 업데이트는 서비스 환경 자체를 변경하는 것이 아닌 다른 이미지로의 교체를 의미함
뭐 아직 위 그림을 정확하게 이해하기는 어렵지만 포인트는 Guest OS라는 것의 존재 유무. 도커(컨테이너)는 1개의 OS를 다수의 Application가 공유하는 반면 Virtual Machine은 각각의 Application이 각각의 OS를 보유한다는 점에 집중해보자
1개의 Host OS위에 Docker Engine을 설치하여 다수의 서비스, 즉 Application을 운영하는 형태. Application 단위의 Container에는 OS가 포함되어 있지 않으므로 상대적으로 가벼움
가상머신이란 1개의 서버를 다수개의 서버로 전환하는 개념으로 생성됨.
1개의 Host OS에서 다수의 Guest OS를 사용. 각 VM은 독립되어 있고 OS를 포함하므로 상대적으로 무거우나 보안성 측면에서는 좋음.
Docker는 서비스 환경,인프라 부분을 이미지(실행파일, 데몬이미지처럼?)화하여 가급적 변경하지 않고 사용한다.
(개인이 Docker를 통해서 본인만의 세팅된 개발환경을 '이미지화' 해놓는 관점에서의 사용 프로세스)
Dockerfile
을 작성하여 환경을 정의하고 Docker 이미지를 Build[+] 다른 사람 또는 다른 PC에서 (내가 만든) Docker 이미지를 통해 Build 및 컨테이너를 생성하면 그 PC, 즉 다른 사람 또는 다른 PC의 자원을 사용하는 것
[+] 내 PC에서 Docker 이미지 Build 이후 컨테이너를 생성하여 접근 Port등을 다른 사람에게 공유하면 내 PC의 자원을 사용하는 것
🔰 Docker Image vs Dockerfile
쉽게 말하면Dockerfile
은 Docker Image를 Build하는 파일이다. 따라서 도커 이미지를 공유할때 이미지 자체(Heavy함)를 공유할 수도 있지만Dockerfile
(Light함)을 공유하여 공유된 PC에서 도커 이미지를 Build할 수 있다.
[+] compose : com-
함께, pos-
두다, ~을 구성하다, 작곡하다, 활자로 짜다
Docker Compose는 여러 Docker 컨테이너를 정의, 실행, 관리할 수 있게 도와주는 도구. 주로 docker-compose.yml
파일을 통하여 서비스를 정의하고 여러 컨테이너를 실행함.
(쉽게 생각해서 1개의 이미지를 빌드하려면 Dockerfile, 여러개의 이미지 빌드 및 관리하려면 Docker Compose)
[+] 호스트 PC : 확실하진 않지만, Docker Container, Services, Project 단위를 개설한 PC라고 생각하면 된다 로컬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를 해야된다?
아래와 같은 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