5 minute read

일지

크 이게 강의지
만족만족

주요 키워드

Docker Network

오늘의 할일

  • 220509 TIL 작성
  • 사이드 프로젝트 진행회의

추가로 정리해야할 부분

docker network 생성시 –ip-range와 –subnet 차이

수업 정리

지난 주 복습

컨테이너 가상화

Docker 기본 구조

  • Docker Client
  • Docker Host
    • Engine
    • Container Runtime(containerd, runC)
    • image registry
  • Registry
    • Docker Hub
    • Private Registry(직접 구성, AWS, GCP…)

컨테이너 구동을 위한 리눅스 기반기술

  • cgroup
  • namespace : PID(Process), Network, UID(User ID), Mount, UTS(Hostname), IPC
  • chroot

Docker 설치 docs.docker.com

이미지 관리 (docker image)

  • 이미지 다운로드 (pull)
  • 이미지 목록 확인 (ls)
  • 이미지 삭제 (rm)

컨테이너 관리(docker container)

  • 생성(create) - 시작(start) - 중지(stop) - 삭제(rm)
  • docker container run / docker run (create+start)
  • 컨테이너 생성 및 시작 시 주요 옵션 -i, –interactive : Interactive, 표준입출력(STDIN,STDOUT) 채널을 오픈
    -t, –tty : TTY, Terminal, 사용자가 터미널을 사용하여 연결할 수 있도록
    -d, –detach : 백그라운드(run) 실행
    -a, –attach : 포그라운드(start) 실행
    -n, –name : 컨테이너 이름 지정
  • 컨테이너 동작중 중지, 재시작, 일시정지 등 가능 stop, restart, pause, unpause
  • 실행중인 컨테이너 제어 docker attach : 현재 컨테이너의 메인 프로세스에 연결
    docker exec : 별도의 프로세스를 실행하여 연결 /bin/sh, /bin/bash
    docker logs : 컨테이너의 로그 확인
    docker top : 컨테이너 내 프로세스 확인

볼륨

  • Bind Mount
  • Docker Volume
  • tmpfs

참고) 컨테이너 전체 삭제(실행중+중지상태) $ docker rm -f $(docker ps -aq) $ docker rm -f `docker ps -aq`

도커 네트워크

Docker에서는 기본적으로 컨테이너가 사용할 수 있는 Bridge를 제공(docker0)
docker0는 172.17.0.0/16 네트워크 주소를 사용
기본 docker0 bridge를 사용할 경우는 veth를 생성하여 사용
기본 bridge 이외에도 다양한 유형의 네트워크 사용 가능

Docker에서 사용할 수 있는 네트워크 유형 Bridge: 기본적으로 생성된 docker0 브리지를 사용하여 컨테이너의 외부 연결 제공. 사용자가 직접 생성 가능
Host: Docker Host의 네트워크 설정을 그대로 사용
Null : 네트워크 인터페이스를 사용할 필요가 없는 컨테이너에 사용
macvlan : 호스트의 네트워크와 동일한 위치에 가상 네트워크 인터페이스를 생성
macvlan 사용시 필요조건 : Promiscuous mode 활성화
overlay : 컨테이너 클러스터 환경에서 사용
container : 다른 컨테이너의 네트워크 설정을 공유

사용자에 의한 Docker Network 개체 생성 $ docker network create –driver=[TYPE] [NETWORK이름]

Bridge

예시$ docker network create --driver bridge mybridge1
예시$ docker network create --driver bridge --subnet 192.168.200.0/24 --gateway 192.168.200.1 mybridge2

옵션
–driver: 사용할 네트워크 유형 선택
–subnet: bridge 내부에서 사용할 네트워크 IP 범위
–gateway: bridge 내부에서 외부로 패킷을 보내기 위한 경로. subnet 범위 내

macvlan

$ ip link set enp0s8 promisc on // promiscuous mode 활성화 $ docker network create --driver=macvlan 예시$ docker network create --driver macvlan --gateway 192.168.56.1 --subnet 192.168.56.0/24 --ip-range 192.168.56.192/26 -o parent=enp0s8 mymacvlan

옵션
–gateway : 동일
–subnet : 동일
–ip-range : 실제 컨테이너의 NIC에 할당할 IP주소의 범위
-o parent : 호스트 시스템의 NIC중 macvlan으로 연결할 네트워크를 사용중인 NIC

네트워크 설정 변경(실행중인 컨테이너의 네트워크 변경)
docker network connect
docker network disconnet

사용자 생성 Bridge의 특징

  • network-alias 기능이 제공
  • 내부적인 DNS가 생성 (기본 docker0 브리지에는 없음)

컨테이너 이름을 사용한 주소 확인
–link <컨테이너명>[:별칭]

DNS를 사용한 주소 확인 (별도의 bridge 생성 시)

  • 따로 설정하지 않아도 컨테이너 이름을 사용한 이름 변환 가능
  • 각 bridge 내 DNS 서버 동작 (127.0.0.11)

network-alias
해당 이름을 사용하는 다수의 컨테이너를 지정

network-alias 를 지정한 컨테이너 실행

