주니어 데이터 엔지니어 우솨's 개발일지

데이터 엔지니어링 48일차 TIL 본문

데브코스

데이터 엔지니어링 48일차 TIL

우솨 2024. 6. 5. 19:29

학습내용

Docker 명령 정리 - Image
- 이미지 빌드 : docker build --platform=Linux/amd64 -t 이미지 이름
- 이미지 보기 : docker images
    docker image ls
- 이미지 삭제 : docker rmi
    docker image rm

Docker 명령 정리 - Docker Hub
- 로그인 : docker login -u 사용자ID -p 사용자PW
- 도커 풀(가져오기) : docker pull wsh120/hangman
- 도커 푸쉬 : docker push wsh120/hangman

Docker 명령정리 - 컨테이너
- 도커 생성 : docker create
- 도커 실행 : docker run --name -p -v
    - --name(컨테이너아이디 임의설정), -p(포트번호), -v(도커 볼륨설정)
- 도커 확인 : docker ps

Docker 명령정리 - Container logs
- 로그 확인 : docker logs -f 컨테이너이름
- 로그 100줄 확인 : docker logs --tail 100 컨테이너이름

Docker 명령 정리 -exec
: 이미 실행이 된 도커에 명령 실행
- 컨테이너 접속(쉘) : docker exec -it 도커ID sh

Docker 명령정리 - Contianer detach & attach
- 백그라운드에서 실행 : docker run -d 도커이름
- 도커 attach 실행(백그라운드에서 풀그라운드에서 실행하도록 함) : docker attach 도커ID(앞 네자리만 실행해도 가능)

Docker Volume의 필요성
- Docker Container가 실행되었다가 중단되면 데이터들이 계속유지하기 위함
=> 이를 보장하는 기능이 Docker Volumes = Data Persistence
- Docker Container내의 가상 파일 시스템과 호스트 시스템의 파일 시스템을 맵핑한다.(마운팅)
    - Docker Container가 중단되더라도 모든 Airflow logs는 기록이 남게 된다.
=> Container와 Host 시스템이 특정폴더를 공유
    - Container가 사라지더라도 데이터는 남는 것 !

Docker Volume 타입
- Host Volumes: docker run -v를 실행할 때 페어로 지정
    - docker run -v /home/keeyong/logs:/var/lib/airflow/logs
    - :앞이 호스트 파일 시스템 패스이고 뒤가 컨테이너 파일 시스템 패스임
- Anonymous Volumes: docker run -v를 실행할 때 컨테이너 패스만 지정
    - docker run -v /var/lib/mysql/data
    - 이 방식이 Dockerfile에서 사용되는 방식으로 호스트쪽에 액세스되지는 않지만 재시작해도 유지됨
- Named Volumes: docker run -v를 실행할 때 이름과 컨테이너 패스를 지정
    - docker run -v name:/var/lib/mysql/data
    - 가장 선호되는 방식임. 이 방식이 하나의 Volume을 다수의 컨테이너에서 공유하는 것도
가능하게 해줌
    - 이 포맷으로 docker-compose에서도 사용됨
- Volume을 Readonly로 지정하고 싶다면?
    - name:/var/lib/mysql/data:ro

이미지 생성시 Docker Volume 사용법
- Dockerfile
    - Volume 명령을 통해 anonymous volume만 지정 가능
- docker-compose
    - Host Volume이나 Named Volume을 사용하는 것이 일반적이다

Docker 환경 클린업 (1) - 커맨드라인
- Docker Desktop에서 모든 삭제하는 것이 가장 직관적
    - Image를 삭제하려면 먼저 실행 중인 Container가 없어야함
    - 따라서 맞는 순서는 먼저 Container를 중단하고 다음으로 Image를 삭제
- 컨테이너 삭제
    - 원래는 docker container ls를 하고 Container ID를 개별적으로 docker container rm 뒤에 추가해야함
    - 하지만 한번에 이를 실행하는 것이 더 좋음
        - $ docker container rm -f $(docker container ls -aq)
- 이미지 삭제
    - 원래는 docker image ls를 하고 Image ID를 개별적으로 docker image rm 뒤에 추가해야함
    - 하지만 한번에 이를 실행하는 것이 더 좋음
        - $ docker image rm -f $(docker image ls -q)
- 정말 다 삭제되었는지 확인
    - docker ps
    - docker images

네트워크 연결 확인법
- root 도커로 진입 (docker exec -it --user root vote sh)
    1. apt update
    2. apt install iputils-ping(핑 설치)
    3. ping redis(다른 컨테이너이름)



=> 컨테이너 모두 삭제 후, 네트워크 새로 생성
    1. docker network create mynetwork
    2. 컨테이너 다시 재실행(--network mynetwork 을 붙인다)
        - docker run -d --name=redis --network mynetwork redis
        - docker run -d -e POSTGRES_PASSWORD=postgres --name=db --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