다음으로는 해당 프로젝트를 진행하며 가장 많이 고민하고 또 헷갈렸던 부분이다.
도커 네트워크를 제대로 이해하고 내부 네트워크를 통한 처리를 구현하려고 한다...
그 전에 사설, 공인 IP에 대한 개념을 먼저 학습했다 !
🌐 IP 기초 (사설IP / 공인IP / NAT) 개념 정말 쉽게 정리
그래서 내부에서 사설 IP로 요청을 보내게 된다면 외부로 나가는 것이 아닌 자신의 IP 사설에 요청을 보내게 된다 !
ifconfig 명령어를 통해서 현재 사용하는 리눅스 IP를 확인해보자
도커 가상머신은 컨테이너 로드시 IP를 할당받는다.

위 사진처럼 새로운 IP를 할당 받는것을 볼수있다.
docker0은 docker의 기본적인 도커의 main 이라고 할수있다.

다음으로는 이더넷를 확인해보겠다 .

컨테이너를 실행시키게 된다면 다음과 같이 기본적으로 IP를 할당받고, docker0 과 연결 다리인 가상 이더넷이 형성된다.
이를 통해 docker0 과 통신이 가능해진다 !
또한 docker의 기본 DNS 기능으로 컨테이너 이름으로 해당 가상 머신에 접근이 가능해진다.
해당 컨테이너들에 접근하기 위해서는 ex) http://mysql:3306 이렇게 들어가면 컨테이너 주소를 찾아가준다.
도커의 기본 네트워크가 아닌 커스텀 네트워크를 통해서 서비스를 구축하려고 한다
docker network create today-net
compose 파일들에 해당 네트워크로 묶어준다 !
networks:
default:
name: today-net
external: true
이전에 생성한 네트워크를 사용하겠다는 설정이다.
도커의 설정 가능한 네트워크 type은 3개이다.
호스트 네트워크: 컨테이너가 호스트의 네트워크 네임스페이스를 공유합니다. 이는 컨테이너가 호스트와 동일한 네트워크 설정을 가지게 되며, 호스트의 IP 주소를 직접 사용할 수 있습니다. 이 옵션은 네트워크 격리(isolation)을 제공하지 않으며, 따라서 보안 측면에서 취약할 수 있습니다.
브리지 네트워크: Docker가 자동으로 생성한 가상 브리지에 컨테이너를 연결합니다. 이는 컨테이너 간의 통신을 가능하게 하고, 호스트와 격리된 네트워크 환경을 제공합니다. 각 컨테이너는 고유한 IP 주소를 가지며, Docker가 제공하는 DNS 서버를 통해 이름으로 서로를 찾을 수 있습니다. 또한 포트 포워딩을 통해 호스트와 컨테이너 간의 트래픽을 라우팅할 수 있습니다.
none 네트워크: 컨테이너에 네트워크를 연결하지 않습니다. 이 옵션은 완전한 네트워크 격리를 제공하며, 컨테이너가 완전히 고립되어 있는 환경을 만듭니다. 주로 보안 요구 사항이 높은 환경에서 사용됩니다.
도커 네트워크는 따로 지정된다 !
엔진엑스를 그냥 EC2 에 띄운다면 !
localhost → 는 EC2 주소 이고
도커를 사용한다면 도커 즉 컨테이너의 ip 주소로 로드밸런싱을 진행해야 한다 !
해당 학습을 통해 네트워크의 기본 개념과 docker 네트워크를 이해할수 있었다.
이제 해당 네트워크로 컨테이너들을 묶어서 실행 시켜보자
vi docker-compose
version: '3'
services:
nginx:
container_name: nginx
image: nginx:latest
restart: always
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./nginx/service-url.inc:/etc/nginx/conf.d/service-url.inc
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
ports:
- 80:80
- 443:443
command: '/bin/sh -c ''while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g "daemon off;"'''
mysql:
:container_name: mysql
image: mysql:8.0
restart: always
expose:
- 3306
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Seoul
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- ./data/mysql/:/var/lib/mysql
jenkins:
container_name: jenkins
image: jenkins/custom
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /jenkins:/var/jenkins_home
expose:
- 9999:9999
environment:
JENKINS_OPTS: --httpPort=9999 --prefix=/jenkins
certbot:
container_name: certbot
image: certbot/certbot
restart: unless-stopped
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
networks:
default:
name: app-net
external: true
docker compose -f docker-compose.yaml up -d
실행시 백그라운드 실행을 위해 -d 설정을 붙여서 사용한다 !

학습을 위해 직접 네트워크와 컨테이너를 그려봤다.