개요

2023-09-12 2회차 SaaS 강의 에대해서 내용정리를한다.

내용

어제 내용 이어서…

  • drupal 이랑 postgresql

Docker 옵션

  • docker run의 —rm 옵션
docker run --rm <image>
  • 컨테이너가 종료되면서 바로 삭제됨 (일회성으로 사용하기위한 옵션임)

도커 볼륨에 대해

  • 호스트 경로에 폴더나 경로가 만들어져있지않다고해도 자동으로 만들어진다.

도커 에러

docker pullacessdenied

  • 실습중 docker run으로 이미지를 docker hub에서 pull해서 가져올때 보통 발생하는 에러인데 문제는 버전을 명시안해줘서 postgresql:latest라고 명시해주면 해결된다.
docker pull postgresql:latest

Docker Run 옵션

docker run -it <image>
  • 콘솔을 어플리캐이션에서 붙여서 실행하고 꺼지지않게함.

볼륨 컨테이너의 볼륨 공유

  • 이렇게 컨테이너끼리 하나의 볼륨을 공유해서 사용 할 수 있다.
  • 장점 : 여러개의 컨테이너가 하나의 볼륨 사용해서 초기화 작업이 빨라지고, 실행시간 단축, 비용 관련해서 장점이 있음.

도커의 Inspect

docker inspect <container_id/name>
  • 도커는 이렇게 어떤 리소스의 inspect를 하면 해당 정보를 JSON으로 볼 수 있게 잘 되어있다.

리눅스 호스트에서 도커의 볼륨 데이터 저장 위치

사용하지 않는 볼륨 삭제

docker volume prune

자동 볼륨 생성

docker run -v /path/to/volume
  • 볼륨 자동으로 생성됨 이상한 이름으로

컨테이너 자원 할당 제한

# 메모리 제한
docker run -d --memory="1g" --name container_name
 
# CPU 공유 설정
docker run -it --name container_name --cpu-shares=512
  • (cpu 공유는 정확하게 되지는 않는다. VM의 그 cpu 갯수 지정하는 것과는 다르다!)

Docker Image Push 해보기

# 이미지에 태그 추가
docker tag <image> username/repository:tag
 
# 이미지 푸시
docker push username/repository:tag

실습

# Apache 웹서버 이미지 생성
docker commit <container_id> username/apache:tag
 
# Jupyter 이미지 생성
docker commit <container_id> username/jupyter:tag
 
# 이미지 pull
docker pull username/repository:tag
 
# 이미지 실행
docker run -d username/repository:tag

주피터 실습

docker run -p 8888:8888 -v /notebooks jupyter/notebook --ip=0.0.0.0 --allow-root

도커 오케스트레이션

  • docker swarm
  • 쿠버네티스

Private Registry

  • 비밀번호도 없고, 인가된 사용자만 사용 가능하다. 공공이나 은행 등에서 내부에 이렇게 Private Registry를 구축해서 사용하면 됨.
  • 완전 기본적인 기능만 존재함. 실습은 안 함.

Dockerfile

  • 청사진이라고 보면
    • RUN은 컨테이너 안에서의 명령어 실행에는 -y를 모두 붙여서 멈추지 않게 해야 함.
    • EXPOSE는 port에 대한 메타정보임. 실제로 포트를 열어주지는 않음.
    • CMD의 옵션 저렇게 포그라운드로 반드시 실행해야 한다.

도커 파일 작성 시 도커 레퍼런스 참조

  • 반드시 도커 파일을 실제로 구동 잘 되는지 테스트해봐야 함.

  • 도커 파일 작성 시 명령어 문법은 두 가지가 있다.

    • CMD
      • 둘 중 하나 이상은 반드시 있어야 함.
    • LABEL
      • 그냥 메타정보.
    • ADD
      • 소스 원천 > 타겟으로 복사함.
      • COPY나 ADD나 똑같음. 그냥 ADD 쓰자.
    • ENTRYPOINT
      • CMD는 하나 이상 반드시 있어야 한다.
      • ENTRYPOINT는 OVERRIDE가 안 된다.
    • SHELL
      • 쉘도 지정해서 사용할 수 있다. 운영체제별로 powershell도 가능.

도커 파일 실습

  • Dockerfile로 jupyter 이미지를 생성하고 docker hub에 push한다. /notebooks를 볼륨으로 붙여서 실행한다(실습).

도커 네트워크

# 네트워크 목록 확인
docker network ls
 
# 네트워크 검사
docker network inspect bridge
 
# host 네트워크 사용
docker run --network host <image>
 
# none 네트워크 사용
docker run --network none <image>

네트워크 Alias 설정

# 네트워크 alias 설정
docker run --network-alias <alias_name> <image>

컨테이너 로깅

# 로그 확인
docker logs <container_id>
 
# 실시간 로그 확인
docker logs -f <container_id>
 
# CloudWatch 로깅 드라이버 사용
docker run --log-driver=awslogs --log-opt awslogs-region=ap-northeast-2 <image>

도커 이미지 관리

# 이미지 검색
docker search <image_name>
 
# 이미지 저장
docker save <image> > image.tar
 
# 이미지 로드
docker load < image.tar
 
# 이미지 삭제
docker rmi <image>

Private Registry 관련

# 프라이빗 레지스트리 로그인
docker login <registry_url>
 
# 프라이빗 레지스트리로 푸시
docker push <registry_url>/<image>:<tag>
 
# 프라이빗 레지스트리에서 풀
docker pull <registry_url>/<image>:<tag>

Dockerfile 예시

FROM ubuntu:20.04
LABEL maintainer="[email protected]"
 
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip
 
COPY ./app /app
WORKDIR /app
 
EXPOSE 8080
 
CMD ["python3", "app.py"]

도커 네트워크 관련 추가 명령어

# 새 네트워크 생성
docker network create my_network
 
# 컨테이너를 네트워크에 연결
docker network connect my_network container_name
 
# 컨테이너를 네트워크에서 분리
docker network disconnect my_network container_name
 
# 사용하지 않는 네트워크 정리
docker network prune

도커 볼륨 고급 사용법

# 명명된 볼륨 생성
docker volume create my_volume
 
# 볼륨 정보 확인
docker volume inspect my_volume
 
# 여러 컨테이너에서 볼륨 공유
docker run -v my_volume:/data container1
docker run -v my_volume:/data container2
 
# 읽기 전용 볼륨 마운트
docker run -v my_volume:/data:ro container_name

도커 컨테이너 관리

# 컨테이너 상태 확인
docker stats
 
# 컨테이너 프로세스 확인
docker top container_name
 
# 컨테이너 업데이트
docker update --memory 2G --cpus 2 container_name
 
# 컨테이너 이름 변경
docker rename old_name new_name

질문 정리

  • 인터넷이 안 되는 환경에서의 도커

    • 프라이빗 레지스트리 구축 필요
    • 이미지 저장/이동을 위한 절차 필요
    • 커널 버전 호환성 고려 필요
  • MSA 구축 시 고려사항

    • 서킷 브레이커 패턴 적용
    • 컨테이너 간 네트워크 설정
    • 로깅 및 모니터링 전략

참고 자료