어쩌다 IT
article thumbnail
반응형

리뷰 (Review)

더보기

Docker Volume

  • Docker는 Union File System 사용
  • 데이터베이스와 같은 Application에서 발생하는 데이터에 접근하고 이를 공유하기 위해 Docker Volume 사용
  • Docker Volume 종류
    • volume
      • docker volume create <volume 이름>
      • docker 명령으로 관리
      • /var/lib/docker/volumes - volume 저장 위치
    • bind mount
      • host 파일 시스템 절대 경로:cotainer 내부 경로
    • tmpfs mount

 

Docker Network


Docker Network

 

Docker 관련 Network Interface

  • docker0
    • Docker 설치 시 기본적으로 제공되는 가상 브리지 네트워크, 게이트웨이 역할
    • 172.17.0.1 주소
    • docker0 브리지는 소프트웨어적인 스위치 방식으로 동작
      • DHCP로 연결된 container에 사전에 정의된 IP pool 할당
  • vethxxxxxx
    • OSI 7계층 서비스 모델의 2계층 서비스로 container 내부에 제공되는 network interface eth0와 한 쌍으로
      제공되어 docker0와 가상의 터널링 네트워크 제공
  • eth0
    • Docker container에 생성되는 기본 network interface 명으로 docker0를 게이트웨이로 사용
    • 순차적으로 IP Address를 할당받거나 사용자가 동일 대역의 IP Address를 지정할 수 있다.
  • Docker Network Driver는 Docker Engine의 일부이며 추가 구성은 필요 없다.

 

Docker Network 종류

  • Bridge Network (default)
    • 아무 설정 없이 사용했을 때 기본으로 사용하는 network
    • host와 별도의 가상 네트워크 사용
    • 포트 포워딩으로 (docker run -p 옵션) 외부 network와 연결
  • Host Network
    • container의 network 환경을 host의 network 환경과 동일하게 사용
    • 포트 포워딩 없이 host와 container를 직접 제어
      • ex) docker run -d --net host --name webserver nginx 명령 이후 웹 페이지 접속 가능
  • None Network
    • network를 사용하지 않고 local network(docker virtual network)만 사용
    • host나 외부와 연결이 단절
  • docker run 명령 사용 시 --net(--network) 옵션을 사용하여 선택하여 container가 동작하는 network 결정 가능

 

Docker Network 명령

  • Docker Network 명령 참고 자료
  • docker network ls - Docker Network 목록 출력
  • docker network create [옵션] <네트워크 이름> - Docker Network 생성
    • -d <driver 이름> : driver 지정, bridge가 기본값
  • docker network rm <네트워크 이름> - Docker Network 삭제
  • docker network inspect <네트워크 이름> - Docker Network 상세 정보 확인
  • container에 할당된 IP Address 확인 방법
    • docker inspect <container ID / 이름> | grep IPAddress
      • container에 대한 inspect 명령 결과에 grep 명령으로 확인
    • docker exec <container ID / 이름> ifconfig eth0
      • container의 Application에 대하여 network 명령으로 확인

 

Docker Network 구성 요소별 확인 명령

  • 브리지 네트워크 조회 명령
    • brctl show
ubuntu@ip-12-12-12-12:~/work$ brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02428644d6d7	no		veth3c5d377
							vethe1bffa4
ubuntu@ip-12-12-12-12:~/work$

 

 

docker info | grep Network 명령 수행 시 출력 결과

  • bridge
    • 기본 network driver로 container 실행 시 별도의 network 지정 없이 독립적으로 실행되는
      Application container를 실행하는 경우 사용
    • 브리지 모드는 동일 host 상의 Docker container에만 적용
  • host
    • container의 host 모드 사용하면 container와 host 간의 network 격리를 제거하고 host의 network 직접 사용
    • container Application에 별도의 host 연결(-p 옵션) 없이 host port를 이용하여 바로 서비스할 수 있다.
  • overlay
    • 다중 host docker server를 이용한 cluster (Docker swarm) 등을 이용할 경우 docker daemon 간 연결을 통해
      container 서비스를 수행
    • container 간에 운영체제 수준의 routing을 사용하지 않아도 된다.
    • docker cluster인 Docker Swarm 구축 시 host와 host 간 container 연결에 사용
  • macvlan
    • 물리적인 network에 container MAC 주소를 통한 직접 연결 구현 시 사용
    • docker daemon은 MAC 주소별로 트래픽 라우팅
  • none
    • container의 network를 사용하지 않도록 설정
    • none network로 설정하면 network interfacesms lo Interface (loopback adaptor) 만 존재
    • container가 host networking stack에서 완전히 분리되는 것으로 container는 외부와의 통신 단절
  • container network
    • container:공유받을 container 이름 옵션은 container의 network namespace stack(IP Address 등)을
      공유하여 같이 사용할 수 있게 한다.
  • 사용자 정의 네트워크
    • docker network create 명령을 통해 사용자가 직접 생성한 Docker network로 아무 옵션을 주지 않고 생성하면
      docker0 IP 대역의 다른 CIDR을 지정하여 생성된다.

 

