[구름 k8s] TIL 3-1-2

Peppie·2022년 10월 5일
0

1. Docker Network

Docker Network

  • docker container 및 서비스는 Docker Network를 통해 격리된 container 간의
    네트워크 연결
    뿐만 아니라 Docker 외 다른 application 워크로드와도 연결 가능
  • Docker Network의 하위 시스템 연결을 위해 Docker Network Driver를 사용하여 상호통신 가능

Docker Network 정의

  • Docker 설치시 기본적으로 제공되는 docker0는 SW적으로 구현된 가상 이더넷 브리지 (virtual ethernet bridge) 네트워크
    => 이것을 통해 격리된 container 간 상호 통신 제공
  • 별도 브리지 NW를 생성하여 연결값으로 설정하지 않는 한 모든 container는 docker0 브리지에 연결하여 172.17.0.0/16 CIDR 범위로 IP 주소 할당
    • /16 : 65536개 IP 주소 범위

Docker 관련 Network Interface

docker0

Docker 설치 시 기본적으로 제공되는 브리지 네트워크, 172.17.0.1 주소

  • docker0 브리지는 SW적인 스위치 방식으로만 동작
    => DHCP로 연결된 container에 사전에 정의된 IP pool 할당

vethxxxxxx

OSI 7계층 서비스 모델의 2계층 서비스,
container 내부에 제공되는 network interface eth0와 한 쌍으로 제공되어
docker0와 가상의 터널링 네트워크 제공

eth0

Docker container에 생성되는 기본 네트워크 인터페이스명으로 docker0을 게이트웨이로 사용

  • 순차적으로 IP 주소를 할당받거나 사용자가 동일 대역의 IP 주소 지정 가능

Docker Network Drive는 Docker engine의 일부, 추가 구성은 필요 X

docker run 명령 사용시 --net (--network) 옵션을 사용해서 선택 가능
-> container가 동작하는 네트워크 결정

docker network ls

Docker 네트워크 목록 확인

Docker Network 종류

Bridge network (default)

아무 설정 없이 사용했을 때 기본으로 사용하는 네트워크
host와 별도의 가상 네트워크 사용
포트포워딩으로 (docker run -p 옵션) 외부 네트워크와 연결

docker run -d -p 80:80 --name webserver2 nginx

Host network

container의 네트워크 환경을 호스트의 네트워크 환경과 동일하게 사용
포트포워딩 없이 호스트와 container를 직접 제어

docker run -d --net host --name webserver2 nginx

None network

네트워크를 사용하지 않고 local 네트워크(docker virtual network)만 사용
호스트나 외부와 연결 단절

docker run -d --net none -p 80:80 --name webserver2 nginx

docker network 명령으로 호출 가능

docker network ls

Docker 네트워크 목록 출력

docker network create [옵션] <네트워크 이름>

Docker 네트워크 생성

  • -d <driver 명> : driver 지정, default driver는 bridge

docker network rm <네트워크 이름>

Docker Network 삭제

docker network inspect <네트워크 이름>

Docker Network 상세 정보

container에 할당된 IP 주소 확인 방법

  • container에 대한 inspect 명령 결과에 grep 명령으로 확인

    docker inspect server | grep IPAddress

  • container의 application에 대하여 network 명령으로 확인

    docker exec server ifconfig eth0

Docker Network 구성 요소별 확인 명령

브리지 네트워크 조회 명령

  • 브리지 네트워크 조회 명령 사용을 위한 패키지 설치 (Ubuntu) : sudo apt install bridge-utils
  • 브리지 네트워크 저회 명령 : brctl show

docker info | grep Network

명령 수행시 출력 결과 설명

bridge

  • 기본 네트워크 드라이버, container 실행시 별도 네트워크 지정 없이 독립적으로 실행되는 application container 실행시 사용
  • 브리지 모드는 동일 host 상의 Docker container에만 적용

host

  • container의 host 모드를 사용하면 container와 host 간 네트워크 격리 제거,
    host의 네트워크 직접 사용
  • container application에 별도의 host 연결 (-p host port:container port) 없이 host port를 이용하여 바로 서비스 가능

overlay

  • 다중 host docker server를 이용한 cluster (Docker swarm) 등을 이용할 경우 docker daemon간 연결을 통해 container 서비스를 수행
  • container 간에 운영체제 수준의 routing을 사용하지 않아도 됨
  • docker cluster인 Docker Swarm 구축 시 host와 host 간 container 연결에 사용

