Docker

[Docker] 컨테이너 이미지, 명령어

삶_ 2023. 1. 25. 12:40

 

 

도커와 컨테이너

  • 컨테이너
    • 개발한 애플리케이션(실행파일)과 운영환경이 모두 들어있는 독립된 공간
    • 컨테이너가 각각 독립된 환경에서 실행되지만 동일한 커널을 사용.
    • 읽기/쓰기 가능.
    • 실제로 동작되는 프로세스에 해당.
    • 도커엔 10만여개가 넘는 컨테이너를 갖고있음 (nginx, node.js … 등)
    • 컨테이너를 쓰는 이유 : 확장을 쉽게 하기 위해. 어디에서나 킬 수 있게.
    • 버전  관리를 자동으로 해줘서 편리
  • 컨테이너 이미지
    • 하나의 애플리케이션이 잘 실행될 수 있도록 하는 여러개의 레이어 구성
    • 디스크에서 동작. 읽기만 가능
    • 다운받는 파일에 해당.
  • 도커 내 컨테이너 오케스트레이션
    • 스웜, 쿠버네티스를 말함
    • 웹 어플리케이션의 한계(과부하) -> CPU의 한계까지 유동적으로 코어를 늘려서 서버를 사용하는 의미
    •  도커
      • 컨테이너를 거의 씀 => 확장을 쉽게하려고. 어디에서나 킬수있음
      • 버전관리를 자동으로 해줘서 편리함

 

 

도커 명령어

  • docker search nginx // nginx 라는 컨테이너가 있는지 확인
  • docker pull nginx:latest // 컨테이너 이미지들 가져오기
  • docker run -d --name web -p 80:80 nginx:latest // 불러온 컨테이너 이미지를 컨테이너화해서 실행

 

 

용어

  • docker host : 도커가 실행되고 있는 시스템
  • docker daemon : 설치한 도커
  • docker client command : 도커 실행 명령어
  • docker hub : 도커 홈페이지에서 제공하는 도커 컨테이너 이미지를 모아놓은 공간
  • 컨테이너 이미지 : 컨테이너 안에 도커 이미지를 레이어 별로 모아놓은 것
  • 컨테이너 : 실제 동작되는 프로세스

 

 

도커 허브에서 컨테이너 이미지 검색

  • docker version : 도커 버전 확인
  • docker search nginx : 내가 원하는 도커 컨테이너가 존재하는지 확인

 

 

컨테이너 이미지 다운 후 이미지 레이어 보기

  • docker images, docker image 특정이미지명 : 도커 이미지 있는지 확인
  • docker pull nginx : 원하는 컨테이너 이미지를 다운받기
    • 6개의 레이어 이미지로 구성되어있다는 의미

 

 

컨테이너 실행 후 확인하기

  • docker run --name web -d -p 80:80 nginx
    • web이란 이름 백그라운드 모드로 80:80 포트로 nginx 실행
  • docker ps : 현재 실행중인 도커 컨테이너 등 프로세스 보여주기
  • curl localhost:80 // 아까 만든 도커 호스트인 80포트로 실행
  • docker stop web : web 이라는 컨테이너 중단 (실행 못함)
  • docker rm web : web 이라는 컨테이너 지우기 (이미지는 지우지 않음.)
  • docker rmi nginx : nginx 라는 컨테이너 이미지 지우기

 

 

도커 컨테이너 만들기

무엇을 컨테이너로 만드는지?

  • 역할에 적합한 컨테이너를 각각 만들어 애플리케이션을 운영

 

 

도커파일

  • 컨테이너를 만들수 있도록(빌드하도록) 도와주는 명령어 집합
  • 대소문자 구분하지 않으나 가독성을 위해 사용한다
  • 컨테이너 이미지를 생성할 수 있는 고유의 지시어를 가짐
  • 문법
    • // #으로 시작하면 comment 라인을 의미
    • FROM // 컨테이너의 베이스 이미지. 운영환경.
    • COPY // 컨테이너 빌드시 호스트의 파일을 컨테이너로 복사
    • ADD // 컨테이너 빌드시 호스트의 파일을(tar, url 포함) 컨테이너로 복사
    • WORKDIR // 컨테이너 빌드시 명령이 실행될 작업 디렉토리 설정
    • ENV // 환경변수 지정
    • USER // 명령 및 컨테이너 실행시 적용할 유저 설정 (빌드 중에 switch 하는 것. 보안적으로 필요한 기능.)
    • VOLUME // 컨테이너가 동작 될 때 파일 또는 디렉토리를 컨테이너의 디렉토리로 마운트 하는 기능
    • EXPOSE // 컨테이너 동작 시 외부에서 사용하는 포트 지정
    • CMD // 컨테이너가 실행될 때 자동으로 동작되고 싶은 명령어 입력 (특정 파일 동작도 가능)

 

 

내가 만든 컨테이너를 배포하려면?

  • docker build -t hellojs:latest . // 컨테이너 올리기. latest는 디폴트 값(태그를 의미). hellojs는 컨테이너 이름
  • docker login // 허브에 진입하기 위한 유저로 로그인
  • dokcer push hello.js:latest // 다른사람이 쓸수있도록 도커허브(사이트)에 컨테이너 넣기(=배포)

 

 

그 외

  • apt-get update // 운영체제에서 사용 가능한 패키지들과 버전에 대한 정보(리스트)를 업데이트

 

 

파일의 레파지토리명 변경

  • 컨테이너 저장소 변경
  • docker tag hello:latest he/hello:latest

 

 