Docker 기본 bridge network

  • Docker 기본 network 구성은 bridge network 모드 사용
  • bridge 모드 network 구성은 docker daemon을 통해 docker container만의 network를 실제 server (host) network와
    분리해 독립적으로 구성하는 network 방식
  • 외부 web browser에서 web server (Apache 또는 NginX)의 web service 접근 과정
    1. web browser에서 "http://host IP(또는 domain name)[:port]" 입력을 통해 접속
    2. host O/S에 해당 port가 열려 있음을 확인하고 해당 port가 연결된 container를 찾는다.
      • sudo netstat -nlp | grep 80
      • ps -ef | grep <PID> | grep -v grep
    3. 해당 container가 연결된 bridge network의 private IP(172.17.0.X)와 port 번호로 사용자가 입력한
      외부 IP와 port 번호가 변환
    4. 이때 사용되는 서비스가 NAPT (Network Address Port Translation)이고,
      NAT에서는 발신자 사설망 → 외부망 IP를 변환해주는 역할만 수행했다면 여기에서는 port까지 바꿔서 보내는 역할 수행
  • bridge 모드는 docker0뿐만 아니라 사용자 정의 형태로 사용 가능
  • docker network create 명령을 통해 network 대역이 다른 bridge network를 생성하여 해당 network에 속한
    Application 간의 전용 통신 가능

Docker Compose

 

Docker를 이용한 Application 배포 과정

  1. Docker Image 생성 또는 download
    • docker pull - image download
    • docker build - image 생성
  2. Docker container 생성
    • docker create / start
    • docker run
  3. Docker container를 통한 서비스 제공
  • 위의 과정을 통한 container 생성은 하나의 container를 생성하는 경우라면 CLI 상에서 명령으로 처리하는데 문제는 없다.
  • 서로 연관된 container에 의해서 서비스를 제공하는 경우에는 연관된 container의 생성 순서나 연관 관계
    CLI 상에서 명령으로 처리하기에는 명령 입력에 대한 복잡성이 증가한다.
  • 여러 container 생성을 통한 배포 과정을 일괄적으로 관리할 수 있도록 도구가 필요해짐 - container orchestration 도구

 

Docker Compose

  • 공통성을 갖는 container application stack을 YAML 코드로 정의한 정의서이며, 정의서를 실행하는 다중 container 실행 도구 - IaC 도구
  • 공통성은 공통의 목적을 갖는 Application stack을 Docker Compse YAML 코드로 정의해서 한 번에 서비스를 올리고 관리할 수 있는 도구
  • Docker Compse로 실행된 container는 독립된 기능을 가지면 공통 network로 구성되기 때문에 container 간 통신이 쉽다.
  • Docker Compose는 공통성 있는 container들을 포함하여 쉽고 빠른 run-time 환경 제공
  • Docker Compose는 test, development, operation의 모든 환경에서 구성이 가능한 orchestration 도구 중 하나
  • 다양한 관리 기능을 가지고 있지 않기 때문에 test와 development 환경 구성에 적합
  • 실제 운영 환경은 많은 관리적 요소가 필요하므로 Docker Swarm이나 Kubernetes와 같은 orchestration 도구 사용

 

Docker Compose YAML 코드 구조

version: "3.8"
services:
  서비스명1:
  # Application 설정값 정의1
  서비스명2:
  # Application 설정값 정의2
...
networks:
  # Network 설정, 미지정 시 자동 생성