$ docker run -d --name web1 --network mybridge1 --network-alias websvc httpd
$ docker run -d --name web2 --network mybridge1 --network-alias websvc httpd
$ docker run -d --name web3 --network mybridge1 --network-alias websvc httpd

테스트용 컨테이너 생성
$ docker run -it --rm --network mybridge1 travelping/nettools

테스트

$ nslookup web1.
$ nslookup web2.
$ nslookup web3.
$ nslookup websvc.

컨테이너 이름 관련 옵션
docker run 실행 시 –hostname 옵션: 컨테이너의 hostname 지정
docker run 실행 시 –dns 옵션: 컨테이너 내부에서 사용할 DNS 지정


실습

실습 전 수업에 사용한 컨테이너 및 네트워크를 삭제해주세요~

컨테이너 삭제
$ docker rm -f $(docker ps -aq)

네트워크 삭제

$ docker network ls
=> bridge, host, none을 제외한 모든 네트워크 삭제
$ docker network rm <네트워크이름>
  1. 웹 서비스를 제공하기 위한 httpd 이미지를 사용한 myweb컨테이너 및 mysql 이미지를 사용한 mydb 컨테이너를 구동하시오. 이 때, myweb 컨테이너에서 dbhost 이름을 사용하여 mydb 컨테이너의 주소를 확인할 수 있도록 생성하시오.

my A.

docker run --name mydb -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql
docker run --name myweb --link mydb:dbhost httpd

강사님 답안.

$ docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=1234 -d mysql
$ docker run -d --name myweb --link mydb:dbhost httpd
$ docker exec myweb cat /etc/hosts
  1. 새로운 서비스를 구축하기 위한 다음과 같은 docker network를 구성하시오 네트워크 이름: my-network 네트워크 유형: Bridge 사용할 IP대역: 192.168.123.0~255 게이트웨이 주소: 192.168.123.1

my A.

docker network create --driver bridge \
--ip-range 192.168.123.0/24 \
--gateway 192.168.123.1 \
--subnet 192.168.123.0/24 \
my-network

강사님 답안.

docker network create --driver bridge --subnet 192.168.123.0/24 --gateway 192.168.123.1 my-network
  • 흠 사용대역이 ip-range가 아니라 서브넷을 의미하는거였어?
  1. my-network 네트워크에 연결된 nginx 이미지를 사용한 3개의 컨테이너를 생성하고, my-network 브리지 내에서 3개의 컨테이너를 mynginx 이름으로 접근할 수 있도록 생성하시오.

내 답안.

docker run -d --name web1 --network my-network --network-alias mynginx nginx
docker run -d --name web2 --network my-network --network-alias mynginx nginx
docker run -d --name web3 --network my-network --network-alias mynginx nginx

강사님 답안

<컨테이너 구동>
$ docker run -d --name nginx1 --network my-network --network-alias mynginx nginx
$ docker run -d --name nginx2 --network my-network --network-alias mynginx nginx
$ docker run -d --name nginx3 --network my-network --network-alias mynginx nginx
<테스트용 컨테이너 구동>
$ docker run -it --rm --network my-network mcastelino/nettools
# host nginx1
# host nginx2
# host nginx3
# host mynginx
  1. 현재 Docker Host의 네트워크 인터페이스 중 host-only 네트워크인 enp0s8 네트워크에 대하여 macvlan으로 구성되는 newmacvlan 네트워크를 다음과 같이 생성하시오. 서브넷: 192.168.56.0/24 사용할 IP범위 : 192.168.56.128~159 게이트웨이: 192.168.56.1

A.

docker network create --driver macvlan \
--gateway 192.168.56.1 \
--subnet 192.168.56.0/24 \
--ip-range 192.168.56.128/25 \
newmacvlan

강사님 답안

<Promiscuous mode 상태 확인>
$ ip link show enp0s8
<BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP>

<Promiscuous mode 없을 경우 설정>
$ ip link set enp0s8 promisc on

< macvlan 네트워크 생성>
$ docker network create --driver macvlan --subnet 192.168.56.0/24 --gateway 192.168.56.1 --ip-range 192.168.56.128/27 -o parent=enp0s8 newmacvlan
  1. 현재 사용중인 Docker Host의 네트워크 설정을 그대로 사용하여 실행되는 다음 컨테이너를 생성하시오 컨테이너의 포트: 8080 이미지: c1t1d0s7/myweb

docker run --network host -p:8080 c1t1d0s7/myweb

$ docker run -d --network host --name myweb8080 c1t1d0s7/myweb

<외부 연결 테스트 시 방화벽 개방>
$ firewall-cmd --add-port=8080/tcp

<페이지가 표시되지 않을 경우 확인>
$ ss -tanp | grep 8080
  • 원래 저이미지가 8080포트로 가상화호스트 적용되있나부다
  • 아닌가? 도커허브 설명이랑 좀 방식이 다른데?흠
  • 조회는 host N/W를 사용하기때문에 curl 127.0.0.1:8080 또는 curl {HOST IP}:8080

Categories:

Updated:

Leave a comment