핵심만 콕 쿠버네티스 (1) - docker 기초

해당 포스팅은 '핵심만 콕 쿠버네티스' 서적을 ref합니다

[ 용어 정리 ]

  • 도커 이미지(Image) : 사용자가 실행할 코드가 들어있는 바이너리 / 한번 생성 후 수정 불가능
  • 도커 파일(DockerFile) : 도커 이미지를 생성하기 위해 필요한 문서
  • 도커 컨테이너(Container) : 도커 이미지가 메모리 위에 상주하여 실제 코드가 수행되는 프로세스
  • 도커 데몬(Daemon) : 컨테이너가 정상적으로 수행될 수 있게 실행 환경을 제공
  • 원격 레지스트리(Registry) : 도커 이미지를 저장할 수 있는 원격 저장소

[ 기본 명령어 ]

  • 컨테이너 실행
    • command 형식 : docker run <IMAGE>:<TAG> [<args>]
    • 설명
      • 도커 이미지 주소 형식 : <레지스트리 이름> / <이미지 이름> : <TAG>
      • registry 주소 생략시 기본적으로 docker.io 레지스트리 사용
      • tag 생략시 기본적으로 latest 사용
/* 기본 */
docker run docker/whalesay cowsay 'hello world!'

/* -d 옵션 : 백그라운드 실행 */
docker run -d nginx
 == docker run -d docker.io/nginx:latest

  • 컨테이너 조회 : docker ps
  • 컨테이너 상세정보 확인
    • command 형식 : docker inspect <CONTAINER_ID>
    • 설명
      • 네트워크 / 볼륨 등 컨테이너에 대한 모든 정보를 포함해서 출력
      • CONTAINER_IDdocker ps로 확인 가능
  • 컨테이너 로깅
    • command 형식 : docker logs <CONTAINER_ID>
    • 설명
      • 컨테이너에서 출력되는 로그 기록 확인
/* 컨테이너 조회 */
docker ps

/* 컨테이너 상세정보 확인 */
docker inspect d7455a395f1a

/* 컨테이너 로깅 */
docker logs d7455a395f1a

  • 컨테이너 명령 전달
    • command 형식 : docker exec <CONTAINER_ID> <CMD>
    • 설명
      • 실행된 컨테이너에 특정 명령 전달하여 실행
/* 예시 */
docker exec d7455a395f1a sh -c 'apt update && apt install -y wget'
docker exec d7455a395f1a wget localhost

  • 컨테이너 / 호스트 간 파일 복사
    • command 형식 : docker cp <HOST_PATH> <CONTAINER_ID>:<CONTAINER_PATH>
/* host -> container 로 이동 */
docker cp /etc/passwd d7455a395f1a:/usr/share/nginx/html/.
/* container -> host 로 이동 */
docker cp d7455a395f1a:/usr/share/nginx/html/index.html .

  • 컨테이너 중단
    • command 형식 : docker stop <CONTAINER_ID>
/* 예시 */
docker stop d7455a395f1a
docker ps -a
 # 종료된 컨테이너 정보는 -a(all) 옵션이 필요

  • 컨테이너 재개
    • command 형식 : docker start <CONTAINER_ID>
    • 설명 : 종료된 컨테이너를 다시 재시작
/* 예시 */
docker start d7455a395f1a

  • 컨테이너 삭제
    • command 형식 : docker rm <CONTAINER_ID>
    • 설명 : 중단된 컨테이너를 완전히 삭제
/* 예시 */
docker rm d7455a395f1a

  • Interactive 컨테이너
    • command 형식 : docker start <CONTAINER_ID>
    • 설명
      • -it 옵션을 통해 직접 컨테이너 안으로 접속하여 작업 가능
/* 이미지를 실행하면서 bash쉘을 실행 */
docker run -it ubuntu:16.04 bash
 # 컨테이너 내부로 들어가게 된다

  • tag 명령
    • command 형식 : docker tag <OLD_NAME>:<TAG> <NEWS_NAME>:<TAG>
    • 설명 : tag 명령을 통해서 기존 이미지에 새로운 이름 부여 가능
/* 예시 */
docker tag nginx:latest <USERNAME>/nginx:1
docker tag nginx <USERNAME>/nginx:1
 # tag 부여시 <TAG>를 생략하면 기본적으로 latest 적용

  • 이미지 확인
    • 설명 : 원격 저장소로부터 다운받아 저장한 이미지 리스트를 확인
/* 예시 */
docker images

[ Docker Hub 관련 ]

  • DOCKER HUB
    • 이미지 업로드
      • command 형식 : docker push <USENAME>/<NAME>
      • 설명 : Docker Hub에 이미지를 업로드
    • 이미지 다운로드
      • command 형식 : docker pull <IMAGE_NAME>
      • 설명 : Docker Hub로부터 이미지를 다운로드
    • 이미지 삭제
      • command 형식 : docker rmi <IMAGE_NAME>
      • 설명 : 로컬 서버에 존재하는 이미지르 삭제 -> docker images로 조회되는 이미지들
