계속 프로젝트를 하면서 깊이 있게 알아가는 것들이 많은데 한 번에 정리해보려고 한다.
[volumes의 두 가지 용도]
1. Named Volume 데이터 영속성
volumes에 지금처럼 - minio-data:/data 라고 적어준 것은 named volume으로 minio-data는 도커 엔진이 관리하는 볼륨이다.
Named Volume을 사용하면 도커 전용 명령어로 해당 컨테이너 관리가 가능하고,
docker compose down으로 컨테이너를 완전히 삭제해도 데이터가 남아있다. (볼륨마저 지우려면 -v 옵션)
이 경우 하단에 volumes 옵션에 해당 볼륨을 꼭 정의 해줘야한다.
2. BindMount 호스트 - 컨테이너 간 실시간 공유
아니면 /home/ec2-user/:/home/ec2-user/petory 이런식으로 앞 경로 : 뒤 경로 형식을 적어주는 경우도 있는데
이것은 Bind Mount 라고 부른다.
이렇게 써주면 앞 경로의 서버경로와 뒤 경로의 컨테이너 내부를 연결해줄 수 있다.
[ports - 포트 포워딩]
앞 포트 : 뒤 포트 (9000:9000)
여기의 앞 9000 포트는 서버에서 사용하는 포트, 뒤 9000포트는 컨테이너 내부의 포트이다.
9000으로 들어오는 요청을 해당 컨테이너 9000번 포트로 연결해준다는 의미이다.
만약 정의된 두개의 포트 정보에 뒷 포트가 8080으로 같다면 포트 충돌이 일어날까 ?
-> 정답은 NO. 그냥 그 컨테이너로 들어가는 입구가 2개인 셈
*** 모든 컨테이너의 포트를 밖으로 열어줄 필요는 없다. ***
DB나 Redis처럼 백엔드 서버 내부에서만 사용하는 서비스들은 ports 설정을 생략하는 것이 보안상 훨씬 안전하다.
같은 도커 네트워크 안에서는 서비스 이름으로 모든 포트에 자유롭게 접근할 수 있기 때문이다.
이것이 바로 도커가 제공하는 강력한 네트워크 격리(Isolation) 기능이다.
[networks]
네트워크를 만드는 방법은 2가지 인데
1. 도커 컴포즈가 자동으로 만들기
services:
petory-minio:
networks:
- petory-network
networks:
petory-network:
이 네트워크는 컴포즈 파일과 생명주기를 같이한다.
2. 외부에서 미리 만든 네트워크 사용하기 - 서로다른 컨테이너들끼리 통신할 때 !
network:
petory-network:
external: true
터미널에서 직접 명령어를 입력해서 만들어야 하며 external: true 옵션을 꼭 넣어줘야한다.
docker network create petory-network
이렇게 만든 네트워크는 서버를 껐다 켜도 사라지지 않는다.
외부에서 만든 네트워크를 사용하는 이유는 서로 다른 컴포즈 파일에서 컨테이너들끼리 통신하기 위함이다 !
나같은 경우 spring backend, db가 적힌 docker-compose와 redis, elasticsearch, minio등이 있는 infra-compose가 별도로 구성되어있다.
redis, es, minio는 spring 프로젝트와 통신해야하므로 petory-network로 묶어주었다.
또한 외부와 통신해야하는 backend 시스템과 minio는 외부에서 생성한 npm-network로 연결하여 NPM과 서로 통신할 수 있게 하였다. (NPM 컨테이너도 npm-network와 연결되어있기 때문에 같은 네트워크에 있는 애들끼리 통신이 가능한 것!!! )

같은 네트워크에 있으면 ports 설정 없어도 컨테이너 명으로 컨테이너들끼리 통신이 가능하다.
*** 같은 Docker 네트워크 안에서는 컨테이너 이름으로 모든 포트에 접근 가능. ***
ports를 설정하는 것은 내 호스트의 포트와 컨테이너 포트를 연결해달라는 의미이다 !
따라서 DB, Redis같은 외부와 연결 될 필요 없는 컨테이너들은 ports를 적어주지 않는게 보안상 좋다.
'공부 > CI & CD' 카테고리의 다른 글
| Jenkins로 CI/CD 구축하기 - (3) Jenkis Webhook 등록으로 Repo에 Push 하면 자동빌드 하기 (4) | 2024.08.09 |
|---|---|
| Jenkins로 CI/CD 구축하기 - (2) Jenkis CI/CD 파이프라인 구축하기 + Credentials 등록 (0) | 2024.08.09 |
| Jenkins로 CI/CD 구축하기 - (1) EC2 docker에 Jenkis 설치 및 SWAP 메모리 할당 (0) | 2024.08.07 |
| GiftFunding) GitHub Actions CI/CD 적용하기[2] - CD 적용(2) (5) | 2024.06.29 |
| GiftFunding) GitHub Actions CI/CD 적용하기[2] - CD 적용(1) (0) | 2024.06.29 |