클라우드

02. 도커&쿠버네티스 - 2일차

akatjd 2023. 8. 29. 21:51

Container는 CPU를 나눠 쓰기에 CPU 할당도 효율적으로 할 수 있음.

 

커널이 없으니, 커널 파라미터 등 커널에서 관리하는 로우 레벨 디바이스를 컨테이너는 사용할 수 없음.

(로우레벨 설정을 못함.)

 

VM에 맞는 운영 환경일시 굳이 컨테이너 사용할 필요 없음. (관리 포인트 증가 및 장애 발생 확률 증가.)

 

hub.docker.com (가장 유명한 퍼블릭 레지스트리)

 

docker pull nginx

docker push IMAGE : 레지스트리에 이미지 업로드

docker run nginx

 -d : detach 모드 실행 (표준 출력을 사용하지 않는 모드. 이것도 없으면 표준 출력만 사용하는 모드.)

 -e : 환경변수 설정

 --name : 컨테이너 명 지정

 -i : interactive

 -p :

 -v :

docker ps : 컨테이너 목록 출력

 -a : 중지된 컨테이너 확인

docker rm : 컨테이너 삭제

docker stop : 컨테이너 중지

docker start : 중지된 컨테이너를 실행

docker restart : 컨테이너 재기동

docker images : 풀리받은 이미지 목록을 확인

docker rmi : 이미지 삭제

 

이미지가 레이어로 구성되어 있음. (각각에 그룹을 이룸.)

 

레이어로 구성하는 이유는 나중에 재사용이 용이하게 때문.

 

숙달된 후에는 레이어 구성을 통해 좀 더 나은 이미지를 구성할 수 있음.

 

이미지 빌드 방법 (생성)

 

- 수동 생성 : docker commit [CONTAINER_NAME] [NEW_IMAGE_NAME]

                    컨테이너 만든 후 안에서 작업 후에 레이어 레벨을 하나 더 얹혀서 이미지를 만들어 내는 것.

 

docker pull nginx로 이미지 풀링.

 

docker history nignx로 이미지 이력 확인 가능.

현재 레이어는 17임.

 

docker run -d --name build-test nginx

nginx 이미지를 build-test로 실행.

 

컨테이너 쉘에 접근해서 명령 내리기.

exec는 뒤에 bash를 실행함.

 

쉘이 명령어를 기계어로 번역함.

 

터미널이 필요하기에 -t 옵션이 들어감.

 

interactive 표준입력과 표준출력을 사용하는 모드 : -i 옵션

 

컨테이너명은 호스트값이랑 같음.(27cf0~~)

 

nginx 기초 path.

 

index 내용을 핼로 월드로 교체함.

 

커밋하고 히스토리 확인하니 레이어가 18개로 증가함. (17 > 18)

newnginx 이미지 실행하고 -p 명령어로 외부에서 1234 포트 인입시 내부 컨테이너 80포트로 요청.

수동 생성(commit)은 레이어가 지속 쌓이기만 하기 때문에 지속해서 용량이 커지기 때문에 치명적 단점임.

(레이어를 삭제할 수는 없음.)

 

컨테이너를 만들 때는 최대한 컴팩트한 이미지를 만들어 주는게 좋음. (수동 생성 방법은 이게 불가능.)

 

실제 운영 단계 이미지는 commit으로 생성한 이미지는 사용하지 않음.

(그냥 1회성 테스트로 많이 사용함. commit이 간단하니까.)

 

 

- 자동 생성 : docker build SCRIPT (이를 권장하고 있음.)

 

자동 생성을 사용하면 GitOps 패턴, 파이프 라인 등을 구현할 수 있음.

 

컨테이넌 vi도 없어서 그냥 카피해서 작업하면 됨.

. 은 현재 워킹 디렉토리로 복사하는 것임.

vi로 index.html test라고 안에 내용 바꾸고 다시 도커로 넣음.

curl 1234 포트로 날려보면 수정된 index.html 파일 내용 출력 됨.

busybox : 임베디드용 리눅스

 

디렉터리 만들고 파일하나 생성.

FROM : Instruction 지시문 (이런식으로 빌드를 해주세요 ~) Instruction은 대체로 대문자로 씀.

FROM
가장 선행으로 작성하는 지시문이며 기본이미지(Base Image)를 가져와(pull) 기본
컨테이너(Base Container)로 구성하는 작업을 수행합니다. 이후로 나오는 지시문들
은 모두 이 기본 컨테이너에서 작업을 수행하게 됩니다. 따라서 기본 이미지에 포함
되어 있는 여러 명령어(Binary) 들을 사용하여 작업 할 수 있습니다. 예를들어 httpd
서비스를 설치할 경우 기본이미지가 Debian 계열의 이미지라면 apt-get 명령을 수행
할 것이고, 기본이미지가 RHEL 계열의 이미지라면 yum 명령을 수행할 수 있습니
다.

FROM [Repository:Tag]

 

CMD 뒤에는 명령어가 나옴. CMD도 소문자로 써도 되지만 대문자로 많이 씀.

 

헬로 월드라는 테그로 빌드해라.

