도커를 이용한 네트워크

Juno_Dev1·2025년 11월 24일

DOKER

목록 보기
4/4

개요

  • 네트워크 사용하기
  • 볼륨 사용하기
  • docker Compose
  • 이미지 최적화

내용

네트워크 사용하기

도커 네트워크는 컨테이너들이 서로 통신하고, 외부 호스트나 인터넷 통신할 수있도록 해주는 가상 네트워킹 기능입니다. 도커는 리눅스 커널의 네트워킹 기능을 활용하여서 컨테이너간의 격리및 연결을 관리하는 역할을 합니다. 하지만 이렇다고 해서 전통적인 리눅스 컨테이너랑은 완전히 다른데요. 왜냐하면 존속적인 관계가 벗어낫기때문입니다.

  • 도커 네트워크의 필요성

    • 컨테이너 사이 통신

      • 여러 컨테이너가 데이터를 주고 받기위해서 필요합니다
    • 서비스 접근

      • 외부 사용자나 호스트 머신이 컨테이너 내부에 접근 하려면 포트에 연결 해야 합니다.
    • 격리

      • 컨테이너 간의 네트워크를 격리 시켜서 보안을 유지하고 충돌을 방지 합니다.

  • 주요 네트워크 드라이버 유형

    브릿지

    • 설명:
      • 도커를 설치하면 기본적으로 생성되는 네트워크 유형입니다
      • 컨테이너 들은 가상의 소프트웨어 브릿지를 통해 서로 통신을 한답니다.
    • 작동 원리

      • 브릿지 네트워크에서 할당된 IP 주소로 각각의 컨테이너는 서로 통신이 가능 합니다.

      • 외부의 호스트에서 컨테이너를 접근 하려면 포트포워딩이 필요 합니다..

    • 사용 사례:

      • 단일 호스트 머신에서 독립적인 애플리케이션을 격리할때 자주 이용합니다.

포트 포워딩이란?
호스트의 포트와 컨테이너 포트를 연결하는 옵션입니다(p 옵션)

호스트

  • 설명

    • 컨테이너가 호스트 머신의 네트워크 스택을 공유합니다
  • 작동 방식:

    • 컨테이너는 호스트와 동일한 ip 주소와 포트공간을 사용하며
    • 따라서 포트 포워딩이 필요가 없고, 컨테이너가 특정 포트를 사용중이라면, 다른 포트는 그 포트를 사용할 수 없어요.
  • 사용 사례:

    • 네트워크 오버헤드를 줄여 최고의 성능을 발휘하지만, 보안 격리 능력에서는 떨어진다라는 ...

    없음

  • 설명: 영어로는 None인 해당 용어는 컨테이너 내부에 루프백 인터페이스에만 존재하며, 외부 네트워크와 관련없는 완전 쌩판 남인 환경을 가지고 있습니다.

  • 사용 사례:

    • 네트워크 연결이 필요없거나, 보안상의 이유로 외부통신을 차단해야하는 컨테이너에서 자주 사용됩니다.

      루프 백이란?
      IPv4 또는 IPv6 에서 자기 자신을 가르키기 위한 목적으로 사용되는 예약된 IP 주소. 즉 현재 작업중인 컴퓨터를 대상으로 인지하기위한 설정된 IP 주소 공간으로 이더넷 장치가 물리적으로 연결 되어있지 않더라도 현재 작업중인 컴퓨터가 연결의 대상이 된다는 뜻을 가진다.

    오버레이

    • 설명:영어로는 overlay 로 여러 호스트 머신에 걸쳐 분산된 컨테이너간의 통신을 가능 하게 합니다.
    • 사용 사례:
      Docker Swarm,Kybernetes 와 같은 클러스터 환경에서 컨테이너 오케스트레이션을 위해서 사용됩니다.
  • 네트워크 격리 이해하기

    • 네트워크 통신이 가능 하기 위한 조건으로는 통신을 하고자 하는 장치가 네트워크 망 내부에 존재해야 합니다
    • 컨테이너 역시 동일 네트워크에 속하지 않는 장치로 부터 요청을 처리 할 수없습니다.
  • 컨테이너 통신 조건

    둘중에 하나라도 만족 한다면 통신이 가능합니다.

    • 동일한 네트워크 망에 있는가
    • 호스트 머신네트워크에 포트 공개를 통한 네트워크 통신
  • 도커 네트워크 생성

    • -d: 드라이버를 지정할수 있으며, 기본 값은 브릿지입니다
