데브코스 48일차 - Docker Compose (1)

Pori·2023년 12월 20일
0

데엔

목록 보기
41/47

Docker Compose 사용해보기 (1)

Docker 명령 정리

  • image
    • 빌드 명령 : docker build —platform=linux/amd64 -t tag_name
    • 이미지 확인 : docker images
    • 이미지 삭제 : docker rmi 또는 docker image rm
  • Docker Hub
    • 로그인 : docker login -u userID -p PW
    • Pull : docker pull accountID/image_name
    • Push : docker push accountID/image_name
  • Container
    • 생성 : docker create
    • 이미지 실행 : docker run —name -p -v image_name
    • 프로세스 확인 : docker ps
    • 컨테이너 실행 : docker start container_id
    • 컨테이너 정지 : docker kill
    • 컨테이너 삭제 : docker rm
    • 로그 확인 : docker logs -f container_id (—tail 옵션사용가능)
    • 이미 실행된 컨테이너에게 명령 수행 : docker exec container_id <명령어>
    • 백그라운드에서 수행 : docker run -d image_name

Docker Volume

: Docker Container가 실행되었다가 중단되면 데이터가 사라진다. → 데이터의 유지를 원한다면 Volume이 필요하다.

정의

  • 호스트 파일 시스템 폴더를 Docker Container 파일 시스템의 폴더로 마운트하는 것
    • Container가 사라져도 데이터를 남게한다.
    • 마운트 : 물리적 장치를 파일 시스템의 특정 폴더에 연결하는 것

Docker Volume 타입

: docker run -v를 실행할 때 지정된다.

  1. Host Volumns : 페어로 지정
    • docker run -v host_file_sys_path:container_file_sys_path
  2. Anonymous Volumes : 컨테이너 패스만 지정
    • dockr run -v path
    • Dockerfile에서 사용되는 방식, 호스트에 액세스되지는 않으나 재시작 시 유지
  3. Named Volumes : docker run -v : 이름과 컨테이너 패스를 지정
    • docker run -v name:path
    • 가장 선호되는 방식, 하나의 Volume을 다수의 컨테이너에서 공유 가능
    • docker-compose에서도 사용된다.
  • Readonly로 지정 : name:path:ro

Dockerfile에서 volume 사용 예

  • nginx 데모#1 (저장 안됨)
    • docker run -d —name=nginx -p 8081:80 nginx (8081포트로 열기)
    • container 접속 : docker exec —user=root -it nginx sh
      • nano 설치 (apt)
      • nano /usr/share/nginx/html/index.html 내용 편집
    • docker 재시작 (docker restart nginx)
  • nginx 데모#2 (Volume 사용)
    • 맵핑을 위한 폴더와 파일 생성 (index.html)
    • Dockerfile로 이미지 빌딩
      FROM nginx:latest
      RUN echo "<h1>test volume</h1>" > /user/share/nginx/html/index.html
    • 폴더 마운트
      • docker run -p 8081:80 —name nginx -v local_path:/usr/share/nginx/html nginx
  • docker-cmopose.yml (airflow의 내용으로 사용)
    volumes:
    - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags

Docker Volume 명령들

  • Volume 확인 : docker volume ls
  • 삭제 : docker volume rm
  • 사용되지 않는 모든 볼륨 삭제 : docker volume prune
  • 특정 볼륨의 내용을 깊게 살펴보고 싶은 경우 : docker volume inspect

Docker 환경 클린업

CLI

: 실행중인 컨테이너가 없어야 이미지 삭제가 가능하다.

  • 컨테이너 삭제
    • docker container rm 을 이용해서 한개~다수의 컨테이너 삭제 가능
    • docker container -rm -f $(docker container ls -aq) 로 모두 삭제 가능 (-aq를 이용하면 containerID만 가져오기가 가능하다.)
  • 이미지 삭제
    • docker image rm
    • docker image rm -f $(docker image ls -q)
  • 확인
    • docker ps
    • docker images

Docker desktop

  • Troubleshoot > clean / Purge data 사용 (버그모양의 버튼 클릭)

Voting application을 매뉴얼하게 실행해보기

프로그램 설명

  1. 투표 진행
  2. redis 에 적재
  3. worker에서 이를 보고있다가 해당 count를 postgreSQl에 입력
  4. NodeJS에서 postgreSQL을 보고 출력

이미지 출처 : https://github.com/dockersamples/example-voting-app

빌드

  • docker build -t vote ./vote
  • docker build -t result ./result
  • docker build -t worker ./worker

실행

  • 하나씩 빌드하는 경우에 network 연결 이슈가 발생한다.
    • vote/app.py : “redis”를 찾을 수 없음
    • result/sever.js : 'postgres://postgres:postgres@db/postgres’ → postgres db를 생성해야함
    • worker/Program.cs : redis와 db 연결 모두 연결이 불가능
  • network을 하나 만들어서 모든 컨테이너들을 하나의 네트워크안으로 모아준다.

Network

: docker network create

  1. 실행중인 컨테이너 삭제 : docker container rm -f $(docker container ls -aq)
  2. network 생성 : docker network create mynetwork
  3. 아래 컨테이너들을 네트워크의 정보를 주어 실행한다.
    • 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 -p 5001:80 --network mynetwork vote
    • docker run -d --name=result -p 5002:80 --network mynetwork result
    • docker run -d --name=worker --network mynetwork worker

0개의 댓글