도커 컨테이너 – 쿠버네티스

도커 컨테이너 관련 내용을 알아봅니다.

도커를 알아야 하는 이유

  • 파드는 쿠버네티스를 이루는 기본 오브젝트입니다.
  • 파드는 컨테이너들로 이루어져 있습니다.
  • 도커는 컨테이너를 만들고 관리하는 도구입니다.

파드, 컨테이너, 도커, 쿠버네티스의 관계

  • 파드들은 워커 노드라는 노드 단위로 관리됩니다.
  • 워커 노드와 마스터 노드가 모여 쿠버네티스 클러스터가 됩니다.
  • 파드
    • 1개 이상의 컨테이너로 구성됩니다.
    • 파드는 쿠버네티스로부터 IP를 받아 컨테이너가 외부와 통신할 수 있는 경로를 제공합니다.
    • 컨테이너들이 정상적으로 작동하는지 확인하고 네트워크나 저장 공간을 서로 공유하게 됩니다.
  • 컨테이너를 관리하는 것이 파드, 파드를 관리하는 것이 쿠버네티스 워커 노드, 워커 노드를 관리하는 것이 쿠버네티스 마스터입니다.
  • 컨테이너 : 하나의 운영체제 안에서 커널을 공유하며 개별적인 실행환경을 제공하는 격리된 공간입니다.
  • 유닉스나 리눅스는 하나의 호스트 운영 체제 안에서 자원을 분리해 할당, 실행되는 프로세스를 격리해서 관리하는 방법을 제공 → 이 복잡한 과정을 쉽게 만들어 주는 도구가 도커입니다.

컨테이너 이미지 알아보기

docker search nginx

docker pull nginx
  • 이미지 태그
  • 이미지의 레이어 구조
docker pull nginx:stable

docker images nginx

docker history nginx:stable

docker history nginx:latest

컨테이너 실행하기

  • run Container
  • -d 백그라운드 실행
  • –restart always 오류시 자동재시작

docker run -d --restart always nginx

docker ps

docker ps -f id=cec7

# error
curl 127.0.0.1 
  • -p(–publish) 외부에서 호스트로 보낸 요청을 컨테이너 내부로 전달하는 옵션 -p<요청 받을 호스트>:<연결한 컨테이너 포트>
docker run -d -p 8080:80 nginx-exposed --restart always nginx
docker ps -f name=nginx-exposed

컨테이너 내부 파일 변경하기

  • docker cp
  • Dockerfile ADD
  • 바인트 마운트
  • 볼륨
  • 컨테이너 내부에 연결할 디렉토리를 호스트에 생성
mkdir -p /root/html

docker run -d -p 8081:80 \\
-v /root/html:/usr/share/nginx/html --restart --name nginx-bind-mounts nginx
xxxxxxxxxxx

docker ps -f name=nginx-bind-mounts

cp ~/xxx/index-BindMount.html /root/html/index.html
docker exec e7ca ls /usr/share/nginx/html

#볼륨 생성
docker volume create nginx-volume

#볼륜 조회
docker volume inspect nginx-volume

#볼륨 연결
docker run -d -p 8082:80 \\
-v nginx-volume:/usr/share/nginx/html --restart --name nginx-volume nginx
xxxxxxxxxxx
  • 볼륨을 사용하면 컨테이너에 존재하는 파일을 그대로 보존할 수 있고, 필요할 때 변경해서 사용할 수 있음. 사용 중인 볼륨을 docker volume ls 명령으로 조회할 수 있음. docker volume rm 명령으로 삭제할 수 있음.

사용하지 않는 컨테이너 정리하기

# 조회
docker ps -f ancestor=nginx

# 중지
docker stop tender_snyder

# nginx 모두 중지
docker ps -q -f ancestor=nginx

docker stop $(docker ps -q -f ancestor=nginx)

# 컨테이너 삭제
docker rm $(docker ps -aq -f ancestor=nginx)

# 이미지 삭제
docker rmi $(docker images -q nginx)

4가지 방법으로 컨테이너 이미지 만들기

기본 방법으로 빌드하기

# 빌드
chmod 700 mvnw
./mvnw clean package

docker build -t basic-img .

# 확인
docker images basic-img

# -t(tag) 1.0, 2.0 태그 이미지 생성
docker build -t basic-img:1.0 -t basic-img:2.0 .

컨테이너 용량 줄이기

