해당 포스팅은 '핵심만 콕 쿠버네티스' 서적을 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_ID
는docker 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
- 이미지 업로드
- 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 지시자
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>
- 설명 :
DockerFile
을Docker 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 유저로 로그인