Dangil project(10)

Junyoung·2024년 5월 23일

Dangil Project

목록 보기
10/20

다음으로는 해당 프로젝트를 진행하며 가장 많이 고민하고 또 헷갈렸던 부분이다.

도커 네트워크를 제대로 이해하고 내부 네트워크를 통한 처리를 구현하려고 한다...

그 전에 사설, 공인 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 설정을 붙여서 사용한다 !

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

참고
Docker Network1
Docker Network2

profile
라곰

0개의 댓글