chmod 700 mvnw
./build-in-host.sh

docker images | head -n 3

컨테이너 내부에서 컨테이너 빌드하기

# Build
docker build -t nohost-img .

# Run Container
docker run -d -p 60433:80 --name nohost-run --restart always nohost-img

# Check
curl 127.0.0.1:60433

# Remove Container
docker rm -f nohost-run

최적화해 컨테이너 빌드하기

  • Multi-Stage Build : 최종 이미지의 용량을 줄이고 호스트에 빌드 도구 설치 없음.
  • docker-ce 17.06 지원
# Docker Version Check
kubectl get nodes -o wide

# Delete Virtual Machine
cd xxx/ch3/3.1.3
vagrant destory -f

# Install k8s
cd xxx/k8s-SingleMaster-18.9_9_w_auto-coml
vagrant up

# Check Docker Version
kubectl get nodes -o wide

# Check Dockerfile
cd xxx/ch4/4.3.4
cat Dockerfile

# build
docker build -t multistage-img .

# Check
docker images | head -n 3

# Delete dangling images (<none> images)
docker rmi $(docker images -f dangling=true -q)

# run Container
docker run -d -p 60434:80 --name multistage-run --restart always multistage-img

# Check 
curl 127.0.0.1:60434

# Remove
docker rm -f multistage-run
  • Dockerfile
FROM openjdk:8 AS int-build
LABEL description="Java Application builder"
RUN git clone <https://github.com/iac-source/inbuilder.git>
WORKDIR inbuilder
RUN chmod 700 mvnw
RUN ./mvnw clean package

FROM gcr.io/distroless/java:8
LABEL description="Echo IP Java Application"
EXPOSE 60434
COPY --from=int-build inbuilder/target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt

쿠버네티스에서 직접 만든 컨테이너 사용하기

쿠버네티스에서 도커 이미지 구동하기

docker images multistage-img

# Create Deployment name : failure1
kubectl create deployment failure1 --image=multistage-img

# Check -> ErrImagePull
kubectl get pods -w

# 실행 결과를 yaml로 추출
kubectl create deployment failure2 --dry-run=client -o yaml \\ --image=multistage-img > failure2.yaml

vi failure2.yaml
# 추가 imagePullPolicy: Never

kubectl apply -f failure.yaml

# Check -> ErrImageNeverPull
kubectl get pods

kubectl delete deployment failure1
kubectl delete deployment failure2

  • 수퍼푸티로 워커노드 3번 w3-k8s 접속
# 깃허브에서 올려 둔 Dockerfile을 받아 와 컨테이너 이미지 생성
curl -0 \\
https:xxx/Dockerfile

# build
docker build -t multistage-img .

cp failure2.yaml success1.yaml

sed -i 's/replicas: 1/replicas: 3/' success1.yaml
sed -i 's/failure2/success1/' success1.yaml

kubectl apply -f success1.yaml

kubectl get pods - o wide
kubectl delete -f success1.yaml

docker rmi multistage-img

docker rmi($docker images -f dangling=true -q)

레지스트리 구성하기

  • 사설 도커 레지스트리
    • Docker Registry : 개인, 테스트 용
    • HARBOR
    • Nexus Repository : 가장 많이 사용
    • Quay
create-registry.sh

docker ps -f name=registry

# multistage-image의 사본 192.168.1.10:8443/multistage-img ****만듬****
docker tag multistage-image 192.168.1.10:8443/multistage-img

docker images 192.168.1.10:8443/multistage-img

# 사설 도커 레지스트리에 등록
docker push 192.168.1.10:8443/multistage-img

# Check -k 보안 검증 생략
curl <https://192.168.1.10:8443/multistage-img> -k

docker images | grep multi

# Delete Host image
docker rmi -f aa23

docker images | grep multistage

직접 만든 이미지로 컨테이너 구동하기

cp success1.yaml success2.yaml

vi success2.yaml
# 삭제 imagePullPolicy: Never

sed -i 's/success1/success2/' success2.yaml

kubectl apply -f success2.yaml

kubectl get pods -o wide

curl 172.16.132.5

kubectl delete -f success2.yaml

도커 컨테이너란 무엇이고 사용법에 대해 알아봤습니다.
관련 명령어가 많이 있기 때문에 필요한 명령어는 숙지하시기 바랍니다.

그럼 다음 포스팅에서 뵙겠습니다.

Back to top