[TIL 48일자] 데브코스 데이터엔지니어링

·2023년 6월 15일
0

데브코스

목록 보기
44/55
post-thumbnail
post-custom-banner

📚 오늘 공부한 내용

1. Docker 명령

1) IMAGE 관련

  • docker build -t image_name
    • IMAGE를 build하는 명령어
    • -t를 통해 이미지의 이름을 줄 수 있음 (tag)
    • 만약 mac 환경이라면 --platform=linux/amd64를 추가하여 다양한 OS에서 사용 가능한 환경을 만듦
  • docker images docker image ls
    • local에 저장된 이미지의 목록을 보여 주는 명령어
  • docker rmi docker image rm
    • 이미지를 삭제하는 명령어
    • 만약 이미지가 사용 중이라면 삭제되지 않음

2) DOCKER HUB 관련

  • docker login -u 사용자ID -p 사용자PW
  • docker pull image_name
    • Docker Hub의 image를 local로 다운로드
  • docker push image_name
    • local의 image를 Docker Hub로 업로드

3) Container 관련

  • docker create
  • docker run --name -p -v 이미지이름
    • --name을 통해 이름을 Container 이름을 지정해 줄 수 있음
    • -p를 통해 docker container의 port를 외부에도 연결해 줄 때 사용
    • -v는 docker volume을 설정해 줌
  • docker ps
  • docker ps -a
  • docker ps -q
  • docker stop 컨테이너이름 (혹은 컨테이너ID)
  • docker start 컨테이너이름 (혹은 컨테이너ID)
  • docker restart 컨테이너이름 (혹은 컨테이너ID)
  • docker kill 컨테이너이름 (혹은 컨테이너ID)
  • docker pause 컨테이너이름 (혹은 컨테이너ID)
  • docker unpause 컨테이너이름 (혹은 컨테이너ID)
  • docker rm 컨테이너이름 (혹은 컨테이너ID)

4) Logs 관련

  • docker logs -f 컨테이너 이름(혹은 컨테이너ID)
    • -f가 있으면 해당 컨테이너 안에서 실행되고 있는 로그를 보여 줌
  • docker logs --tail 100 컨테이너이름 (혹은 컨테이너ID)
    • --tail 100을 통해 최근 100 개의 로그를 보여 줌

5) exec

  • docker run --name=hangman image_name
  • docker exec hangman cat /etc/hos

6) Container detach & attach

  • docker run image_name
  • docker run -d image_name
  • docker attach a043(container_id)
    • docker container id가 중복이 없다면 일부만 입력해 주어도 된다.


2. Docker Volume

1) Docker Volume의 필요성

  • Docker Container가 실행되었다가 중단이 되면 그 내부에 있던 데이터들은 유실된다.
  • 하지만 Docker Container가 중단되고 재실행되고의 여부와 관련 없이 데이터가 영구적으로 보관되기를 원한다면 이를 보장해 주는 기능이 Docker Volumes이다.
  • Docker Container 내의 가상 파일 시스템호스트 시스템의 파일 시스템맵핑해 두면 Docker Container가 중단되더라도 모든 logs는 남게 된다.
  • Airflow에서 많이 사용하는 기능 중 하나이다.

2) Docker Volume의 정의

  • 호스트 파일 시스템 폴더를 Docker Container 파일 시스템의 폴더로 마운트하는 것이다.
  • 호스트에서 내용을 바꾸면 Docker Container에서도 바로 반영된다. 하지만 Volume의 속성에 따라 읽기 전용이면 이는 불가능하다.

✍ 마운트란?

  • 원래 마운트는 물리적인 장치를 파일 시스템의 특정 위치(폴더)에 연결해 주는 것이다.

3) Volume의 종류

  • Host Volume
    • docker run -v 시 페어로 지정
    • (흐스트 파일 시스템 path):(컨테이너 파일 시스템 path)
  • Anonymous Volume
    • docker run -v 컨테이너PATH
    • -v 뒤의 Container가 중요한 것이기 때문에 persistence (지속성) 있게 만들라고 지정
    • Docker Engine이 알아서 Random한 Path를 만들어 해당 Path를 호출한 Container Path와 마운트
    • 자주 쓰이지 않음 오히려 Named Volumes가 많이 쓰임
    • 고유의 docker path가 생기게 되는데 그렇게 되면 추가적으로 관리가 늘어나 번거롭기 때문에 Named Volumes을 더 많이 사용한다.
  • Named Volumes
    • docker run -v name:실행할이름(ContainerID)
    • 가장 선호되는 방식
    • 하나의 Volume을 다수 컨테이너에서 공유하는 것을 가능하게 해 줌
    • 이 포맷으로 뒤에서 볼 docker-composer에서도 사용됨

📌 Volume을 Readonly로 지정하고 싶다면?

  • name:/var/lib/mysql/data:ro

4) Docker Volume 사용법

  • Dockerfile: -v 옵션을 써서 연동하며 anonymous volume만 지정 가능
  • docker-compose: Host VolumeNamed Volume를 사용하는 게 일반적
    • 예를 들어 Airflow를 실행했다면,
      volumes:
      ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
      ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
      ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins

5) Docker Volume과 관련된 명령어

  • docker volume ls
    • volume의 목록을 보여 줌
  • docker volume rm
    • 특정 볼륨을 삭제
  • docker volume prune
    • 모든 볼륨 삭제
  • docker volume inspect
    • 볼륨 정보를 좀 더 상세하게 보여 줌