# docker network create [네트워크 이름]
docker network create marketplace-network
  • 도커 네트워트 조회

    docker network ls
  • 도커 네트워트 삭제

    docker network rm
    docker network prune
  • 도커 네트워트 연결(컨테이너 실행시)
    docker containter run명령어의 --network 옵션을 연결

    docker container run
    ...
    --network marketplace-network
    juno/market
  • 도커 네트워트 연결(컨테이너 실행중)
    docker network connect 으로 연결 할수있다.

    docker netword connect[네트워크][컨테이너]
    docker network connect marketplace-network marketplace-app
  • 컨테이너가 사용중인 네트워크 확인하기

    docker container inspect [컨테이너]
    docker container inspect marketplace-app
  • 네트워크 확인 해보기
    curlimages/curl 이미지를 통해 curl 명령어 사용 가능
    컨테이너 실행하기

    docker container run\
    -- network marketplace-network\
    -- rm \
    -- name curl-test\
    curlimages/curl
    
    docker containter run\
    -- name curl-test\
    -- rm\
    -it\
    --network other-network\
    curlimages/curl sh

    컨테이너에 명령어 실행

    docker container exec -it curl-test
    
    # container 내부
    curl marketplace-app:3000 # DNS 로 통신
    curl 172.18.0.2:3000# IP로 통신하기
  • 만약 컨테이너에 별도의 네트워크를 설정하지 않으면 브릿지로 자동 네트워크 연결이 됩니다.
  • 기본 네트워크와의 큰 차이점은 DNS를 통한 통신 입니다.
  • 기본 네트워크 연결시 DNS의 값은 null 입니다.
  • 호스트 머신과 포트 바인딩
    -p--publish
docker container run\ 
-p:3001:3000\
juno/marketplace
  • 콜론 :을 기준으로 왼쪽에는 외부 네트워크 포트작성합니다.
  • 콜론 :을 기준으로 오른쪽에는 공개할 컨테이너 포트작성합니다.
  • 해당 명령어는 3001인 호스트 포트로 들어온 네트워크 요청을 marketplace-app 의 3000번 포트에서 처리 한다 는 내용입니다
  • 호스트 머신 네트워크에 포트 공개
    (--expose | EXPOSE) +(-P + --publish-all)

    docker container run\ 
    -P\
    juno/marketplace
    
  • 노출된 포트를 호스트 머신의 임시 포트와 바인딩을 합니다. dockerfileEXPOSE 명령어나 docker container run --expose 옵션으로 정의 하며, 노출된 해당 포트는 컨테이너 정보에서 알수 있습니다.
  • 통신 확인
    curl test 컨테이너 생성

    docker container run\
    --name curl-test\
    --rm \
    -it \
    --network other-network\
    curlimages/curl sh

    잠깐 sh 언니 설명하고 가실께요~~~
    sh는 쉘 스크립트로 unix나 linux와 같은 운영체제에서 명령어를 자동으로 실행 시키기위한 스크립트입니다.

    docker container exec -it curl-test sh
    curl my-app:3000 #DNS로 통신 (X)
    curl 172.18.0.2:3000 #IP로 통신(x)
    curl host.docker.internal:3001 # host 머신에 네트워크 요청
  • 컨테이너 내부에서 호스트 머신에 요청을 보낼때 host.docker.internal에 보내야합니다.

  • localhost 는 loofback을 의미하기에 땡~

  • 저기 위에 에서 user defined-bridge가 아니므로(즉 기본값이 bridge)이므로 해당 통신들이 안된다는 점


