이 포스팅은 유홍근 저자의 저서 "핵심만 콕! 쿠버네티스"를 읽고, 참고하여 그 내용을 정리한 것입니다.
애플리케이션을 컨테이너로 패킹징하여 어디서든 동일하게 실행할 수 있도록 해주는 가상화 오픈소스 플랫폼
기존의 서버에 하이퍼바이저를 설치하고, 그 위에 가상OS와 App을 통째로 패키징하는 방식인 하드웨어 레벨의 가상화를 지원
운영체제를 제외한 나머지 애플리케이션 실행에 필요한 모든 파일을 패키징하는 OS레벨의 가상화를 지원
사용자가 CD만 들고있으면 CD 플레이어가 설치된 어느 컴퓨터에서든지 그 CD를 재생할 수 있다.
→ 사용자가 도커 이미지(CD)만 가지고 있으면 도커 데몬(CD 플레이어)이 설치된 어느 컴퓨터에서든지 도커 프로세스(CD 실행)를 실행할 수 있다.
❓ Docker Daemon (도커 데몬)
컨테이너를 관리하는 백그라운드 프로세스 (Docker의 심장 역할)
사용자가 도커 명령어를 실행하면, Docker 데몬이 이를 받아서 컨테이너를 생성하고 실행한다.
docker run <IMAGE>:<TAG> [<args>]
도커 이미지 주소 형식
<레지스트리 이름>/<이미지 이름>:<TAG>
docker.io
latest
현재 실행중인 컨테이너의 목록을 보여준다. (process status)
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7f3a1c32c54 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:8080->80/tcp my-nginx
a8e9f1d54b12 redis "redis-server" 2 days ago Up 2 days 6379/tcp redis-container
e3d4f6a17c9a ubuntu "bash" 5 days ago Up 5 days ubuntu-bash
컨테이너, 이미지, 볼륨, 네트워크 등 Docker 객체에 대한 상세 정보를 JSON 형식으로 출력하는 명령어
docker inspect <컨테이너_ID or 컨테이너_이름>
[
{
"Id": "b7f3a1c32c543dfaae4a4bba8b06bbf1edac5f0f6dc3f25b7c14a1f2d6db31a1",
"Created": "2024-01-01T12:00:00Z",
"Path": "nginx",
"Args": [
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
생략...
백그라운드로 실행된 컨테이너의 로그를 직접 확인할 수 있다. (Ctrl + C로 로깅 종료)
docker logs <컨테이너_ID or 컨테이너_이름>
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
...
실행 중인 컨테이너 안에서 명령어를 실행하거나, 컨테이너 내부로 들어가서 직접 작업할 때 사용한다.
간혹 실행된 컨테이너에 새로운 패키지를 설치하거나 설정을 수정해야하는 경우 사용됨.
docker exec [옵션] <컨테이너_ID or 컨테이너_이름> <명령어>
bash
실행 (-it
옵션) docker exec -it my-nginx /bin/bash
docker exec my-nginx cat /etc/nginx/nginx.conf
컨테이너 내부의 설정 파일을 수정하거나, 컨테이너에서 로그 파일을 가져올 때 사용된다.
docker cp <CONTAINER_ID>:<CONTAINER_PATH> <HOST_PATH>
docker cp <HOST_PATH> <CONTAINER_ID>:<CONTAINER_PATH>
사용이 완료된 컨테이너를 중단한다. (이후, start
로 재시작할 수 있다)
docker stop <CONTAINER_ID>
종료된 컨테이너를 다시 시작
docker start <CONTAINER_ID>
중단된 컨테이너를 완전히 삭제. 삭제 후에는 더는 컨테이너를 재개하지 못한다.
docker rm <CONTAINER_ID>
도커 이미지 원격 저장소
도커 허브 로그인
docker login
이미지 업로드
docker push <USERNAME>/<NAME>
이미지 다운로드
docker pull <IMAGE_NAME>
도커 이미지를 생성하기 위해서 작성하는 문서
# 베이스 이미지
FROM node:14
# 작업 디렉토리 지정
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
FROM | 기반 이미지 |
---|---|
RUN | 사용자가 지정한 명령을 실행하는 지시자 |
WORKDIR | 작업 디렉토리 |
COPY | 호스트(로컬 시스템)의 파일이나 디렉토리를 컨테이너로 복사 |
ENV | 환경변수 지정 |
CMD | 이미지 실행 시, default로 실행되는 명령을 지정 |
도커 빌드
docker build <PATH> -t <IMAGE_NAME>:<TAG>
docker run
에서 덮어쓰기 가능docker run
의 인자가 entrypoint명령어 뒤에 추가됨. 덮어쓰기 하고 싶다면 --entrypoint
옵션을 사용해야 한다.도커 실행 시 몇 가지 옵션들 조금 더 소개
Docker 컨테이너는 기본적으로 외부에서 접근할 수 없는 격리된 환경에서 실행된다.
따라서 외부의 트래픽을 컨테이너 대부로 전달하기 위해서는 포트 포워딩(매핑)을 해야한다.
# 호스트의 5000번 포트를 컨테이너의 80포트와 매핑
docker run -p 5000:80 -d nginx
컨테이너는 휘발성 프로세스이기 때문에 기본적으로 종료되면 내부 데이터가 사라진다.
컨테이너의 데이터를 지속적으로 보관하기 위해서는 볼륨이라는 것을 사용. (컨테이너 외부에 저장하는 방식)
# 현재 디렉터리(호스트)를 컨테이너의 nginx 디렉터리와 연결
docker run -p 6000:80 -v $(pwd):/usr/share/nginx/html -d nginx
기본적으로 Docker 컨테이너는 루트(root) 사용자로 실행된다.
하지만 보안 강화를 위해 특정 사용자로 컨테이너를 실행할 수 있습니다.
FROM ubuntu:18.04
# 유저 생성
RUN adduser --disabled-password --gecos "" appuser
# 컨테이너 실행 시 appuser라는 이름의 사용자로 실행
USER appuser
옵션 | 설명 |
---|---|
adduser | 새로운 사용자를 추가하는 명령어 |
--disabled-password | 비밀번호를 비활성화 (비밀번호 없이 사용자 생성) |
--gecos "" | 사용자 정보(이름, 전화번호 등)를 묻지 않고 기본 설정 |
appuser | 생성할 사용자 이름 |
# my-user라는 이미지 생성
docker build . -t my-user
# ubuntu라는 이름의 유저로 컨테이너를 실행
docker run -it my-user bash
ubuntu@b09ce82d4a77:$ apt update
# 결과: Permission denied 퍼미션 에러 발생!
root권한이 필요한 apt
를 사용하게되면 퍼미션 에러가 발생한다.
# 강제로 root 유저 사용하도록 함
docker run --user root -it my-user bash
ubuntu@b09ce82d4a77:$ apt update
--user
옵션을 이용하여 명시적으로 유저를 입력할 수 있다.