Docker란?

Docker

Go 언어로 작성된 Linux container 기반으로 하는 오픈 소스 가상화 플랫폼

Docker 0.9 이상부터는 직접 개발한 libcontainer container 사용함

 

그렇다면 가상화를 왜?

컴퓨터의 성능을 더욱 효율적으로 사용하기 위해서 등장하였고, 사용하게 되었음.

 

Container란?

가상화 기술 중 하나로 대표적으로 LXC(Linux Container) 가 있음.

 

VM (Virtual Machine)

 

보안적 측면에서 유리하고, 완벽하게 Host OS와의 분리가 가능함. 하지만, Host OS의 메모리를 잡아먹는다는 단점이 있음.

 

Docker 가상화 플랫폼

 

Docker Engine 위에 Application 실행에 필요한 Binary만 올라가게 됨.

 

 

장점

  1. Host 커널을 공유하는 데 이렇게 되면 io (input / output) 처리가 쉽게 되어서 성능의 효율을 높일 수 있음
  2. 뛰어난 이식성
  3. 쉽게 Scale out을 할 수 있는 유연성
잠깐, 여기서 Scale out이란?
서버를 여러 대 추가하여 시스템을 확장하는 것.
여러 대로 나뉘기 때문에 각 서버에 걸리는 부하를 균등하게 해 주는 "Load 밸런싱" 이 필수적으로 동반됨.

 

즉, Container를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것,,

 

Docker Image

Container를 실행할 수 있는 실행 파일로, 설정 값들을 가지고 있는 것.

Image를 Container에 담고 실행을 시키면 해당 프로세스가 동작하게 됨.

 

Nginx란?
높은 안전성과 성능을 가지고 있고, 현재 가장 많이 사용되고 있는 Web Server.
대규모 Application 처리에 더 적합한 Server로, 추후에 포스팅하도록 하겠음.

 

Docker File

Docker Image 들을 저장하고 배포하는 Docker Hub는 정말 잘 활성화 되어 있음.

여러 회사들은 Software를 Docker Hub를 통해 배포하기 시작했고, Docker Hub에서 Image를 Pull 하여 간단하게 Container에 넣어 사용할 수 있음.

But, 보완하고 싶거나 배포판이 없는 경우 사용할 수 있는 것이 "Docker File"

 

Docker File이란 Image 생성 출발점으로, 이미지를 구성하기 위한 명령어들을 작성하여 Image를 구성할 수 있음.

Docker File을 읽을 수만 있다면 해당 Image가 어떻게 구성되어 있는지도 알 수 있음.

 

Container에 담을 파일들은 Dockerfile 하위 디렉터리에 있어야 하며, Dockerfile 안에서 ADD 시 절대경로는 사용 불가!

FROM jdk8:latest
    
WORKDIR /app

RUN mkdir /app/nexus-2.14.9-01
RUN mkdir /app/sonatype-work
RUN yum -y install httpd

ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.

EXPOSE 3411 
ADD run.sh /app/
           
CMD ["/app/run.sh"]

 

FROM : 기반이 되는 Image Layer로, <Image Name> : <Tag> 형식
MAINTAINER : 메인테이너 정보
RUN : Docker Image가 생성되기 전에 수행할 Shell 명령어
VOLUME : Directory 내용을 Container에 저장하지 않고 Host에 저장하도록 설정함. 데이터 볼륨을 Host의 특정 Directory와 연결하려면 docker run 명령에서 -v option을 사용하여야 함.
CMD : Container가 시작되었을 때 실행할 실행 파일 또는 Shell Script
WORKDIR : CMD에서 설정한 실행 파일이 실행될 Directory
EXPOSE : Host와 연결할 Port Number

 

.dockerignore

파일 생성 시, Docker Image 생성 시 Image 안에 들어가지 않을 파일을 지정할 수 있는 파일

$ Docker build -t [만들고 싶은 Image Name] # 반드시 Dockerfile 경로에서 입력해야 함

 

Docker Hub

Image를 저장하고 관리해 줌.

많은 회사들이 Docker로 Software를 배포하기 시작했고 공개 Image들을 공유할 수 있음

 

Docker Registry

Docker Hub처럼 공개된 방식이 아닌 비공개적으로 격리된 저장소를 구축할 수 있음

 

1. Make Open SSL

$ mkdir -p /data/certs
# -p option : 부모 directory가 없으면 자동으로 생성
=> 인증서와 Key file을 저장하기 위한 목적

$ openssl req \ 
# OpenSSL 명령어로 인증서 요청 생성
=> 주로 CSR (Certificate Signing Request) file을 생성하거나 자체 서명된 인증서를 발급할 때 사용됨.

  -newkey rsa:4096 -nodes -sha256 -keyout ~/data/certs/server.key \