. 의 의미는 마찬가지로 현재 디렉터리에서 작업해라.

helloworld 실행하면 컨테이너가 실행되며, 아까 지정한 echo 가 출력됨. 

 

FROM EX (Instruction 예시): 

FROM centos

RUN yum install httpd (빌드 될 때 명령)

CMD httpd -D FOREGROUND (실행될 때 명령)

 

FROM ubuntu

RUN apt-get install apache2

 

RUN / ENTRYPOINT + CMD

RUN은 buildtime에서 실행 됨.

CMD는 runtime에서 실행 됨.

 

COPY / ADD

 

호스트에 있는 파일을 기본컨테이너로 복사합니다. 이때 호스트의 경로는 docker
build 명령어의 인자로 들어온 PATH와 기본 컨테이너의 경로가 각각 지정됩니다.
또한 컨테이너의 경로를 지정하는데 절대경로를 사용하는것이 좋습니다.

 

COPY HOST_PATH CONTAINER_PATH
ADD HOST_PATH CONTAINER_PATH

 

ADD가 좀 더 많은 기능을 지원 해줘서 많이 사용함.

 

ADD, COPY, RUN -> Layer 생성하는 Instruction 임. (반드시 하나의 레이어를 생성함.)

 

EX : 

COPY
COPY
COPY

 3개의 COPY가 있으면 3개의 레이어가 생김.

 

ENV

사용자가 어플리케이션이 실행되는 동안 사용할 기본적인 환경변수를 정의합니다.
보통 Key와 Value 형태로 pair 데이터를 작성하며 사용자가 docker run 명령어의 -
e 플래그로 환경변수를 재지정하거나 추가 할 수 있습니다.

 

ENV APACHE_LOG_DIR /var/log/apache
ENV JBOSS_HOME /opt/jboss

 

docker run -e MYSQL_ROOT_PASSWORD pasword -d --name demodb mysql:5.7

 

ARG

 

빌드가 수행되는 동안 사용할 변수를 정의 할 수 있습니다. ENV와 마찬가지로 사용
자가 재지정할 수 있지만 추가는 되지 않으며 docker build 명령어에 --build-arg 플
래그로 지정할 수 있습니다.

 

ARG version=1.0
ARG PROFILES
ENV SPRING_PROFILES_ACTIVE=$PROFILES

 

docker build --build-arg PROFILES=dev buildtest

 

LABEL

 

Key-Value 쌍으로 결합된 데이터 입니다. ENV와 ARG는 각각 빌드 혹은 실행중일
때 사용되는 데이터 이며 LABEL은 docker가 컨테이너를 관리하거나 혹은 오케스트
레이션 기능으로 관리하는데 사용하는 데이터 입니다.

(매니지먼트 관리 기능으로 사용함. 어플리케이션 로직이랑은 상관 X)

 

LABEL org.label-schema.schema-version=1.0
LABEL app=nginx
LABEL tier=web

 

WORKDIR

 

기본 이미지를 통해 기본 컨테이너를 생성하면 지시문으로 작업하는 기본 작업디렉
토리 (working directory)를 / 경로로 지정합니다. 이때 특정한 디렉토리로 변경하려
면 WORKDIR 을 사용합니다.

 

WORKDIR /app
CMD java -jar ./app.jar

 

위 예시에서 RUN을 쓰면 불필요한 레이어가 생성됨.

 

USER

 

기본 컨테이너에서 빌드를 수행하는 기본 사용자는 root 입니다. 이때 특별한 사용자
로 변경하여 후속 작업을 수행하도록 구성할 수 있습니다.

 

USER apache
CMD httpd -D FOREGROUND

 

root로 프로세스 실행하면, 취약점 발견 때 취약함으로 권장하지 않음.

 

EXPOSE

 

어플리케이션에서 사용하는 포트(port)정보를 외부 구성요소에 노출합니다. 포트는
여러개를 지정할수 있고, 기본적으로 TCP 프로토콜이 지정되지만 UDP로 정의 할수
있습니다.

 

# TCP 7373포트와 UDP 8080포트 구성
EXPOSE 7373/udp 8080

 

자동으로 작동할 수 있게끔 외부에 노출하는 경우가 있음.

포트 포워딩 같은걸 자동으로 설정해 줄 수 있음. (구글링해보기)

 

포트 바꾸기

exec bash로 컨테이너 들가서 /etc/nginx/conf.d# 환경설정 파일에서 server > listen 포트를 바꿔줘야 함.

(EXPOSE만 바꾼다고 포트가 바뀌는 건 아님. 환경설정 파일도 같이 바꿔줘야 함.)

 

VOLUME

 

기본 컨테이너에서 특정 디렉토리를 생성한뒤 볼륨을 마운트 할수 있도록 마운트 포
인트로 구성합니다. docker는 docker run 명령어 실행시 동으로 볼륨을 구성해서
마운트포인트에 마운트를 수행합니다.

 

VOLUME /var/lib/registry

 

RUN

 