/* 업로드 */
docker push <USERNAME>/nginx
/* 다운로드 */
docker pull redis
/* 삭제 */
docker rmi redis

[ DockerFile 관련 ]

  • DockerFile 지시자
    • FROM : 기반 이미지(base image) 지정
    • ARG : DockerFile 안에서 사용할 수 있는 매개변수 정의 / 파라미터로 오버라이딩 가능
    • RUN : 지정한 명령 실행
    • WORKDIR : 이미지의 작업 폴더(work directory) 지정
    • COPY : 로컬 호스트에 존재하는 파일을 이미지 안으로 복사
    • ENV : 이미지의 환경변수를 지정
    • CMD : 이미지 실행시, default로 실행되는 명령 지정
    • ENTRYPOINT : CMD와 유사하게 명령을 실행하나, override 되지 않는 특징이 있다
      (매개변수로 명령어를 넘겨도 ENTRYPOINT로 지정된 명령어는 반드시 실행)
  • 도커 빌드
    • command 형식 : docker build <PATH> -t <IMAGE_NAME>/<TAG>
    • 설명 : DockerFileDocker Image로 변환하는 작업
/* 도커파일로 도커이미지 생성 */
docker build . -t hello:1

/* 생성한 이미지로 컨테이너 생성 */
docker run hello:1

/* 파라미터로 명령어를 넘긴다
   -> 도커파일 스크립트에 CMD가 되어있다면, 기존 CMD 명령은 override 된다 */
docker run hello:1 echo "hello world!"

/* --build-arg 옵션으로 ARG 매개변수 오버라이딩
   => 빌드 시점에 매개변수 오버라이딩 말고도, 컨테이너 실행 시점에서 매개변수 오버라이딩 가능 */
docker build . -t hello:2 --build-arg my_ver=2.0

/* -e 옵션으로 컨테이너 실행시 환경변수 주입 */
docker run -e my_ver=1.5 hello:1
  • CMD와 ENTRYPOINT의 차이점
    • CMD는 default command의 역할로 매개변수로 다른 명령을 넘겨주면 override 된다
    • ENTRYPOINT는 이미지를 실행 가능한 바이너리로 만들어주는 지시자의 역할로서 반드시 호출되며,
      파라미터로 값을 넘기면 ENTRYPOINT의 파라미터로 전달되는 특징이 있다

[ 고급 명령 ]

  • 포트 포워딩을 통해 외부 트래픽을 컨테이너 내부로 전달
    • 도커 컨테이너 생성(docker run) -p 옵션을 통해 포트 포워딩 가능
    • ip 확인 방법
      • 내부 IP : hostname -i 또는 ifconfig
      • 공인 IP : curl ifconfig.co
/* host의 5000번 포트로 요청하면, 컨테이너의 80번 포트로 매핑 */
docker run -p 5000:80 -d nginx

  • 볼륨 지정
    • command 형식 : docker run -v <HOST_DIR>:<CONTAINER_DIR> <IMAGE_NAME>
    • 설명
    • 컨테이너는 기본적으로 휘발성 프로세스
    • 컨테이너의 데이터를 지속적으로 보관하기 위해 볼륨을 사용
    • 로컬 호스트의 파일 시스템을 컨테이너와 연결 가능(볼륨 마운트)
    • 변경사항이 많은 경우에는 컨테이너 내부에 파일으 두지 않고, 호스트 서버에 디렉터리를 연결 가능
/* 현재 디렉터리를 컨테이너의 nginx 디렉터리에 마운트 */
docker run -p 6000:60 -v $(pwd):/usr/share/nginx/html -d nginx

  • ENTRYPOINT 강제 override
    • 도커 컨테이너 생성시 --entrypoint 옵션을 통해 강제로 override 가능
/* 이미지 생성 및 컨테이너 생성 */
docker build -t lets-echo
docjer run lets-echo hello
 # hello
/* 현재 디렉터리를 컨테이너의 nginx 디렉터리에 마운트 */
docker run --entrypoint=cat lets-echo /etc/passwd

  • root가 아닌 일반 유저를 사용하도록 지정
    • DockerFile에서 USER 지시자를 통해 특정 유저 지정
/* DockerFile */
FROM ubuntu:18.04
RUN adduser --disabled-password --gecos "" ubuntu // ubuntu 유저 생성
USER ubuntu

/* 도커파일을 통해 이미지 생성 및 컨테이너 실행 */
docker build -t my-user
docker run -it my-user bash
 # ubuntu 유저로 로그인

좋은 웹페이지 즐겨찾기