# -newkey rsa : 4096 : 새 RSA Key를 생성하며, key 길이는 4096 bit로 설정
-> 4096 bit는 보안성이 높지만, 처리 속도는 조금 더 느릴 수 있음.
# -nodes : 비밀번호 없이 비암호화된 키를 생성
=> 기본적으로 OpenSSL은 개인 key에 암호를 설정할 수 있지만, 이 option은 암호화를 생략함.
# -sha256 : SHA-256 Hash Algorithm을 사용하여 인증서의 서명을 생성
=> SHA-1보다 더 강력한 보안성을 가짐
# -keyout ~/data/certs/server.key : 생성된 개인 키를 server.key file로 저장
  -x509 -days 36500 -out ~/data/certs/server.crt
  # -x509 : 자체 서명된 인증서를 생성하는데, CSR을 제출하여 인증 기관 (CA) 에서 서명 받는 대신 스스로
  인증서에 서명
  => 개발 환경이나 Test 용으로 자주 사용됨.
  # -days 36500 : 인증서의 유효 기간을 100년 (36500일) 으로 설정.
  => 일반적으로 인증서 유효 기간은 1 ~ 3년으로 설정됨.
  # -out ~/data/certs/server.crt : 생성된 인증서를 server.crt file으로 저장

 

2. Docker Registry에 접속할 장비를 설정

접속할 장비들에 server.crt 파일을 복사

$ mkdir -p /etc/docker/certs.d/docker-registry.khj93tistory.com
# /etc/docker/certs.d : docker가 registry의 인증서를 신뢰할 수 있도록 설정할 때 사용하는 경로

# docker-registry.khj93tistory.com : Docker가 이 레지스트리에 HTTPS를 통해 안전하게 연결할 수 있도록 준비

$ cp /data/certs/server.crt /etc/docker/certs.d/docker-registry.khj93tistory.com:5000/server.crt

# cp : 인증서 파일 복사
# /data/certs/server.crt : 이전에 생성된 자체 서명된 인증서 파일
# 복사 대상 경로 : Domain + port number (5000) 포함
=> Docker가 이 Registry (port 5000)과 HTTPS 연결 시 제공된 인증서를 신뢰하도록 설정

 

3. 접속할 장비들에 hosts 등록 (localhost일 경우 127.0.0.1)

$ vim /etc/hosts

# /etc/hosts : IP 주소와 호스트 이름 간의 매핑을 설정하는 시스템 파일로, 도메인 이름을 특정 IP 주소로 해석하도록 로컬 DNS 역할을 수행.
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 docker-registry.kh93tistory.com
# 외부 DNS를 거치지 않고도 이 Domain을 로컬에서 접근할 수 있게 함.
:wq!

 

 

4. Docker Registry Image Pull / Start

$ docker pull registry
# Docker Hub에서 Docker Registry 이미지를 다운로드
$ docker run -d -p 5000:5000 --restart=always --name docker-registry   -v /data/certs:/certs   -e 
#  Docker 컨테이너를 실행하는 명령어로, 특정 옵션을 통해 레지스트리를 설정
# -d: 컨테이너를 백그라운드에서 실행
# -p 5000:5000 : 호스트의 5000번 포트를 컨테이너의 5000번 포트에 바인딩,
외부에서 http://<host>:5000으로 접근 시, 컨테이너의 레지스트리 서버에 연결
# --restart=always : 컨테이너가 비정상 종료되거나 재부팅되더라도 자동으로 재시작
# --name docker-registry: 컨테이너 이름을 **docker-registry**로 설정
# -v /data/certs:/certs : 호스트의 /data/certs 디렉토리를 컨테이너의 /certs 디렉토리에 마운트
SSL 인증서와 키 파일을 컨테이너 내에서 사용할 수 있도록 공유
# 환경 변수 설정 (-e 옵션)
REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt   -e REGISTRY_HTTP_TLS_KEY=/certs/server.key   -v /data/certs/auth:/auth   -e "REGISTRY_AUTH=htpasswd"   -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"   -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd   registry
# REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt : SSL 통신에서 사용할 서버 인증서 경로
# REGISTRY_HTTP_TLS_KEY=/certs/server.key : SSL 통신에서 사용할 서버 키 경로
# -v /data/certs/auth:/auth : 호스트의 /data/certs/auth 디렉토리를 컨테이너의 /auth 디렉토리에 마운트
인증 정보를 저장할 디렉토리
# REGISTRY_AUTH=htpasswd : 레지스트리의 기본 인증 방식을 htpasswd로 설정
# REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" : 인증 영역(Realm) 이름을 **Registry Realm**으로 설정
# REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd : htpasswd 파일의 위치를 지정. 해당 파일은 사용자 이름과 암호를 포함하며, 기본 인증에 사용

=> Docker 실행 및 종료 명령어들은 script로 만들어 한 곳에 모아두면 손쉽게 start/stop이 가능!

 

5. Docker Registry Image Push

$ docker push docker-registry.kh93tistory.com:5000/[Image Name]:[tag]

 

 

Docker Architecture

'Data Engineer' 카테고리의 다른 글

빅데이터의 기초 지식  (3) 2024.12.19
FastAPI Post & Async Function  (4) 2024.11.24