본문 바로가기

Server Development/Cloud

Docker Basic

 

 

 

도커 (Docker)

- 리눅스가 아닌 운영체제에서 리눅스 환경을 가상으로 구축하고 여러 애플리케이션을 설치하여 실행시키는 방법

- 운영체제의 의존도가 줄어든다.

- VM과 달리 운영체제 전체를 설치하는 것이 아닌 운영체제의 기능 일부분만을 가져와 사용한다.

 

 

" 예를 들자면, Docker의 컨테이너 서버에서 데이터를 저장시 명령을 호스트 운영체제의 리눅스 커널을 공유하며 명령을 하고 호스트 운영체제는 HDD 또는 SSD에 데이터를 저장한다. "

 

SSD : 플래시 메모리로 하드디스크와 같이 비화발성이지만 좀 더 빠른 고성능을 제공한다.  

 

 

특징

- 컨테이너 기반의 오픈소스 가상화 플랫폼

- 프로그램을 외부 환경과 격리시켜 구동 가능하게 해주는 플랫폼

- 서버 운영시 예를 들어, 서버를 구동하는 컴퓨터 위에 도커를 통해 가상 Linux 운영체제 환경을 만들고 그 안에 Mysql 등 필요한 자원을 연결해 사용하는 방식

- App이 동작하는데 있어서 필요한 요소들을 모아 별도의 서버처럼 동작하게 하는 것

 

 

동작

- 하나의 호스트와 여러개의 컨테이너들로 이루어짐

- 호스트의 Port와 사용하고자 하는 컨테이너의 Port를 연결해 원하는 동작 수행 (Port-Forwarding)

- 예시로 Apache 웹서버 컨테이너 이미지 생성 -> 컨테이너 실행 -> Host 연결시 해당 요청에 대해 해당 서버 실행해준다.

- 이 후, 컨테이너에 접속해 nano등의 명령어를 이용해 수정이 필요한 파일 수정도 가능하다.

- 하지만 매번 위와 같은 방법으로 수정하는 것은 어렵 -> 호스트에 파일들(html, java 등)을 넣어 파일 수정은 호스트에서 하고 서버 실행만 컨테이너에 맡기는 방식을 사용 -> 호스트(본인 또는 서버의 컴퓨터)의 파일시스템과 서버 컨테이너의 파일시스템을 연결시킨다.

 

 

 

장점

- 운영체제 전체를 설치하는 것이 아닌 운영체제의 주요 기술(커널 기술 등)을 일부분만 구성해 사용하는 개념이기에 오버헤드가 적다.

- 리눅스 OS를 기본적으로 사용하며 리눅스가 아닌 환경에서도 리눅스용 애플리케이션을 이용 가능하게 하는 장점을 가진다.

- 이미지 Layer를 여러 컨테이너가 공유하는 구조이기에 이미지 사용에 있어서 용량 사용이 적다. 

 

 

" VM 사용시 운영체제 생성, 메모리 분리, 하드 디스크 분리 등의 과정을 거치고 기존의 컴퓨터와 같이 부팅시 시간이 많이 소요되고 오버헤드도 크지만 도커 사용시 운영체제 전체를 설치하는 것이 아닌 리눅스 커널만 설치하고 실제 동작은 호스트 운영체제를 그대로 사용하고 메모리나 하드 디스크 분리도 없다. 따라서, 오버헤드가 적다. "

 

"또한, 서버에서 배포과정도 간소화 되는데, 예를 들어, VM에서 서버 버전 변경시 서버를 종료 후, 코드 수정하고 빌드 과정을 거쳐 새로운 버전을 적용하게 된다. 하지만 도커를 사용한다면 새로운 버전에 대한 이미지를 생성 후 이를 통해 컨테이너를 생성한다. 이 후, 기존의 버전을 가진 컨테이너는 종료하고 바로 새로운 버전의 컨테이너를 실행하면 된다. 또한, 기존 버전으로 복구시 컨테이너를 다시 복구하면 된다."

 

 

용어

도커 컨테이너 : 이미지 Layer + 컨테이너 Layer 

이미지 : 하나의 프로그램을 의미, 하나의 이미지로 여러개의 컨테이너 생성 가능

컨테이너 : 프로그램의 프로세스를 의미, 실행된 이미지

Docker Hub : 이미지를 다운받을 수 있는 Store

Host Operation System : 도커 컨테이너들이 설치된 운영체제, 환경

 

 

대표적인 명령어

- dokcer : 커맨드 리스트 출력

- docker container --help : 컨테이너 관련 커맨드 리스트 출력

- docker images : 도커의 이미지 리스트 출력

- docker pull 이미지: Docker Hub로부터 해당 이미지 다운로드

 

- docker run 이미지: 실행하고자 하는 이미지 실행(컨테이너화)

- docker run --name 이름 이미지 : 실행하고자 하는 이미지를 이름 지어서 실행(컨테이너 화)

- docker rmi 이미지 : 해당 이미지 삭제

 

- docker ps : 컨테이너 실행 목록 출력

- docker ps -a : 실행중이지 않은 컨테이너까지 출력

- docker stop 컨테이너 : 해당 컨테이너 종료, 이름이나 아이디를 통해 종료

- docker run 컨테이너 : 중지시켰던 컨테이너 재시작