private registry 를 구축하는 법

  • public registry : 도커 허브랑 같다고 보면 됨.
    • 도커 허브 처럼 공개적이기 보단 개인적/사내에서 컨테이너 공간이 필요할 때 사용
  • 컨테이너 레지스트리를 운영할수있도록 도와주는 컨테이너
    • 컨테이너 레지스트리 : 컨테이너 이미지를 저장하고 서비스해줌
  • 도커허브의 registry 를 이용하기

 

 

컨테이너 이미지 사용하기

  • docker pull 이미지이름:태그
  • docker run 이미지이름:태그
  • 컨테이너가 애플리케이션에 올라가 서비스가 운영됨

 

 

컨테이너 이미지 관련 명령어

  • docker search [옵션] <이미지이름:태그명> // 이미지 검색
    • docker search nginx
    • 기본적으로 도커 허브 내에 이미지가 있는지 검색함
  • docker pull [옵션] <이미지이름:태그명> // 이미지 다운로드
    • docker pull nginx:1.14 // 1.14 버전으로 nginx 다운받기
    • 버전 안적으면 자동으로 latest(최신) 버전을 다운받음
  • docker images // 다운받은 이미지 목록 출력
  • docker inspect [옵션] <이미지이름:태그명> // 다운받은 이미지 상세보기
    • docker inspect 컨테이너명 // 동작되는 컨테이너 상세보기
    • docker inspect --format ‘{{.NetworkSettings.IPAddress}}’ 컨테이너명 // 컨테이너 내의 특정 정보만 꺼내 보기
  • docker rmi [옵션] <이미지이름:태그명> // 이미지 삭제

 

 

컨테이너 실행과 종료

  • [옵션] 과 <이미지이름:태그명> 은 꼭 필수로 적을 필요없음
  • docker create [옵션] <이미지이름:태그명> // 컨테이너 생성
    • docker create --name 명명할컨테이너명 nginx:1.14
  • docker start [옵션] 컨테이너명 // 컨테이너 실행
    • docker start 컨테이너명
  • docker run [옵션] <이미지이름:태그명> // 컨테이너 생성 및 실행
  • docker stop [옵션] 컨테이너명 // 컨테이너 중지
  • docker rm [옵션] 컨테이너명 // 컨테이너 삭제. 실행중인 컨테이너는 삭제 불가능.
    • docker rm -f 컨테이너명 // 컨테이너 강제 종료 및 삭제

 

 

컨테이너 관리

  • docker ps [옵션] // 실행중인 컨테이너 목록 확인
  • docker attach [옵션] 컨테이너명 // 포그라운드로 실행중인 컨테이너에 연결
  • docker top [옵션] 컨테이너명 // 컨테이너 내 실행되는 프로세스 목록 확인
  • docker logs [옵션] 컨테이너명 // 현재 실행중인 로그 정보 확인
  • docker exec [옵션] 컨테이너명 명령어 // 현재 실행중인 컨테이너명에 명령어 추가 실행

 

 

컨테이너 리소스 제한

  • 컨테이너는 호스트 하드웨어 리소스의 사용 제한을 받지 않음.
  • 컨테이너 메모리 리소스 제한
    • 제한 단위는 b, k, m, g 로 할당
    • 옵션
      • --memory, -m : 컨테이너가 사용할 최대 메모리 양
      • --memory-swap : 컨테이너가 사용할 스왑 메모리 영역에 대한 설정. 메모리 + 스왑. 설정 생략시 메모리의 2배가 설정됨.
      • --memory-reservation : --memory 값보다 적은 값으로, 최소 보장되는 값 설정
      • --oom-kill-disable : 물리적인 메모리가 부족해도 가상메모리를 삭제하지 못하게 하는. oom killer가 프로세스 kill 하지 못하도록 보호
    • docker run -d -m 512m nginx:1.14 // nginx 컨테이너 내부에서 최대로 쓸 수 있는 용량은 512mb 임. 만약 용량을 넘으면 컨테이너가 스스로 kill 함.
    • docker run -d -m 1g --memory-reservation 500m nginx:1.14 // nginx 컨테이너 내부에서 최대로 쓸 수 있는 용량이 1gb 임. 최소 500mb 은 쓸 수 있게함.
    • docker run -d -m 200m --memory-swap 300m nginx:1.14 // nginx 컨테이너 내부에서 최대로 쓸 수 있는 용량은 200mb 임. 메모리와 할당되는 스왑 영역을 합한 게 300mb. 스왑 영역은 300-200=100mb 에 해당.
    • docker run -d -m 200m --oom-kill-disable nginx:1.14 // nginx 컨테이너 내부에서 최대로 쓸 수 있는 용량은 512mb 임.

 

 

cpu 리소스 제한

  • 옵션
    • --cpus : 컨테이너에 할당할 cpu core 수를 지정.
    • --cpuset-cpus : 컨테이너가 사용할 수 있는 cpu나 코어 갯수를 할당. cpu index 는 0부터.
    • --cpu-share : 컨테이너가 사용하는 cpu 비중을 1024 값을 기반으로 설정.
  • 예시
    • docker run -d --cpus=”.5” ubuntu:1.14 // 컨테이너가 최대 0.5개의 cpu 코어를 쓸 수 있다. 어떤 코어를 쓸지는 알 수 없음.
    • docker run -d --cpu-shares 2048 ubuntu:1.14 // 기본 값보다 두 배 많은 cpu 자원을 할당.
    • docker run -d --cpuset-cpus 0-3 ubuntu:1.14 // 0,1,2,3 번 코어에서만 동작해야함.

 

 

컨테이너 사용 리소스 확인

  • docker stat // 실행중인 컨테이너의 런타임 통계를 확인
  • docker event // 도커 호스트의 실시간 event 정보를 수집해서 출력