[핵심만콕!쿠버네티스] Chapter1. 도커 기초

mj·어제
0

kbt

목록 보기
18/18
post-thumbnail

이 포스팅은 유홍근 저자의 저서 "핵심만 콕! 쿠버네티스"를 읽고, 참고하여 그 내용을 정리한 것입니다.


📖 Chapter1. 도커 기초

1.1. 도커 소개


🐳 Docker 란?

애플리케이션을 컨테이너로 패킹징하여 어디서든 동일하게 실행할 수 있도록 해주는 가상화 오픈소스 플랫폼

도커의 장점

  • 표준화 (Standard)
  • 이식성 (Portability)
  • 가볍다 (Lightweight)
  • 강한 보안 (Secure)

컨테이너와 가상머신


가상머신 (VM)

기존의 서버에 하이퍼바이저를 설치하고, 그 위에 가상OS와 App을 통째로 패키징하는 방식인 하드웨어 레벨의 가상화를 지원

  • 독립적인 운영체제를 포함하고 있어 고립성은 더 좋을 수 있겠지만, 오버헤드가 커지기 때문에 더 무겁고 느리다는 단점을 가짐.

컨테이너

운영체제를 제외한 나머지 애플리케이션 실행에 필요한 모든 파일을 패키징하는 OS레벨의 가상화를 지원

  • 여러개의 컨테이너가 동일한 OS 커널을 공유하여 가벼움

💿 CD 플레이어와 도커

사용자가 CD만 들고있으면 CD 플레이어가 설치된 어느 컴퓨터에서든지 그 CD를 재생할 수 있다.

→ 사용자가 도커 이미지(CD)만 가지고 있으면 도커 데몬(CD 플레이어)이 설치된 어느 컴퓨터에서든지 도커 프로세스(CD 실행)를 실행할 수 있다.

Docker Daemon (도커 데몬)
컨테이너를 관리하는 백그라운드 프로세스 (Docker의 심장 역할)
사용자가 도커 명령어를 실행하면, Docker 데몬이 이를 받아서 컨테이너를 생성하고 실행한다.



1.2 도커 기본 명령


컨테이너 실행

docker run <IMAGE>:<TAG> [<args>]

도커 이미지 주소 형식

<레지스트리 이름>/<이미지 이름>:<TAG>
  • 기본 레지스트리 주소: docker.io
  • 기본 사용 TAG: 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
  • Nginx 설정 파일 보기 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>


1.3 도커 저장소


Docker Hub

도커 이미지 원격 저장소

도커 허브 로그인

docker login

이미지 업로드

docker push <USERNAME>/<NAME>

이미지 다운로드

docker pull <IMAGE_NAME>


1.4 도커 파일 작성


도커 이미지를 생성하기 위해서 작성하는 문서

# 베이스 이미지 
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>

CMD vs ENTRYPOINT

  • CMD: docker run 에서 덮어쓰기 가능
  • ENTRYPOINT: 덮어쓰기 불가능, docker run의 인자가 entrypoint명령어 뒤에 추가됨. 덮어쓰기 하고 싶다면 --entrypoint 옵션을 사용해야 한다.


1.5 도커 실행 고급

도커 실행 시 몇 가지 옵션들 조금 더 소개


Network

Docker 컨테이너는 기본적으로 외부에서 접근할 수 없는 격리된 환경에서 실행된다.

따라서 외부의 트래픽을 컨테이너 대부로 전달하기 위해서는 포트 포워딩(매핑)을 해야한다.

# 호스트의 5000번 포트를 컨테이너의 80포트와 매핑
docker run -p 5000:80 -d nginx

Volume

컨테이너는 휘발성 프로세스이기 때문에 기본적으로 종료되면 내부 데이터가 사라진다.

컨테이너의 데이터를 지속적으로 보관하기 위해서는 볼륨이라는 것을 사용. (컨테이너 외부에 저장하는 방식)

# 현재 디렉터리(호스트)를 컨테이너의 nginx 디렉터리와 연결
docker run -p 6000:80 -v $(pwd):/usr/share/nginx/html -d nginx

User

기본적으로 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 옵션을 이용하여 명시적으로 유저를 입력할 수 있다.

profile
일단 할 수 있는걸 하자.

0개의 댓글