volumes:
  # Volume 설정
  • YAML 파일 이름 - docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml
  • 일반적으로 설계상 가장 먼저 실행되어야 하는 Application을 먼저 작성하고, 이와 의존성을 갖는 DataBase 및 하위 Application 작성
  • cluster 환경 구성은 master node를 먼저 작성하고 이어서 work node 작성
  • 이후 전체 Application에 필요한 Network, Volume 등의 기반 환경 기술
  • version:
    • 가장 상단에 기술
    • Docker Engine 버전과 연관성이 있으므로 그에 따른 버전 번호 기술
    • 참고 자료
  • services:
    • Docker Compose를 통해 실행할 서비스 정의
    • Docker Compose는 container 대신 service 개념 사용
    • 서비스명 - container 이름
    • 서비스명 다음에 해당 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 파일에 기술된 내용을 참조하여 container service 생성
    • docker compose로 생성되는 service, network 이름은
      <서비스명 (docker compose 명령 실행 디렉토리명)>-<서비스명>[-숫자] 형식으로 부여
ubuntu@ip-12-12-12-12:~/work/test-compose$ docker network ls
NETWORK ID     NAME                      DRIVER    SCOPE
c4b00cdb6121   bridge                    bridge    local
fb307b4bb845   host                      host      local
b48221361817   none                      null      local
305cfb46bc11   test-compose_back-tier    bridge    local
25c9ded593db   test-compose_front-tier   bridge    local

ubuntu@ip-12-12-12-12:~/work/test-compose$ docker compose ps
NAME                      COMMAND                  SERVICE             STATUS              PORTS
test-compose-backend-1    "docker-entrypoint.s…"   backend             exited (1)          
test-compose-frontend-1   "/docker-entrypoint.…"   frontend            running             0.0.0.0:80->80/tcp, :::80->80/tcp
ubuntu@ip-12-12-12-12:~/work/test-compose$
  • docker compose down - docker compose up으로 생성된 container service 삭제
  • docker compose ps - docker compose로 생성된 container 목록 출력

Amazon ECR 서비스

 

Container 저장소 (registry)

  • public registry - 누구나 사용 가능한 저장소
    • hub.docker.com - 대표적인 public registry
    • hub.docker.com의 repository에 image 저장
      1. hub.docker.com에 repository 생성
      2. repository에 저장할 image 생성
        • repository에 저장할 image의 이름 형식
          • <repository 이름>/<image 이름>:<버전 정보>
        • 기존 image 이름에 <repository 이름>을 추가하는 형태로 변경
          • docker tag <현재 image 이름>:<버전 정보> <새로운 image 이름>:<버전 정보>
      3. hub.docker.com login - docker login 명령 사용
      4. hub.docker.com에 image push (upload)
        • docker push <repository 이름>/<image 이름>:<버전 정보>

  • private registry - 제한된 사용자만 사용 가능한 저장소

 

Amazon ECR (Elastic Container Registry)

 

Amazon ECR 사용

  1. AWS CLI 사용자 등록
    • AWS CLI 설치 - sudo apt install awscli
    • aws configure 명령으로 AWS CLI 자격 증명 등록 - AWS IAM으로 발급받았던 .csv 공개 키 사용
  2. Amazon ECR에 registry 생성
    • 서비스 메뉴 → 컨테이너 → Elastic Container Registry → 리포지토리 생성 시작하기
      • 표시 여부 설정 - 실습 중에는 프라이빗으로 진행
      • 리포지토리 이름 설정 (push 할 image 이름)
      • 나머지는 기본값 사용
    • 리포지토리 생성
  3. ECR에 생성된 registry에 Docer image push / pull
    • 인증 토큰을 검색하고 레지스트리에 대해 Docker client 인증 명령 실행, docker login 명령과 동일한 동작
      aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <ECR repository URI>
    • docker image 생성
      • docker build . -t <ECR repository URI>:<버전 정보>
    • 생성한 docker image를 ECR에 push
      • docker push <ECR repository URI>:<버전 정보>


TIF

오늘따라 수업이 빠르다 싶더니 Docker 마무리였다.

 

1~2시간 집중해서 일하는 건 어려운 일이 아니었는데 공부는 왜 1시간 집중하는 것도 힘들까...

 

 

2022. 10. 05 에 작성된 글입니다.

 

반응형
profile

어쩌다 IT

@jwlish

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!