220509 Today I Learned
일지
크 이게 강의지
만족만족
주요 키워드
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 <네트워크이름>
- 웹 서비스를 제공하기 위한 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
- 새로운 서비스를 구축하기 위한 다음과 같은 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가 아니라 서브넷을 의미하는거였어?
- 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
- 현재 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
- 현재 사용중인 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
Leave a comment