학습주제
학습내용
3가지 스테이지로 나눔.
환경설정 파일을 통해 앱 구성하는 서비스, 이미지 무엇이고, 어떤 포트넘버 사용하고, 도커 볼륨 세팅이 어떻게 되는지, 이미지 구성이 되어 있던 기본 실행 명령 등을 오버라이드 해야하는 지.
도커 볼륨이나, 네트워크 설정 명령이 있음
만일 다른 파일 이름으로 돌릴 경우 -f 옵션주고 파일명 적으면 됨
환경설정 파일은 여러버전을 갖고, 운용함.
관리자 입장에선 굉장히 생산성이 올라감. 컨테이너를 묶어서 관리 가능, 실행가능해서.
복잡도가 조금 올라감.
얻는 이점이 더 큼.
굉장이 많은 명령어들이 있음.
up을 하면 yml 가져다 이미지 빌드해서 컨테이너 생성해서 실행.
down은 중지, 삭제. 이미지들은 로컬에 있음
pull은 허브에서 가져올 수 있으면 가져옴
데스크탑 일부로 설치됨. 엔간하면 1.27 이후버전
2.18버전임.
docker-compose
docker compose 명령어 추가되서 이렇게 사용 가능
services, volumes, networks
하나의 서비스는 하나의 이미지를 기반으로 컨테이너 실행. 포트 매핑, 네트워크 지정 등
볼륨도 처음에 지정 안함.
네트워크 지정 안하면 모든 컨테이너가 공유
이제는 docker compose 써도 됨. 그러나 대부분의 설치 명령 등이 docker-compose로 되어 있음.
다른 이름의 파일 쓰고 싶으면
docker-compose -f docker-compose.mac.yml up
중간에 개발, 테스트 용인지 목적을 섞어서 쓰기도 함.
-f
으로 기본파일이 아닌 지정 파일을 사용할 수 있음.
services: 컨테이너가 하나씩 표현됨. frontend, backend, database.
build, image 커맨드로 이미지가 지정이 됨.
build: ./frontend -> 프론트엔드 폴더에 도커파일이 있음 그 도커파일을 가지고 이미지를 빌드하고, 컨테이너가 실행이 됨.
ports: - 3000:3000 호스트에서 3000으로 접근.
백엔드도 유사함.
environment:
DB_URL 환경변수 지정. 데이터 베이스 위치를 잡음
데이터 베이스
image: mongo:4.0 이 이미지가 로컬에 있던지 없으면 허브에서 다운로드. 오피셜 이미지.
네임드 도커 볼륨 사용
vidly:라는 이름으로 db폴더에 마운팅 해라 db는 도커 컨테이너에 있음.
db 폴더 내용이 persist하게 유지가 됨.
volumes:
service 안에서 사용했던 네임드 도커볼륨 이름을 여기에 적어주면 됨.
networks:
여기에 사용했던 네트워크를 적어주면 됨.
네트워크가 정의되어 있지만 하나의 도커 컴포즈 밑에 정의된 컨테이너들은 연결되며, 서비스에 지칭된 이름이 호스트 이름이 됨. 내부 IP 주소로 변환이 됨. 컨테이너끼리 자동으로 연결됨. 따로 키 정의하지 않아도 됨. 만일 네트워크를 여러개 만들어서 분리할려면, frontend, backend 등을 정의함.
서비스 이름은 호스트 이름. 환경변수로 정의한 DB_URL에서 database는 database는 호스트 이름임. 서로 연결을 보장해줌. 이게 강점임.
전에는 일일히 어느 네트워크에 속하는지 지정해줬는데, 컴포즈는 바로 인식함.
이미지를 생성하고 관리.
build -> yml 파일을 기준으로 -f
가 쓰였으면 지정된 yml 파일을 갖고 이미지를 빌드. 어떤 서비스는 build, image가 있는데, build만 대상으로 build를 함.
pull -> 로컬에서 찾고, 없으면 허브에서 찾아서 옴.
docker images -> 로컬에 있는 이미지 리스트.
2개는 헤더가 없고, 3개는 example- 헤더가 붙음. -> docker compose build로 만들어진 경우임.
현재 실행되고 있는 compose로 만들어진 이미지들을 보여줌 2째줄에 어떤 이미지들로 부터 만들어졌는지 보여줌.
docker-compose push 빌드했던 이미지들을 도커 허브쪽에 푸시함.
권한이 있는것들만 push, 오피셜 이미지들은 권한이 없으므로 (redis postgres) 안가고, 내가 만든것 앞에 어카운트아이디/이미지이름 형태는 push가 됨.
컨테이너들을 시작하고 중단.
docker-compose up. 다양한 서비스들을 시작해줌. build(이미지 없으면 받아서) -> create(컨테이너 생성) -> start(컨테이너 시작) (build, pull을 다 해줌)
down - 컨테이너들을 stop하고 remove까지 해줌. 원래는 rm으로 삭제까지 해줬음.
아니면 stop, rm 단계를 나눠서 할수도 있음.
ls는 그룹핑해서 보여줌. docker-compose로 실행한 앱이 있고 5개 컨테이너 돌아가며, yml 파일이 보임.
ps는 실행이 된 컨테이너들의 상태를 보여줌.
서비스 -> 호스트 이름
네트워킹
같은 도커 컴포즈에 의해 기술되고 실행되면 자동으로 연결이 됨. 서비스 이름이 호스트 이름. 내부적으로 DNS 서버가 돌아서, IP 주소가 내부적으로 할당이 됨. 별도로 네트워크 구성하고 싶다면 yml에 networks에 별도로 이름 정해주고 (frontier 등) 서비스를 이 하위에 속하게 하면 됨.
docker network ls 하면 3개의 네트워크 이름. 브릿지, 호스트, none. 컴포즈로 실행시키면 폴더이름이 붙고_default의 네트워크가 생성이 됨. 5개의 컨테이너는 이 네트워크게 들어감. 브릿지, 호스트는 도커에서 가장 복잡한 부분임.
docker-compose로 포팅해서 실행해본다.
숙제이기도 함.
전에 분제가 있었음 voting은 됐는데 디스플레이가 안됐음.
워커가 postgres에 써줘야하는데 써줘야 하는 부분을 보면 호스트 이름이 db, 인증 방법이 유저네임, 비밀번호임.
도커 컨테이너를 실행할 때 명령어를 보면 패스워드만 세팅해줬었음.
결국 인증이 안됨. 투표했던 결과가 result로 안들어감.
컨테이너 실행시 2개의 환경변수를 넘겨줘야함.
5개의 도커런이 있었음.
네트워크 커넥션때 인증이 되지 않는 문제 있음. db에
네트워크, 볼륨 안씀 처음에. 그럼 persist 유지 X.
기본 네트워크 사용한다는 뜻.
yml을 만들면
docker-compose up으로 실행하면 됨.
서비스 밑에 5개의 키가 있다.
이미지가 있다는 전제 하에 각 서비스 밑에 어떤 이미지를 쓸지 적어주면 된다.
5001 대신 8001 대체.
그러나 2개는 오피셜, 3개는 지정 폴더의 도커파일 이용할 것이기에 폴더 위치 지정 후 image를 build로 바꿔줌
이미지와 빌드의 차이 알고 있기.
https://github.com/learndataeng/example-voting-app/blob/main/docker-compose.mac.yml
# v2 and v3 are now combined!
# docker-compose v1.27+ required
# % docker-compose version
# Docker Compose version v2.15.1
services:
vote:
build: ./vote
# use python rather than gunicorn for local dev
command: python app.py
ports:
- "8001:80"
result:
build: ./result
# use nodemon rather than node for local dev
entrypoint: nodemon server.js
ports:
- "8002:80"
worker:
build: ./worker
redis:
image: redis:alpine
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "postgres"
vote에 command 추가됨. Dockerfile에 cmd가 있어서 이미 지정이 되어있지만 오버라이드하고 싶을 때 써주면 됨.
비슷하게 entrypoint도 오버라이드가 가능함.
db의 경우
environment를 지정해서
유저, 패스워드
이걸 가지고 5개 컨테이너를 가지고 해본다.
docker-compose -f docker-compose.win.yml up
으로
새로 만들어본다.
뭔가 네트워크 쪽을 밀어야 할꺼 같은데..
docker compose down을 하면 알아서 지워진다. 나는 백티어, 프론트티어 네트워크를 한적이 없는데?
일단 깃으로 받아서 새로 파본다
https://github.com/learndataeng/example-voting-app.git
오 연결이 되었음.