반응형
리뷰 (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
- volume
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와 가상의 터널링 네트워크 제공
- OSI 7계층 서비스 모델의 2계층 서비스로 container 내부에 제공되는 network interface eth0와 한 쌍으로
- 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 inspect <container ID / 이름> | grep IPAddress
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에만 적용
- 기본 network driver로 container 실행 시 별도의 network 지정 없이 독립적으로 실행되는
- 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 연결에 사용
- 다중 host docker server를 이용한 cluster (Docker swarm) 등을 이용할 경우 docker daemon 간 연결을 통해
- 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 등)을
공유하여 같이 사용할 수 있게 한다.
- container:공유받을 container 이름 옵션은 container의 network namespace stack(IP Address 등)을
- 사용자 정의 네트워크
- docker network create 명령을 통해 사용자가 직접 생성한 Docker network로 아무 옵션을 주지 않고 생성하면
docker0 IP 대역의 다른 CIDR을 지정하여 생성된다.
- docker network create 명령을 통해 사용자가 직접 생성한 Docker network로 아무 옵션을 주지 않고 생성하면
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 접근 과정
- web browser에서 "http://host IP(또는 domain name)[:port]" 입력을 통해 접속
- host O/S에 해당 port가 열려 있음을 확인하고 해당 port가 연결된 container를 찾는다.
- sudo netstat -nlp | grep 80
- ps -ef | grep <PID> | grep -v grep
- 해당 container가 연결된 bridge network의 private IP(172.17.0.X)와 port 번호로 사용자가 입력한
외부 IP와 port 번호가 변환 - 이때 사용되는 서비스가 NAPT (Network Address Port Translation)이고,
NAT에서는 발신자 사설망 → 외부망 IP를 변환해주는 역할만 수행했다면 여기에서는 port까지 바꿔서 보내는 역할 수행
- bridge 모드는 docker0뿐만 아니라 사용자 정의 형태로 사용 가능
- docker network create 명령을 통해 network 대역이 다른 bridge network를 생성하여 해당 network에 속한
Application 간의 전용 통신 가능
Docker Compose
Docker를 이용한 Application 배포 과정
- Docker Image 생성 또는 download
- docker pull - image download
- docker build - image 생성
- Docker container 생성
- docker create / start
- docker run
- 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 작업 절차
- 각각의 image 생성을 위한 Dockerfile 작성 (기존 image를 사용하는 경우에는 생략)
- Docker Compose에서 사용할 YAML 파일 작성 - 각각 독립된 container의 실행 명시
- docker compose 명령을 이용하여 container 생성
- container 생성 이후 start, stop, status, ls 등의 명령으로 container 관리
- 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 저장
- hub.docker.com에 repository 생성
- repository에 저장할 image 생성
- repository에 저장할 image의 이름 형식
- <repository 이름>/<image 이름>:<버전 정보>
- 기존 image 이름에 <repository 이름>을 추가하는 형태로 변경
- docker tag <현재 image 이름>:<버전 정보> <새로운 image 이름>:<버전 정보>
- repository에 저장할 image의 이름 형식
- hub.docker.com login - docker login 명령 사용
- hub.docker.com에 image push (upload)
- docker push <repository 이름>/<image 이름>:<버전 정보>
- private registry - 제한된 사용자만 사용 가능한 저장소
Amazon ECR (Elastic Container Registry)
- 참고 자료
- AWS 완전 관리형 컨테이너 이미지 레지스트리 서비스
- 구성 요소
- 레지스트리
- 사용자 권한 토큰
- Repository
- Repository 정책
- 이미지
Amazon ECR 사용
- AWS CLI 사용자 등록
- AWS CLI 설치 - sudo apt install awscli
- aws configure 명령으로 AWS CLI 자격 증명 등록 - AWS IAM으로 발급받았던 .csv 공개 키 사용
- Amazon ECR에 registry 생성
- 서비스 메뉴 → 컨테이너 → Elastic Container Registry → 리포지토리 생성 시작하기
- 표시 여부 설정 - 실습 중에는 프라이빗으로 진행
- 리포지토리 이름 설정 (push 할 image 이름)
- 나머지는 기본값 사용
- 리포지토리 생성
- 서비스 메뉴 → 컨테이너 → Elastic Container Registry → 리포지토리 생성 시작하기
- 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>:<버전 정보>
- 인증 토큰을 검색하고 레지스트리에 대해 Docker client 인증 명령 실행, docker login 명령과 동일한 동작
TIF
오늘따라 수업이 빠르다 싶더니 Docker 마무리였다.
1~2시간 집중해서 일하는 건 어려운 일이 아니었는데 공부는 왜 1시간 집중하는 것도 힘들까...
2022. 10. 05 에 작성된 글입니다.
반응형
'구름 쿠버네티스' 카테고리의 다른 글
구름 쿠버네티스 전문가 과정 6기 - 46일차 (3) | 2023.11.02 |
---|---|
구름 쿠버네티스 전문가 과정 6기 - 45일차 (2) | 2023.11.01 |
구름 쿠버네티스 전문가 과정 6기 - 43일차 (3) | 2023.10.27 |
구름 쿠버네티스 전문가 과정 6기 - 42일차 (2) | 2023.10.26 |
구름 쿠버네티스 전문가 과정 6기 - 41일차 (0) | 2023.10.24 |