macvlan

  • 물리적 네트워크에 container MAC 주소를 통한 직접 연결 구현시 사용
  • docker daemon은 MAC 주소별로 트래픽 라우팅

none

container의 네트워크를 사용하지 않도록 설정

  • none network로 설정하면 network interface는 lo Interface ( loopback adaptor )만 존재
  • container가 host networking stack에서 완전히 분리되는 것으로 container는 외부와의 통신 단절

container network

container:공유받을 container 이름
옵션은 container의 network namespace stack ( IP 주소, MAC 주소 등 )을 공유하여 같이 사용하도록

사용자 정의 네트워크

docker network create 명령을 통해 사용자가 직접 생성한 Docker network로 아무 옵션을 주지 않고 생성하면 docker0 IP 대역의 다른 CIDR을 지정하여 생성

Docker 기본 bridge network

Docker 기본 네트워크 구성은 bridge network 모드 사용

bridge network 구성은 docker daemon을 통해 docker container 만의 네트워크를 실제 서버 (호스트) 네트워크와 분리해서 독립적으로 구성하는 네트워크 방식

외부 웹브라우저에서 웹서버 (Apache 또는 NginX)의 웹서비스 접근 과정

  1. 웹브라우저에서 http://호스트IP(도메인 이름)[:포트] 입력을 통해 접속

  2. 호스트 OS에 해당 포트가 열린 것을 확인하고 해당 포트가 연결된 container를 찾음

    • sudo netstat -nlp | grep 80
    • ps -ef | grep 137592 | grep -v grep
  3. 해당 container가 연결된 bridge network의 사설IP(172.17.0.X)와 포트 번호로 사용자가 입력한 외부 IP와 포트 번호가 변환

  4. 이때 사용되는 서비스가 NAPT (Network Address Port Translation), NAT에서는 발신자 사설망->외부망 IP를 변환해주는 역할만 수행했다면 여기서는 포트까지 바꿔서 보내는 역할 수행

bridge 모드는 docker0 뿐만 아니라 사용자 정의 형태로 사용 가능

docker network create 명령을 통해 network 대역이 다른 bridge network를 생성하여 해당 network에 속한 어플리케이션 간 전용 통신 가능

2. Docker Compose

Docker를 이용한 어플리케이션 배포 과정

Docker image 생성 또는 download

docker pull 명령

-> image download

docker build 명령

-> image 생성

Docker container 생성

docker create / start 명령

docker run 명령

Docker container를 통한 서비스 제공

=> 위의 과정을 통한 container 생성은 하나의 container를 생성하는 경우라면 CLI 상에서 명령으로 처리하는 데 문제 X

서로 연관된 container에 의해 서비스를 제공하는 경우에는 연관container의 생성 순서나 연관 관계를 CLI 상에서 명령으로 처리하기에는 명령 입력에 대한 복잡성 증가

여러 container 생성을 통한 배포 과정 일괄적 관리 도구 필요 -> container orchestration 도구

Docker Compose

공통성을 갖는 container application stack을 YAML 코드로 정의한 정의서
정의서를 실행하는 다중 container 실행 도구 -> IaC 도구

  • 공통성 : 공통의 목적을 갖는 application stack을 Docker Compose YAML 코드로 정의해서 한번에 서비스를 올리고 관리 가능한 도구

  • Docker Compose로 실행된 container는 독립된 기능을 가지면 공통 네트워크로 구성됨
    -> container 간 통신 쉬움
  • Docker Compose는 공통성 있는 container들을 포함하여 쉽고 빠른 run-time 환경 제공

  • test, development, operation의 모든 환경에서 구성 가능한 orchestration 도구 中 1
  • 다양한 관리 기능 X -> test 및 development 환경 구성에 적합
  • 실제 운영 환경은 많은 관리적 요소가 필요하므로 Docker Swarm이나 Kubernetes(전반적으로 Docker Compose와 유사하나 쿠버네티스의 경우 관리 기능 포함)와 같은 orchestration 도구 사용

Docker Compose YAML 구조

참고
YAML 파일 이름 : docker-compose.yml , docker-compose.yaml , compose.yml , compose.yaml

