ref)
https://labs.brandi.co.kr//2021/01/20/hwangsg.html
https://ldh-6019.tistory.com/146
https://blog.gangnamunni.com/post/docker-compose-for-local-env/
https://engineer-mole.tistory.com/221
https://zinirun.github.io/2020/08/15/how-to-use-docker/
https://velog.io/@corone_hi/Docker-%EB%8F%84%EC%BB%A4-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0
목차
1. Docker
1.1 Docker 정의
- 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼
- 컨테이너 안에는 다양한 프로그램, 실행 환경을 ‘컨테이너’라는 개념으로 추상화
- 클라우드, PC 등 어디서든 컨테이너를 실행할 수 있다.
1.2 도커의 발명 이유
- 환경설정의 불편함, 시간 낭비
- 새 서버를 세팅 시 config등의 구축환경을 다시 세팅
- 리눅스 버전이나 환경의 변화가 생기면 충돌이 일어나기 쉽상
- 한 서버에 다수의 프로그램을 설치하면 라이브러리, 포트 충돌을 고려한 설치가 굉장히 어려움
- 마이크로서비스 아키텍쳐, DevOps 등의 등장으로 서버 관리는 더 어려워졌다.
1.3 VM과의 차이
- VM : Operating System을 가상화(;전가상화 방식) -> CPU 가상화(;반가상화 방식)
- 무겁고 느리다.
- Docker : 프로세스 격리 방식(리눅스 컨테이너)
- CPU나 메모리 등의 자원을 프로세스가 필요한 만큼만 할당
- 필요하면 그때마다 추가적으로 할당
- 하나의 서버에 다수의 컨테이너를 독립적으로 실행가능
- 컨테이너에 접속하며 명령어 입력, 패키지 설치, 사용자 추가 등 모든 작업
- 컨테이너를 만드는 시간은 길어야 2초
- CPU나 메모리 등의 자원을 프로세스가 필요한 만큼만 할당
- 프로세스 격리 방식의 가상화 기술(LXC, Jail 등)이 원래 있었지만 성공하지는 못했다.
- 도커는 LXC를 기반으로 시작해서 이 후 자체적인 libcontainer 기술을 사용했고 runC 기술에 합쳐졌다.
2. 용어, 개념
2.1 Image
- 컨테이너 실행에 필요한 파일, 설정값을 모두 포함하고 있는 것.
- 이미지만 있다면 개발 환경 등의 구축을 위해서 이것저것 설치하고 설정할 필요가 없게 된다.
- 변하지 않는다.
- 도커 이미지는 Dockerhub에서 공유되고 있다(업로드, 다운로드)
- ex)
- CentOS 이미지 : CentOS를 실행하기 위한 모든 파일, 설정값을 가지고 있고,
- Tensorflow 이미지 : Tensorflow, Python, Jupyter 등 딥 러닝에 필요한 환경이 모두 들어가 있다.
2.2 Container
- 이미지를 실행한 것
- 이미지를 만들거나 받아서 호스트에 저장한 후 컨테이너로 run해서 프로세스로 만든다.
- 변한다 : 추가, 변화되는 값은 컨테이너에 저장된다.
- 같은 이미지로 다수의 컨테이너를 생성할 수 있다
- 새로운 서버가 추가되면 만들어 놓은 이미지를 다운받고 컨테이너만 생성하면 된다.
2.3 Layer
- 이미지는 여러 개의 읽기 전용 레이어(Read-only Layer)로 구성
- 파일에 변화(추가, 수정)가 생기면 새로운 레이어가 생성
- Union File System을 이용하여 다수의 레이어를 하나의 파일시스템으로 사용
- 이미지는 컨테이너 실행에 대한 모든 정보를 담고 있기 때문에 용량이 매우 크다.
- 이미지에 파일 하나를 추가했다고 다시 다운로드한다면 매우 비효율적
- ex) 기존의 이미지 레이어 위에 레이어가 추가되는 방식
- CentOS 이미지 = C1 + C2 레이어
- 이 이미지에서 nginx가 구동되는 환경의 이미지 레이어 = C1 + C2 + nginx
- Docker area(Backing Filesystem)
- 도커에서 관리되는 모든 레이어와 관련된 정보는 호스트의 파일 시스템 내의 /var/lib/docker 폴더에 저장
.
2.4 UFS(Union File System)
- 여러 개의 파일 시스템을 하나의 파일 시스템에 마운트 하는 기능
- 중복되는 파일이 있기 마련인데, 이 경우 나중에 마운트된 파일로 덮어쓴다(overlay).
- 도커 이미지에서 레이어는 개념적으로 각각의 파일 시스템을 겹쳐 놓은 형태와 유사하다.
.
3. 도커 사용하기
3.1 도커 설치
3.1.A 자동 설치 스크립트
sudo wget -qO- https://get.docker.com/ | sh
3.1.B 패키지 직접 설치(운영체제 마다 명령어 다름)
https://zinirun.github.io/2020/08/15/how-to-use-docker/
- Ubuntu
- CentOS7
- Mac
- Windows
3.2 이미지 구하기
3.2.A Docker-Hub에서 구하기(우분투 리눅스 이미지 받기)
- docker pull <이미지 이름>:<태그>
docker pull ubuntu:latest
3.2.A Dockerfile 통해서 이미지 직접 만들기
- Dockerfile을 파일화해서 관리하는 것이 버전 관리나 패키지 업데이트 등의 면에서도 우월
- commit을 사용해서 이미지를 생성하는 방법은
- 패키지 업데이트도 힘들고
- 버전 관리도 까다로움
- Dockerfile
- Docker 이미지 설정 파일이다.
- 이 파일에 설정된 내용대로 이미지를 생성한다.
- ex)모든 빌드와 관련된 파일들이 한 폴더(example)에서 처리하는 예제.
- example 디렉토리를 생성한 뒤 해당 디렉토리로 이동
- 모든 과정을 Dockerfile과 쉘 스크립트 파일로 통합
- build-run.sh 파일을 만들고 인자를 전달해서 실행
- = 이미지를 만들고 컨테이너로 run까지 one-click
mkdir example
cd example
FROM ubuntu:18.04
#set root password
RUN echo "root:ubuntu" | chpasswd
# install packages
RUN apt-get update \
&& apt-get install --yes --force-yes --no-install-recommends \
sudo \
software-properties-common \
xorg \
xserver-xorg \
xfce4 \
gnome-themes-standard \
gtk2-engines-pixbuf \
file-roller \
evince \
gpicview \
leafpad \
xfce4-whiskermenu-plugin \
ttf-ubuntu-font-family \
dbus-x11 \
vnc4server \
vim \
xfce4-terminal \
xrdp \
xorgxrdp
# add the user and designate sudo authority
RUN adduser ubuntu
RUN echo "ubuntu:ubuntu" | chpasswd
RUN echo "ubuntu ALL=(ALL:ALL) ALL" >> /etc/sudoers
#set the port number of xrdp
RUN sed -i 's/3389/port_number/' /etc/xrdp/xrdp.ini
#install xubuntu-desktop
RUN apt-get install --yes --force-yes --no-install-recommends \
xubuntu-desktop \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# insert entrypoint.sh and set ENTRYPOINT
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
#!/bin/bash
#edit the port number in Dockerfile
sed -i 's/port_number/'$1'/' ./Dockerfile
#start building image from Dockerfile
docker build -t $2 .
#run container from built image
docker container run -d -it --name $3 -p $1:$1 $2
docker container start $3
#return Dockerfile into first state
sed -i 's/'$1'/port_number/' ./Dockerfile
3.3 실행
- 실행되는 Container는 Host OS와 완전 격리된 공간
- docker run <옵션> <이미지 이름> <실행할 파일>
- ex) 이미지를 컨테이너로 생성 후 이미지 안의 /bin/bash를 실행
docker images
docker run -it --name hello ubuntu /bin/bash
3.3.A 명령어
- inspect : 이미지, 컨테이너 정보를 조회
- docker inspect <이미지 or 컨테이너 이름>
- 컨테이너에서 파일 복사하기
- docker cp <컨테이너 이름>:<경로> <호스트 경로>
- diff : 변경된 파일목록 출력
- docker diff <컨테이너 이름>
- commit : 변경 사항을 이미지로 저장
- docker commit <옵션> <컨테이너 이름> <이미지 이름>:<태그>
3.3.B 도커 컨테이너 연결하기
- 웹 서버, DB 등의 프로그램 별로 이미지를 생성 후 컨테이너화해서 연결
- nginx 웹 서버와 MongoDB의 이미지를 생성 후 연결하는 예시
- 80 포트는 host os에서 nginx 서버
docker run --name web -d -p 8888:80 --link db:db nginx
- -p 옵션은 호스트의 포트와 도커의 가상 포트를 연결한다.
- 8888 포트를 열어주어서 도커의 80 포트와 연결
- -p <Host Port>:<Docker Port>
- nginx 최신 이미지를 받고
- 실행한 db 컨테이너 mongoDB와 연결
- web 이라는 이름의 nginx 서버를 컨테이너로 실행
- IP를 통해서 브라우저로 접속할 경우 포트를 입력하지 않으면 80 포트로 자동 접속한다.
- nginx 서버를 그렇게 연결하고 싶다면 -p 80:80
- 브라우저로 <IP>:<호스트 연결 포트>로 접속하면 nginx 기본 페이지가 출력됨
- nginx 컨테이너는 mongoDB 컨테이너와 연결되어 있어서
- web 컨테이너 안에서 db:27017 주소로 db 컨테이너의 mongoDB에 접속할 수 있다.
4. Docker Compose
https://engineer-mole.tistory.com/221
- 여러 개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여, 관리를 간단히하는 기능
- compose 파일을 커맨드로 1회 실행하여, 파일의 설정을 읽어 모든 컨테이너 서비스를 실행
4.1 사용 : 크게 3가지 순서
- 각각의 컨테이너의 Dockerfile를 작성한다(기존에 있는 이미지를 사용하는 경우는 불필요)
- docker-compose.yml를 작성하고, 각각 독립된 컨테이너의 실행 정의를 실시한다(경우에 따라는 구축 정의도 포함).
- "docker-compose up" 커맨드를 실행하여 docker-compose.yml으로 정의한 컨테이너를 개시한다.
- Docker compose는 start, stop, status, 실행 중의 컨테이너의 로그 출력, 약간의 커맨드의 실행이과 같은 기능도 가지고 있다.
4.1.1 docker-compose.yml 파일이란
docker-compose.yml 파일은 아래와 같이 yaml으로 Docker 컨테이너에 관한 실행 옵션(build 옵션도 포함되어 있는 경우도 있다)를 기재한 파일이 된다.
docker build, docker run 커맨드 지정하는 것이 가능한 옵션이 되지만, Docker compose의 yaml 파일로써 기술하는 것으로 여러 개의 컨테이너로부터 만들어진 서비스를 조감하여 보는 것도 가능해져, 보존성의 수고를 가볍게 한다
4.1.2 Docker compose의 설치
4.1.3 Docker compose 파일의 작성
- node 어플리케이션
- redis의 어플리케이션
'Back' 카테고리의 다른 글
Airflow (0) | 2023.05.15 |
---|---|
GraphQL - 얄팍한 GraphQL과 Apollo(미완) (1) | 2023.01.05 |