문제상황
다수의 Container로 구성된 소프트웨어를 실행했을때, 각 컨테이너를 실행하면 네트워크가 연결되어 있지 않아 정상적인 실행이 되지 않음
각 컴포넌트 간의 network 연결이 필요!
Voting application 소개
GitHub에 공유된 dockersamples 예제 프로그램.
voting-app에서 Cat인지, Dog인지 투표하고 result-app에서 결과를 보여주는 프로그램
5개의 컨테이너로 구성된 멀티 컨테이너 형태
[관련 깃헙] voting-app
GitHub - dockersamples/example-voting-app: Example distributed app composed of multiple containers for Docker, Compose, Swarm, a
Example distributed app composed of multiple containers for Docker, Compose, Swarm, and Kubernetes - dockersamples/example-voting-app
github.com
위의 깃헙 repo를 확인하면 result, vote, Worker 폴더가 있다. 각 폴더 안에 Dockerfile을 수정해서 실습할 예정!
voting -app 구조 확인

실습
1. git clone
GitHub - dockersamples/example-voting-app: Example distributed app composed of multiple containers for Docker, Compose, Swarm, a
Example distributed app composed of multiple containers for Docker, Compose, Swarm, and Kubernetes - dockersamples/example-voting-app
github.com
2. vote, result, worker 빌드하기
$ docker build -t vote ./vote
$ docker build -t result ./result
$ docker build -t worker ./worker
redis와 postgres는 공식 이미지(official image)라 따로 빌드하지 않음
$ docker images
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
result latest eee45fd4ebc5 50 seconds ago 343MB
worker latest c78e50f46755 2 hours ago 287MB
vote latest fcdb5f99521f 2 hours ago 257MB
3. 컨테이너 실행하기
이렇게 각각 별도의 공간에서 실행하면 브라우저에서 실행이 제대로 되지 않음
$ docker run -d --name=redis redis
$ docker run -d -e POSTGRES_PASSWORD=password --name=db postgres
$ docker run -d --name=vote -p 5001:80 vote
$ docker run -d --name=result -p 5002:80 result
$ docker run -d --name=worker worker
vote localhost:5001 에서 투표를 하면 redis로 넘어가지 않아서 Internal Server Error 발생


result localhost:5002도 db를 반영하지 않은 화면 출력

위에 방식으로 진행했다면 컨테이너 전부 삭제한 후 컨테이너 실행(run)부터 다시 해줘야함
$ docker container rm -f $(docker container ls -aq)
왜 안되는지 확인해보자!
우선, vote 앱에서 확인
vote/app.py 파일 안에 def get_redis() 있음
$ docker exec -it --user root vote sh
root권한으로 로그인 후 ping redis 명령어 실행, ping이 없다고 나옴.
# ping redis
sh: 1: ping: not found
ping 실행을 위해 apt update 후 관련 모듈 설치 해주기
# apt update
# apt install iputils-ping
다시 ping redis 명령어를 보내면 ping: redis: Name or service not known 라고 응답이 옴
→ redis와 네트워크 연결이 되어있지 않음을 확인함
# ping redis
ping: redis: Name or service not known
# exit
다음으로 result 서버 확인
result/server.js 내에 db 정보 필요
connectionString:
'postgres://postgres:postgres@db/postgres'
postgres docker container ssh 로그인 > 관계된 sh 띄우고> db랑 id, password를 갖는 어카운트 만들기(POSTGRES_USER: "postgres", POSTGRES_PASSWORD: "postgres" 2개의 환경변수 넘겨줘야함)
마지막으로 worker 확인시,
worker/Program.cs 파일 내에 db, redis 정보 전달 필요
var pgsql = db
var redisConn= redis
Docker Network 연결
최종적으로는 docker compose 이용해서 두개의 네트워크 컨테이너 생성
- back-tier redis, db, worker
- frot-tier vote, result
우선 하나의 컨테이너에서 연습
docker network create
$ docker network create mynetwork
--network mynetwork 옵션을 줘서 하나의 네트워크로 묶어주기
$ docker run -d --name=redis --network mynetwork redis
$ docker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgres
$ docker run -d --name=vote --network=mynetwork -p 5001:80 vote
$ docker run -d --name=result --network=mynetwork -p 5002:80 result
$ docker run -d --name=worker worker --network mynetwork worker
$ docker ps
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a19f98d3b97d result "/usr/bin/tini -- no…" 2 seconds ago Up 2 seconds 0.0.0.0:5002->80/tcp result
3861e7330cf1 worker "dotnet Worker.dll -…" 13 minutes ago Up 13 minutes worker
d082df12244a vote "gunicorn app:app -b…" 14 minutes ago Up 14 minutes 0.0.0.0:5001->80/tcp vote
08c75973e9bc postgres "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 5432/tcp db
a280e07250dc redis "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 6379/tcp redis
브라우저에서 실행 확인
vote localhost:5001 투표가 가능

위에 방법과 똑같이 ping redis 해주기. 연결 확인!
# ping redis
PING redis (172.20.0.2) 56(84) bytes of data.
64 bytes from redis.mynetwork (172.20.0.2): icmp_seq=1 ttl=64 time=0.464 ms
64 bytes from redis.mynetwork (172.20.0.2): icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from redis.mynetwork (172.20.0.2): icmp_seq=3 ttl=64 time=0.025 ms
64 bytes from redis.mynetwork (172.20.0.2): icmp_seq=4 ttl=64 time=0.038 ms
64 bytes from redis.mynetwork (172.20.0.2): icmp_seq=5 ttl=64 time=0.096 ms
🔐 세부적으로 관련 환경 변수를 세팅하지 않았기 때문에 실제로 db나 redis에는 반영되지 않는 걸로 확인됨
🧐 docker-compose 사용하기
docker-compose를 이용하면 -p 5001:80 vote --network mynetwork vote 같이 개별적으로 지정 필요 없이 한번에 관리 가능
Docker Network voting application 예제 프로그램 (2) compose 사용
문제상황다수의 Container를 실행했을 때 네트워크 오류가 발생하여 각 컨테이너를 빌드할 때 일일이 네트워크 설정을 해주었는데 그룹으로 묶어 한번에 관리하고자 한다.투표는 되지만 투표결
ourjune.tistory.com
'데브코스 데이터엔지니어링' 카테고리의 다른 글
| .dockerignore (0) | 2024.11.19 |
|---|---|
| Docker Volume mount 마운트 (0) | 2024.11.19 |
| Docker 환경 클린업 방법 컨테이너, 이미지 삭제, Troubleshoot clean (0) | 2024.11.19 |
| Docker Volume (0) | 2024.11.19 |
| Docker 명령어 정리 Image, Hub, Container, logs, exec, Volume (0) | 2024.11.19 |