version: "3.8"
services:
  서비스명1:
  # application 설정값 정의 1
  서비스명2:
  # application 설정값 정의 2
...
networks:
  # network 설정, 미지정 시 자동 생성
volumes:
  # volume 설정

일반적으로 설계상 먼저 실행되어야 하는 application을 먼저 작성 후 이와 의존성을 갖는 DB 및 하위 application 작성

  • cluster 환경 구성은 master node를 먼저 작성하고 이어서 work node(작업 노드) 작성
  • 이후 전체 application에 필요한 network, volume 등의 기반환경 기술

version: "3.8"

가장 상단에 기술 참고
Docker engine 버전과 연관성 有 -> Docker engine에 따른 버전 번호 기술

services:

Docker Compose를 통해 실행할 서비스 정의

  • Docker Compose는 container 대신 service 개념 사용
  • service명 : container 이름
  • service명 다음에 해당 container 생성 위한 필요 정보 기술
    -> docker run 명령에서 기술하는 옵션을 표현한다고 보면 됨
  • build 속성 : Dockerfile을 이용한 image 생성시 사용
  • depends_on 속성 : 의존성 서비스 명시 또는 먼저 실행

Docker Compose 작업 절차

  1. 각각의 image 생성 위한 Dockerfile 작성 (기존 image를 사용하는 경우에는 생략)
  2. Docker Compose에서 사용할 YAML 파일 작성 -> 각각 독립된 container의 실행 정의 명시
  3. docker compose 명령을 이용하여 container 일괄 생성
    container 생성 후 start, stop, status, ls 등의 명령으로 container 관리
  4. docker compose 명령으로 container 일괄 삭제

Docker Compose 명령

참조

docker compose version

Docker Compose version 확인

docker compose up

YAML 파일에 기술된 내용을 참조하여 conatiner server 생성

  • docker compose로 생성되는 service, network 이름은
    <서비스명(docker compose 명령 실행 디렉토리명)>_<서비스명>[<숫자>] 형식으로 부여_

docker compose down

docker compose up에 의해 생성된 container service 삭제

docker compose ps

docker compose로 생성된 container 목록 출력

3. Amazon ECR 서비스

Container 저장소

public registry

누구나 사용 가능한 저장소

  • hub.docker.com : 대표적인 public registry

hub.docker.com에 생성된 repository에 image 저장

  1. hub.docker.com에 repository 생성
  • 기본적으로 사용자 ID명의 repository가 생성됨
  • 필요시 create repository를 선택하여 repository 생성
  1. repository에 저장할 image 생성
  • repository에 저장할 image 이름형식 : <repository명>/<image명>:<버전정보>
  • 기존 image 이름에 <repository명>을 추가하는 형태로 변경
    : docker tag <현재 image명>:<버전> <새로운 image명>:<버전>
  1. hub.docker.com login
  • docker login 명령 사용
  1. hub.docker.com에 image push (upload)
  • docker push <repository 이름>/<image 이름>:<버전>

private registry

제한된 사용자만 사용가능한 저장소

Amazon ECR (Elastic Container Registry)

(참고1) (참고2)
AWS 완전관리형 컨테이너 이미지 레지스트리 서비스

구성요소

  • 레지스트리
  • 사용자 권한 토큰
  • Repository
  • Repositirt 정책
  • 이미지

Amazon ECR 사용

  1. AWS CLI 사용자 등록
  • AWS CLI 설치
    • ubuntu : sudo apt install awscli
  • aws configure 명령으로 AWS CLI 자격 증명 등록
  1. Amazon ECR에 registry 생성
  • 서비스 메뉴 -> 컨테이너 -> ECR -> 리포지토리 생성 시작하기
    • 표시 여부 설정 : private
    • 리포지토리 이름 : push할 image 이름
    • 나머지는 기본값 사용
  • 리포지토리 생성
  1. ECR에 생성된 registry에 Docker image push / pull
    3.1 인증 토큰을 검색하고 레지스트리에 대해 Docker client 인증 명령 실행
    : docker login 명령과 동일한 동작

    aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <ECR 레포지토리 URI>

    3.2 docker image 생성

    docker bould . -t <ECR 레포지토리 URI>:<버전>

    3.3 생성된 image를 ECR에 push

    docker push <ECR 레포지토리 URI>:<버전>

0개의 댓글