도커 네트워크는 컨테이너들이 서로 통신하고, 외부 호스트나 인터넷 통신할 수있도록 해주는 가상 네트워킹 기능입니다. 도커는 리눅스 커널의 네트워킹 기능을 활용하여서 컨테이너간의 격리및 연결을 관리하는 역할을 합니다. 하지만 이렇다고 해서 전통적인 리눅스 컨테이너랑은 완전히 다른데요. 왜냐하면 존속적인 관계가 벗어낫기때문입니다.
컨테이너 사이 통신
서비스 접근
격리
브릿지
작동 원리
브릿지 네트워크에서 할당된 IP 주소로 각각의 컨테이너는 서로 통신이 가능 합니다.
외부의 호스트에서 컨테이너를 접근 하려면 포트포워딩이 필요 합니다..
사용 사례:
포트 포워딩이란?
호스트의 포트와 컨테이너 포트를 연결하는 옵션입니다(p 옵션)
호스트
설명
작동 방식:
사용 사례:
없음
설명: 영어로는 None인 해당 용어는 컨테이너 내부에 루프백 인터페이스에만 존재하며, 외부 네트워크와 관련없는 완전 쌩판 남인 환경을 가지고 있습니다.
사용 사례:
루프 백이란?
IPv4 또는 IPv6 에서 자기 자신을 가르키기 위한 목적으로 사용되는 예약된 IP 주소. 즉 현재 작업중인 컴퓨터를 대상으로 인지하기위한 설정된 IP 주소 공간으로 이더넷 장치가 물리적으로 연결 되어있지 않더라도 현재 작업중인 컴퓨터가 연결의 대상이 된다는 뜻을 가진다.
오버레이
둘중에 하나라도 만족 한다면 통신이 가능합니다.
도커 네트워크 생성
브릿지입니다# 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로 통신하기
브릿지로 자동 네트워크 연결이 됩니다.-p와--publishdocker container run\
-p:3001:3000\
juno/marketplace
:을 기준으로 왼쪽에는 외부 네트워크 포트작성합니다.:을 기준으로 오른쪽에는 공개할 컨테이너 포트작성합니다.호스트 머신 네트워크에 포트 공개
(--expose | EXPOSE) +(-P + --publish-all)
docker container run\
-P\
juno/marketplace
dockerfile의EXPOSE 명령어나 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
레이어 캐시 최대한 이용하기
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"]
```