빌드를 진행하는 다양한 명령어들을 정의하여 기본 컨테이너에서 실행하는 실제 작
업 내용을 작성합니다. 명시적으로 구성하지 않았을 경우 /bin/sh -c 로 실행하지만
사용자가 변경할 수 있습니다. json array 방식으로 작성하는 것을 권장하지만 편의
상 명령어 형식으로 작성할 수 있습니다.

 

RUN apt-get update ;\
apt-get install apache2;\
apt-get clean

 

빌드 타이밍에 실행되는 명령어.

위의 예시로 하면 묶여서 하나의 레이어로 생성 됨.

 

CMD1 ; CMD2 ; CMD3

성공하든 실패하든 순서대로 1, 2, 3 실행 됨.

CMD1 && CMD2 && CMD3

CMD1이 정상 종료 되면 2번이 실행 2번도 정상 종료되면 3번 실행.

CMD1 || CMD2 || CMD3

CMD1이 정상적이지 않고 에러가 발생하면 2번이 실행. 2번이 에러가 발생하면 3번이 실행.

이 경우 마지막에 롤백 명령어 등을 통해 안정적인 운영이 가능함.

 

 

ENTRYPOINT / CMD

 

빌드가 진행되는 동안 수행하는 RUN 지시문과 달리 새로 생성된 이미지로 컨테이너
를 실행할 때 수행하는 명령어를 작성합니다. 명령문은 ENTRYPOINT와 CMD 가
결합되어 동작합니다. 기본적으로 Json array 를 권장하지만 Command 방식으로
사용할 수 있습니다.

 

# Json array
ENTRYPOINT ["echo"]
CMD ["Hello", "world"]
-------------------------------
# COMMAND
ENTRYPOINT echo
CMD Hello world

 

ENTRYPOINT만 써도되고 CMD만 써도됨.

같이 쓸 경우 ENTRYPOINT가 먼저 나옴.

EX : 

ENTRYPOINT echo

CMD hello world

> echo hello world로 실행됨.

 

docker-entrypoint.sh mysqld hello world (위치 파라미터)

 

$1 = mysqld

$2 = hello

$3 = world

$@ = $1+$2+$3 + ...

 

FaaS -> Function As A Service (AWS 람다 서비스 같은 거. 펑션 람다서비스에 올려두면 10만 건 무료로 사용 가능함??이라고 강사님이 말해줌. 이게 가능한게 컨테이너 기술로 경량화 했기 때문이라고 하심.)

 

docker run mysql echo hello world 이런식으로 이미지 뒤에 명령어를 바로 써줄 수 있음.

CMD 등을 통해 시스템 파라미터 값을 엎어칠 수도 있음.

 

이미지 만들어서 레지스트리에 올려보기

 

docker hub (1개의 repository만 사용할 수 있음.) hub.docker.com

quay (public repository는 무제한 사용 가능) quay.io

 

registry server 배포하기

 

깃먼저 설치.

 

강사님 깃 클론해오기. (강의용 코드)

 

FROM으로 기본 이미지를 구성함.

 

requirement.txt 안의 Flask 설치함.

FLASK는 기본적으로 5000포트 사용함.

 

 

kms로 이미지 빌드함.

kms 이미지 생성된거 확인.

1111포트를 5000포트로 포워딩 시키고 Flask 서버 실행함.

터미널 하나 더 켜서 컨테이너 확인하면 잘 실행되어 있음.

docker push kms 하면 이미지가 docker.io 날라가려함.

 

저거 수정 가능.

v1 생략하면 기본적으로 latest로 들어감. (v1은 버전 관리임. v1, v2, v3.....)

 

아이디 만들고 로그인하고 레파지토리 잘 만들고 푸쉬하면 이미지 올라감.

 

레지스트리 만들기.

리눅스 pdf 파일을 윈도우로 위의 방식으로 복사해올 수 있음. ' . ' 은 역시 현재 디렉토리로 가져오는거임.

pdf 파일보면서 레지스트리 구축.

 

사전구성

Add host on /etc/hosts file

 

내부에서 사용하는 DNS가 없다면 호스트명으로 리졸빙(resolving) 하기 위해 /etc/hosts 파
일을 다음고 같이 수정합니다.

 

vi /etc/hosts
...........
172.16.0.200 myregistry.com

 

 

mkdir /auth ; cd /auth
docker run --rm -v /auth:/auth alpine/openssl \
req -newkey rsa:4096 -nodes -sha256 -x509 \
-days 365 -keyout /auth/myregistry.com.key -out /auth/myregistry.com.crt \
-subj '/CN=myregistry.com' \
-addext "subjectAltName = DNS:myregistry.com"
# create htpasswd file
docker run --rm --entrypoint htpasswd httpd:2.4 -Bbn demouser password > /auth/htpasswd

 

 

# client certification
mkdir -p /etc/docker/certs.d/myregistry.com
cp /auth/myregistry.com.crt /etc/docker/certs.d/myregistry.com/ca.crt

 

Shift + insert 하면 외부 복붙 가능함.

 

3. Run Docker Registry with Restriction

 

SSL Termination 과 Authentication 기능을 모두 함께 사용하는 레지스트리입니다.

 

밑에 pdf 참고해서 다시 해보기....

Deploy_Registry_Server.pdf
0.21MB