Docker Network voting application 예제 프로그램(1)

문제상황

다수의 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