6) Docker Volume 사용 실습

  • nginx

    • docker run -d --name=nginx -p 8081:80 nginx

      • 다음 명령어를 사용해 주면 nginx의 이미지가 local에 존재하지 않을 시 docker hub에서 이미지를 가지고 와 다운로드된다.
      • 또한 8081 포트가 열리게 된다.
    • docker exec -it --user=root nginx sh

      • container를 실행해 준 후 apt update를 통해 필요한 패키지를 모두 다운로드 받는다.
      • Edit을 해 주기 위해 apt install nano를 설치해 주면 nano를 통해 파일 편집 역시 가능하다.
    • nano File_Path

    • 이때 만약 내가 수정을 하고 저장을 해 주었다고 할지라도 docker stop nginx(도커 중지), docker rm nginx(도커 삭제)docker run -d --name=nginx -p 8081:80 nginx(도커 실행) docker exec -it --user=root nginx sh(도커 실행) 해 주게 되면 변경 사항이 사라지고 초기 상태가 되게 된다.

      • 이런 경우 때문에 Volume이 필요하다.
        (docker 변경)
        (docker 삭제 및 재실행 후)
  • docker-compose

    • docker-compose.yml 파일 volume 설정은 이 위치에서 설정해 주어야 한다. 이때 AIRFLOW_PROJ_DIR의 환경 변수는 상단에서 설정해 줄 수 있다.

    • AIRFLOW_PROJ_DIR는 따로 지정해 주지 않는 이상 default는 .으로 상위 폴더이다.


3. Docker 환경 Clean Up

  • Docker Desktop에서 모든 삭제하는 것이 가장 직관적이다.
  • Image를 삭제하려면 먼저 실행 중인 Container가 없어져야 한다. 그래서 순서는 Container 중단하고, Image를 삭제해야 한다.
  • 컨테이너 삭제
    • docker container ls를 하고 Container ID를 개별적으로 삭제할 수 있다. docker container rm Container_ID
    • 하지만 이를 한 번에 삭제하는 것이 더 좋다. $docker container rm -f $(docker container ls -aq)
      • aq를 붙이면 중단되어 있는 ID까지 조회하는 것이다.
  • 이미지 삭제
    • docker image ls를 하고 IMAGE ID를 통해 docker image rm image_id를 삭제해 주어야 한다.
    • 이미지 역시 전체 삭제가 가능하다. docker image rm -f $(docker image ls -q)
  • 삭제되었는지 확인하기
    • docker ps
    • docker images

4. 다수의 Container로 구성된 소프트웨어 실행

  • 다수의 Container가 존재한다고 했을 때 각 Container가 서로의 존재를 알지 못하기 때문에(네트워크가 되지 않기 때문에) 제대로 돌아가지 않는다.
  • Network 이슈를 어떻게 해결할 수 있을까?
    • docker의 network 기능을 사용한다.
    • 이전에는 docker runlink 옵션을 넣었으나 지금은 그렇게 사용하지 않는다.
    • network를 하나 만들고 모든 컨테이너를 이 네트워크 안으로 넣는다.
    • 만약 연결 상황에 따라서 서로 알 필요가 없는 컨테이너들은 연결해 주지 않고 각각 별개의 네트워크를 만들어서도 사용 가능하다. (front-tier, back-tier)

5. 다수의 Container로 구성된 소프트웨어 실습

  • 다음과 같이 각각의 Image들이 담긴 Container를 생성해 주었다. 하지만 모두 따로 생성된 상태라 그 사이에 네트워크가 존재하지 않는다.

  • 그래서 5001 포트인 VOTE에 접속했을 때는 이렇게 투표 화면이 나오게 되지만 투표를 하기 위해 CATSDOGS를 누르게 되면

  • 바로 오류가 발생하게 된다. 네트워크 커넥션을 설정하지 않았기 때문에 voteredis가 연결되지 않았고, db와도 연결되지 않았다.

  • docker exec -it --user root vote sh를 통해 vote에 접속해서 ping redis를 입력한다. 만약 ping이 설치가 되지 않았다면 apt update 해 준 후 ping 모듈이 들어 있는 iputils-ping 모듈을 설치해 준다. apt install iputils-ping

  • ping이란 네트워크 연결 여부를 확인해 준다.

  • ping redis를 해 주게 되면 ping: redis: Temporary failure in name resolution 이렇게 뜨는데 이건 현재 voteredis의 존재를 찾지 못하는 것이다.

  • 이전 다섯 개의 Container를 모두 삭제 후 docker network create mynetwork 먼저 네트워크를 생성해 준다.

  • 그리고 이전의 다섯 개의 Container를 재생성 시 --network를 통해 mynetwork 내부에서 네트워킹이 가능하도록 해 준다.

  • Docker Container Network와 연결해 실행

    • 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
  • 이렇게 네트워크 내에 Container를 생성한 경우 다시 vote의 Container로 접속하여 ping redis를 해 보면 voteredis를 찾는 것을 확인할 수 있다.

  • 웹에 들어가면 투표가 되는 것도 볼 수 있다.



🔎 어려웠던 내용 & 새로 알게 된 내용

📌 window 환경에서 -aq 사용 시 오류

  • 전체 컨테이너를 삭제해야 하는 명령어로 docker container rm -f $(docker container ls -aq) 해당 명령어를 사용했는데 window 환경에서는 다음과 같은 오류가 발생했다.
  • unknown shorthand flag: 'a' in -aq) See 'docker container rm --help'.
  • 확인해 보니 이 명령어는 Linux 계열 shell script 구문이라 발생하는 현상이고, window 환경에서는 for문을 사용해야 한다고 했다.


✍ 회고

데이터 엔지니어의 영역은 내가 생각한 것보다 배워야 할 게 많고 넓은 것 같다.

profile
송의 개발 LOG
post-custom-banner

0개의 댓글