- docker logs 컨테이너 : 해당 컨테이너의 로그 확인

- docker logs -f 컨테이너 : 해당 컨테이너의 로그 실시간 계속 확인

- docker rm 컨테이너 : 해당 컨테이너 삭제, 실행중인 컨테이너는 삭제 불가능

- docker rm --force 컨테이너 : 해당 컨테이너 실행중이여도 삭제

 

- docker run -p 포트번호:포트번호 컨테이너 : Host와 컨테이너의 포트를 연결해 해당 컨테이너 실행

- docker exec 컨테이너 명령어 : 해당 컨테이너 안에서 컨테이너 조작을 위해 특정 명령어(ls, pwd 등) 실행

- docker exec -it 컨테이너 /bin/sh : 해당 컨테이너 계속 접속 유지, exit로 탈출, /bin/bash 도 가능

(예를 들어, 서버 컨테이너 접속시 nano 등 설치, 경로 접속 등으로 특정 파일을 수정 가능하다.)

- docker run -p 포트번호:포트번호 -v ~컴퓨터파일경로:컨테이너파일경로 컨테이너명 : 해당 컨테이너의 파일 시스템과 호스트의 파일시스템을 연결해 수정시 같이 수정되게 설정

 

 

 

명령어 참조

https://docs.docker.com/engine/reference/run/

 

Docker run reference

 

docs.docker.com

 

 

 

Docker File

- 도커 이미지 생성을 위한 스크립트 파일로써 여러 키워드를 합쳐 제작하여 좀 더 빌드를 쉽게할 수 있다.

- From, Run, Add, Copy, Expose, Env, Cmd, Entrypoint, Workdir, Volume

- 과정 : 도커 파일 작성 -> 도커 파일 실행(docker build -t 이름 경로) -> 이미지 생성 됨 -> 이미지 실행(docker run) -> 컨테이너 생성 됨 

- 항상 파일이름은 Dockerfile임을 인지해야 함.

  • FROM : 베이스가 되는 이미지 설정을 하는 것으로, 예를 들어, Spring 서버 구축시 jdk 버전 입력
  • RUN : 이미지를 빌드할 떄 사용하는 커맨드를 설정하는 것으로, Spring 서버 구축시 mvn package 정도 입력
  • ADD : 이미지에 호스트의 파일이나 폴더를 추가하기 위한 키워드, 없다면 디렉토리 자동 생성
  • COPY : 이미지에 호스트의 파일이나 폴더를 복사하기 위한 키워드, ADD와 달리 URL 지정을 하지 않고 압출파일을 풀지 않음 예를들어, COPY 파일명 이미지내의경로 -> 해당 파일을 이미지에 복사
  • EXPOSE : 이미지가 통신에 사용할 포트를 지정
  • ENV : 환경 변수 설정
  • CMD : 도커 컨테이너가 실행될 때 실행할 커맨드를 설정하는 것으로, Spring 구축시 만들어진 jar를 실행할 것을 입력
  • ENTRYPOINT : 도커 이미지가 실행될 때 사용되는 기본 커맨드를 지정
  • WORKDIR : 커맨드 관련 명령어를 실행할 때(CMD, RUN, ENTRYPOINT 등) 베이스가 되는 호스트 파일이나 폴더 경로 지정
  • VOLUME : 영구 데이터를 저장할 경로 지정, 호스트의 디렉토리를 도커 컨테이너에 연결해 Spring을 예로 들면 도커 서버에 저장시 해당 경로에 저장, 휘발성이 아닌 데이터 저장시 사용

(+) layer : 이미지마다 존재하는 층으로 변경사항 및 추가사항을 의미.

 

 

 

 

Docker Compose File

- 도커 애플리케이션의 볼륨, 네트워크, 서비스 등의 설정을 yaml 형식으로 작성하는 파일

- version, services, network, volume, config, secret 존재

- 예를들어, 하나의 컨테이너에 여러 이미지를 구성할 때 사용, Spring을 예로 들면, 프론트엔드는 A이미지, 백엔드는 B이미지를 사용해 하나의 컨테이너를 생성해 실행하는 구조

- docker-compose up -d 명령어로 해당경로에 있는 docker-compose.yml 파일을 찾아서 실행  

 

예시

services:
    frontend:
    	image:이미지이름
  • image : 이미지 설정
  • build : 이미지 사용이 아닌 dockerfile의 경로를 지정해 빌드로 사용
  • dockerfile : 도커파일 설정시 Dockerfile로 정해야하는데 이름이 해당 이름이 아닐때 설정
  • ports, volumes, container_name, command, environment, env_file, depends_on, restart 등이 있음.

 

 

Dokcer Image

- 도커는 본인이 원하는 이미지 생성도 가능하다.

- 주로, 개발한 애플리케이션이 필요한 이미지들을 합쳐 새로운 이미지를 만드는 방식으로 서버 구축시 사용된다.

- 컨테이너를 이미지로 변경도 가능하고 이미지를 로컬에 저장도 가능하다.(docker save), 로컬에서 불러오는 것도 가능(docker load)

 

 

 

'Server Development > Cloud' 카테고리의 다른 글

Git Branch 전략  (0) 2023.09.27
Git Basic  (0) 2023.09.27
CI/CD  (0) 2023.07.10
Cloud - IaaS vs PaaS vs SaaS  (0) 2023.04.17