도커는 기본적으로 컨테이너 단위로 동작한다고 알고계신 분이 많습니다. 실제로 동작만 보면 컨테이너 단위로 동작하는게 맞기도 하고요.
하지만 compose로 들어가면 달라집니다. 하나의 프로젝트(앞으로 스택이라 부른다면 프로젝트로 생각하시면 됩니다!)에 여러 컨테이너가 동작한다는거죠.

기본적으로 도커는 이와 같이 동작합니다. 도커라는 하나의 공유기 밑에 컨테이너라는 여러 디바이스가 연결이 되어있죠.

단순히 컨테이너만 만든 경우에는 Networks에 기본 모드인 bridge로 네트워크가 생성되지만 compose로 생성한 경우엔 compose_default로 네트워크가 생성됩니다.
도커 외부에서 컨테이너 A의 3000번 포트에 접근하기 위해서는 host:8000 으로 접근하면 됩니다.
도커 내부의 컨테이너 B에서 컨테이너 A의 3000번 포트에 접근하기 위해서는 A:3000 으로 접근하면 됩니다.
외부에서 내부로 접근하기 위해서는 도커가 열어놓은 포트만 접근이 가능합니다. 이 포트로 접근을 하면 도커가 알아서 a:3000 으로 호스팅을 해주죠.
하지만 도커 내부에서는 다른 컨테이너의 모든 포트에 접근이 가능합니다. 공유기의 포트포워딩이라 생각하면 되죠.

각 컨테이너가 각각 생성됩니다.

모든 compose up의 기본 스택은 docker입니다. 정확히는 docker compose up을 실행한 디렉터리 이름입니다.
도커 컨테이너를 쉽게 관리할 수 있게 해주는 도구입니다. yaml로 작성되어있으며 service 단위로 컨테이너를 관리합니다. 아래는 작성 예시입니다!
docker-compose.ymlversion: '3'
services:
database:
container_name: server_db
image: mariadb
ports:
- "3307:3306"
env_file:
- ../env/server.env
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- ../db/db_data:/var/lib/mysql
- ../db/db_config:/etc/mysql/conf.d
nginx:
container_name: nginx
image: nginx
ports:
- "80:80"
volumes:
- ../nginx/nginx.conf:/etc/nginx/nginx.conf
- ../nginx/log/error.log:/var/log/nginx/error.log
- ../nginx/log/access.log:/var/log/nginx/access.log
각 요소가 무엇을 의미하는지는 다른 분들이 더 잘 작성해주셨으니 작성된 다른 게시글을 참고하는게 좋아요!
docker-compose.yml 파일을 2개 만들어 각 파일을 compose up 해봅시다.
docker compose -f docker-compose.1.yml up
docker compose -f docker-compose.2.yml up
이렇게 2개의 스택을 만들어 하나의 스택에는 db와 nginx, 나머지 스택에는 서버 컨테이너가 동작하도록 하였습니다. 그리고 로그를 보면

데이터베이스 호스트를 찾을 수 없다고 합니다..? 분명 도커는 자체 DNS를 가지고 있고, 컨테이너 이름만 가지고도 해당 컨테이너에 접근을 할 수 있다고 했는데..?

도커 자체는 외부 포트와 내부 포트를 알고 있지만, 스택은 서로의 컨테이너가 무엇이 있는지 알지 못합니다.
Compose_1은 A,B만 알고있고 Compose_2는 C,D만 알고있죠. 따라서 Compose_1에서 Compose_2의 C 컨테이너에 접근을 하기 위해서는 ip를 알고있어야 합니다. 하나의 서버만 실행된다면 크게 문제는 없지만, 서비스가 늘어나거나 다른 물리적 host에서 실행이 된다면..? ip를 이용하여 직접 연결하는 것은 불가능하다고 생각됩니다.

실제로 서로의 공유기가 다르기 때문에 ip가 다를 수밖에 없고요.
이를 해결하기 위해 Docker Network를 이용하면 매우 쉽게 연결할 수 있게 되는거죠.

네트워크를 bridge모드로 생성하면 두 스택을 하나의 공유기 밑으로 묶어주기때문에 컨테이너 이름으로 접근을 할 수 있게 되었습니다!

생성하는 방법은 docker network create <name>. name 의 도커 네트워크를 생성하게 됩니다.
version: '3'
services:
server:
...
networks: --- 1
- rgback
# 이걸 필수로 넣어야 한다
networks: --- 2
rgback:
driver: bridge
external: true
internal: true
② 설정을 기입하지 않고 단순히 ① 설정만 넣는다면 네트워크를 찾지 못한다는 오류가 뜨면서 스택이 실행되지 않는다!
이것만 기억하시면 됩니다. 이 설정만 하면 네트워크가 생성되어 하나의 공유기로 묶이는 효과를 보게 되는거죠.

prod와 dev를 사용하기 위해 파일을 나누고 해당 구조에 맞게 compose 파일을 수정하였습니다.

이에 맞게 컨테이너의 이름도 바뀐 것을 볼 수 있죠.
그리고 실행을 해보니 아래의 warinig이 발생하였습니다.
WARN[0000] Found orphan containers ([dev-blue]) for this project.
If you removed or renamed this service in your compose file,
you can run this command with the --remove-orphans flag to clean it up.
error가 아니라 warning이 뜬 이유는 사용자가 같은 이미지를 다른 compose파일에 적고 설정도 잘 했을 것이다라고 판단했기 때문입니다. 만에 하나 잘못되면 이 부분을 확인해라~ 라는거죠.
이 부분을 한번 해결해봅시다.
compose를 하면 docker로 스택이 잡히게 됩니다. 스택의 이름이 다르다면 해당 문제가 해결되지 않을까요? 이러한 접근으로 해결을 해봅시다.
compose로 스택의 이름을 바꾸려면 -p, --project-name <name> 으로 compose 자체에 이름을 붙이면 됩니다. 이렇게 되면 도커는 compose를 서로 다르게 구분을 하게 됩니다.
// 1. project name 붙이기 전
docker
├── dev_nginx
├── dev_mariadb
├── prod_nginx
└── prod_mariadb
// 2. project name 붙인 후
prod
├── prod_nginx
└── prod_mariadb
dev
├── dev_nginx
└── dev_mariadb
이렇게 생성이 되므로 docker는 해당 warning을 발생시키지 않습니다. 즉 다른 스택으로 생성을 한다! 라는것이죠.
이제 다른 yaml 파일에 같은 이미지를 사용해서 compose up을 하여도 해당 warning이 발생하지 않습니다!
모든 브라우저는 10080 포트를 허용하지 않습니다. 완전 구형 브라우저가 아니라면 대부분 포트를 막아놓았습니다.
크롬, 엣지의 경우에는 바로가기에 --explicitly-allowed-ports=10080을 추가해주면 됩니다.

edge: 흠... 이 페이지에 연결할 수 없습니다.

firefox: 이 주소는 제한되어 있음

samsung internet: 일시적으로 다운되었거나...

opera: ERR_UNSAFE_PORT

whale: 웹페이지를 찾을 수 없어요.

safari V 17.2.1: 그 페이지 난 뭔지 모르겠고 blank 띄울래

IE: 난 모르겠고 그냥 다 접속시킬래