학습주제
도커 제공해주는 샘플 애플리케이션 메뉴얼 실행.
docker-compose로 변환
학습내용
https://github.com/dockersamples/example-voting-app
깃헙 리포로 존재하고 있음.
총 5개의 컨테이너로 구성되고 있음.
고양이, 개가 좋은지 투표. 그 결과를 앱으로 출력
voting app에서 투표를 받아서
in-memory DB redis로 들어간 뒤
Worker .net 보고 있다가 그 카운트를
db postgreSQL에 저장
NodeJS는 그걸 읽어다 투표 결과를 알려줌.
https://github.com/dockersamples/example-voting-app
깃 클론으로 받아다가 각 컨테이너를 이미지로 빌드
도커 허브 오피셜 이미지 받을 예정.
5개의 컨테이너를 docker-compose로 한번에 관리 실행해본다.
왼쪽이 투표, 오른쪽이 결과
docker-compose.yml 파일이 보인다
5개의 컨테이너가 있는데, 3개는 이 exampe을 기반으로 하고 있음
result, vote, worker.
result에 들어가면
vote
각자 폴더에 Dockerfile이 있는 것을 확인할 수 있다.
클론 후 들어가본다
vote, result, worker를 이미지 빌딩해야한다
이제는 현재 디렉토리에 도커 파일이 있는게 아니기에 ./vote, ./result 식으로 도커파일 위치를 지정해준다
각자 이미지를 빌드한다.
docker build -t vote ./vote
docker build -t result ./result
docker build -t worker ./worker
3개 이미지가 새로 생성된 걸 확인.
redis, postgres는 공식 이미지가 있어서 별도로 빌드 안해도 된다.
각 이미지를 컨테이너로 실행시켜 본다.
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 에러남
result도 에러남
컨테이너들에게 이름을 줘서 관리하게 쉽게 만듦.
요즘버전의 postgres를 돌릴때에는 루트 컨테이너의 비밀번호를 지정해주게 되어있음 password라고 비밀번호를 지정. -e POSTGRES_PASSWORD=비번
일단 방화벽 가서 포트 열어줬음
워커는 외부에서 접속할 필요가 없어서 포트매핑 안함.
현재는 동작하지 않음. 커넥션이 되지 않음.
각 컨테이너가 연결되어 있어야 함.
별도의 분리된 공간에서 돌다보니까 서로의 존재를 모름.
네트워크와 관련된 과정이 있음
3개의 앱 같은 경우 코드를 보면
vote는 플라스크로 만들어져 있음 redis와 커넥션이 되어 있음.
vote 컨테이너에 로그인해서 ping 유틸리티 설치해서 ping redis를 실행해볼 예정.
그럼 뭔지 모른다고 오류날 것임.
루트 유저로 로그인해서 apt-install iputils-ping
네트워크 세팅 후 다시 또 확인
result로 가보면
postgres와 연결하기위해 db에 연결.
@ 다음에 오는건 db의이름/postgres
postgres 컨테이너에 sh로 로그인해서 postgres db 만들고 어카운트 만들고.
워커는
투표한 내용을 가져다 결과
redis, db 다 연결해야함.
이전엔 run 이후 link 옵션이 있어서 매핑이 있었음.
network이라는 컨셉이 생기면서 같이 연결해야하는 컨테이너들을 같은 네트워크로 넣어줌.
voting app이
front - vote, result
back - redis, postgres, worker
이번엔 mynetwork 만들고 그냥 다 넣을 예정. 논리적으로 생각해보면 컨테이너가 모두를 알 필요는 없긴 함. 그러나 저렇게 넣으면 서로 인지할 수 있음
일단 현재 컨테이너 모두 정리
mynetwork이라는 새로운 네트워크 생성
그다음 5개 컨테이너 실행할 때 --network mynetwork
으로 묶어줌.
그 전에 ping을 하면 모른다고 뜨지만 이렇게 실행하면, 이때는 에러가 안나고 커넥션이 이뤄짐.
docker container rm -f $(docker container ls -aq)
docker network rm mynetwork
docker network create mynetwork
docker run -d --name=redis --network mynetwork redis
docker run -d -e POSTGRES_PASSWORD=password --name=db --network mynetwork postgres
docker run -d --name=vote -p 8001:80 --network mynetwork vote
docker run -d --name=result -p 8002:80 --network mynetwork result
docker run -d --name=worker --network mynetwork worker
또 같은 포트 접근 에러가 난다.
관리자 권한으로 엔진을 다시 실행해본다
실패.
5000대를 8000대로 바꾸어보니 되는거 같음.
docker run -d --name=vote -p 8001:80 vote
docker run -d --name=result -p 8002:80 result
8000번대로 돌리니까 잘 실행됨.
아직 postgres db 생성을 하지 않아 투표가 넘어가지 않음
postgres의 경우 미리 비밀번호를 넣어주지 않으면 에러를 낸다.
처음 run이라고 실패하면 컨테이너에 stopped 상태에 남아있게 되어 새로 컨테이너를 만들려면 이전 컨테이너를 지워야 한다.
처음엔 네트워크 커넥션 없이 실행하면 화면은 제대로 보임
에러가 남.
voting을 하게되면, 이게 redis - worker - postgres db
하나씩 실행해본거지 네트워크 커넥션을 잡아주진 않았음
결과도 마찬가지.
네트워크 세팅을 해줘야 함. 핑으로 확인하는 예를 보여줬었는데 이걸 먼저 해본다
vote에 들어가 redis와 연결되었는지 확인
핑으로 구글을 주면 이렇게 뜸
winpty docker exec -it --user=root vote sh
apt update
apt install iputils-ping
ping redis
뭐지 난 네트워크 설정했는데도 못잡아주네?
네트워크 다시 만들었음
네트워크 옵션을 사용해서 mynetwor크 지정
컨테이너 5개 돌아감
이번에 투표 시도함
역시 실패함.
그러나 실습때는 성공함. 왜그러지?
8000번 포트에 ping redis로 날리니까 잘 날아감.