볼륨 사용하기

  • 컨테이너의 휘발성
    컨테이너에 담긴 데이터는 컨테이너가 재시작/ 종료/ 삭제 시에 휘발적으로 삭제 됩니다.

  • 불륨
    위와 같은 문제를 방지 하기 위해서 컨테이너 내부에 특정 디렉토리에 마운트 합니다

    컨테이너 실행간 불륨과 마운트 된 컨테이너 내부의 디렉토리에 변경이 일어나면, 불륨에 동일하게 반영 -> 데이터 손실 방지

    마운트란 ? 맨유에서 No7 메이슨 마운트가 아닌 특정 디렉토리와 컨테이너와의 연결을 의미합니다. (마운트야 부상없이 잘해줘 ㅜㅜ)

  • 볼륨 생성하기

    docker volume create volume-a
  • 볼륨 조회하기

    docker volume ls
  • 볼륨 삭제하기

    docker volume rm
    docker volume prune
  • 컨테이너에 불륨 연결하기(명령어)

    docker container run -v volume-a:Users/marketplace/container:app node sh # users 내에 있는 중고 마켓 컨테이너들을 app에 연결 하겟다는 말
    • 첫번째 값
      불륨의 이름입니다. 만약 존재하지 않은 불륨이면 자동으로 생성됩니다. 생략이 가능하며, 익명 불륨이 된답니다.

    • 두번째 값
      불륨에 마운트할 컨테이너 내부 경로입니다. 생략 불가능이며, 존재 하지않는 경로 이면 자동으로 생성 됩니다.

    • 세번째 값
      읽기 쓰기 모드 옵션

      ro rw두가지 값만 입력 가능. 기본값은 rw입니다
      ro: 읽기 전용,rw: 읽기/ 쓰기 전용

  • 컨테이너에 불륨 연결하기(도커 파일)

    FROM ubuntu
    VOLUME /Users/marketplace/container

    컨테이너 실행시 익명 불륨 생성

  • 컨테이너 불륨 정보확인하기

    docker container inspect[컨테이너]
  • 불륨 기능 확인 하기

    • 불륨연결
    docker container run\
    -v my-vol:/my-container\
    --name volume-test
    -it
    -- rm\
    busybox sh
    • 파일 만들기
    docker container exec -it volume-test sh
    echo "hello Volume" > my-container/hello.txt
    ls /my-container
    • 컨테이너 삭제및 생성
    docker container rm -f volume-test sh
    docker container run\
    -v my-vol:/my-container \
    --name volume-test\
    -it\
    --rm\
    busybox sh
  • 바인드 마운트
    바인드 마운트란 ? 호스트 머신의 특정 경로와 컨테이너 내부의 특정 경로를 마운트 하는 방법으로 불륨과 유사하지만 마운트 포인트가 도커에서 관리한다라는 부분에서 차이점이 존재 합니다

    • 불륨

      • 도커환경에서 모두 동일하게 동작을 보장하며 이식성이 뛰어남
    • 바인드 마운트

      • 호스트 머신과 종속적인 관계라 이식성이 떨어짐
  • 바인드 마운트 적용하기
    불륨 적용 방식과 동일하게 -v 옵션으로 적용합니다. 하지만 첫번째 값은 호스트 머신의 경로로 지정합니다

    docker container run -v /Users/marketplace/host:/app:ro

docker Compose

  • 컨테이너가 많아지면 불편함
    * 이미지를 각각 빌드 해야 하며, 옵션들을 각각 관리 해야며
    • 컨테이너를 각각 실행
    • 컨테이너간의 구동 순서를 직접 제어
    • 통일된 방식이 없다
      는 단점이 있어요.
  • 도커 컴포우즈 소개
    위와 같은 문제를 해결하기 위해서 도커 컴포우즈가 나왔답니다.
    다중 컨테이너를 도커 컨테이너 하나로 묶어서 관리하고 싶을때 쓰는 명령줄 입니다.
    너무 길어서 다음 포스트에 사용 법을 올릴게요

이미지 최적화

  • 레이어 캐시 최대한 이용하기
    dockerfile 명령 하나 하나 각각의 레이어가 됩니다.
    이미지 빌드시 이미 존재하는 레이어 인경우 그대로 사용하며 이를 레이어 캐싱 이라고 명명합니다. 레이어 캐싱은 이미지 빌드 시간을 줄여주는 경향이 있기에 주로 도커 파일의 하단부에 위치 합니다.

  • 크기가 작은 베이스 이미지 선택하기
    아무리 같은 역할을 하는 이미지일지라도 크기가 작을수도 클수도 있습니다.보통은 개발용 모듈이 포함된 이미지| 배포용 이미지로 나눠집니다.

  • 멀티 스테이지 빌드
    멀티 스테이지란? 하나의 도커 파일에서 이미지를 빌드 하는 과정을 여러개로 나누어 정의 하는 방식 입니다. 주로 빌드를 해야하는 애플리케이션인 경우 빌드 | 실행 따라 나누어 집니다.

    ```Docker
    	# 빌드 스테이지
    	ARG NODE_VERSION
    	FROM node:${NODE_VERSION} AS build-stage
    	# 빌드 
    	WORKDIR /build
    	# 이미지 빌드 간 복사할 파일: 소스 코드 복사
    	COPY . /app/
    	# 이미지 빌드 시 실행할 명령어: 종속성 설치 및 빌드
    	RUN npm ci && npm run build
    
    	# 실행 스테이지
    	FROM node:${NODE_VERSION}
    	COPY --from=build-stage /build/dist /app
    	RUN npm ci --only=prod
    	ENV SERVER_PORT=3000
    	# 컨테이너 실행 시 수행할 명령어: express 서버 실행
    	ENTRYPOINT ["npm", "run", "start"]
    	```

0개의 댓글