Untitled

도커설치

https://docs.docker.com/

https://docs.docker.com/engine/install/ubuntu/

→ 필수 종속성 설치 및 레파지토리 업데이트

# 패키지 목록을 업데이트하여 최신 정보를 가져옴
sudo apt-get update

# 필수 패키지 설치 (ca-certificates: SSL 인증서 관리, curl: 데이터 전송 도구)
sudo apt-get install ca-certificates curl

패키지 목록을 최신 상태로 업데이트하고, SSL 인증서 관리를 위한 ca-certificates 패키지와 데이터 전송을 위한 curl 패키지를 설치했다. 이후, Docker GPG 키를 저장할 디렉터리(/etc/apt/keyrings)를 생성하고 적절한 권한을 부여했다.

# /etc/apt/keyrings 디렉터리를 생성 (-m 0755: 권한 설정, -d: 디렉터리 생성 옵션)
sudo install -m 0755 -d /etc/apt/keyrings

# Docker의 공식 GPG 키를 다운로드하여 /etc/apt/keyrings/docker.asc에 저장
sudo curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> -o /etc/apt/keyrings/docker.asc

# GPG 키 파일의 읽기 권한을 모든 사용자에게 부여 (a+r: 모든 사용자 읽기 권한 추가)
sudo chmod a+r /etc/apt/keyrings/docker.asc

Docker 패키지의 무결성을 검증하기 위해 공식 GPG 키를 다운로드하여 /etc/apt/keyrings/docker.asc에 저장하고, 모든 사용자가 읽을 수 있도록 권한을 설정했다.

# Docker의 공식 패키지 저장소를 Apt 소스 목록에 추가
# - $(dpkg --print-architecture): 현재 시스템의 아키텍처 확인 (예: amd64, arm64)
# - signed-by=/etc/apt/keyrings/docker.asc: GPG 키 파일을 사용하여 저장소의 패키지 서명 검증
# - $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}"): 현재 Ubuntu 버전의 코드명 가져오기 (예: focal, jammy)
# - stable: 안정적인 패키지 채널 사용
echo \\
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] <https://download.docker.com/linux/ubuntu> \\
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \\
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 패키지 목록을 다시 업데이트하여 Docker 저장소에서 최신 패키지 정보를 가져옴
sudo apt-get update

그런 다음, 현재 시스템의 아키텍처와 Ubuntu 버전에 맞는 Docker 공식 패키지 저장소를 /etc/apt/sources.list.d/docker.list에 추가했다. 마지막으로, 새로 추가된 저장소에서 패키지를 검색할 수 있도록 패키지 목록을 다시 업데이트했다.

→ 필수 종속성 설치 및 레파지토리 업데이트

image.png

  1. 최신 버전을 설치하려면 다음을 실행하십시오.

     sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
     
    
    

    이 명령어는 Docker를 사용하기 위한 여러 가지 중요한 프로그램을 설치한다.

  2. 다음을 실행하여 설치가 성공적인지 확인하십시오. hello-world 영상:

    sudo docker run hello-world
    
    

    sudo docker run hello-world 명령어를 실행하여 Docker가 정상적으로 작동하는지 테스트한 결과, 로컬에 해당 이미지가 없었기 때문에 Docker는 자동으로 Docker Hub에서 최신 버전의 hello-world 이미지를 다운로드하고, 이를 기반으로 컨테이너를 생성하여 실행했다. 컨테이너 내부에서 실행된 프로그램이 "Hello from Docker!" 메시지를 출력하며, 이는 Docker가 정상적으로 작동하고 있음을 의미한다. 실행 과정에서 Docker 클라이언트는 Docker 데몬과 통신하여 이미지를 다운로드하고, 이를 기반으로 컨테이너를 생성한 뒤, 실행된 컨테이너의 출력을 터미널에 전달했다.

  3. 도커 info 를 확인해봅시다

    sudo docker info
    
    
    # Docker 클라이언트(Client) 정보
    Client: Docker Engine - Community
     Version:    28.0.0          # Docker 클라이언트 버전
     Context:    default         # 현재 Docker 컨텍스트 (기본값: default)
     Debug Mode: false          # 디버그 모드 비활성화
    
    # Docker 플러그인 정보
    Plugins:
      buildx: Docker Buildx (Docker Inc.)   # Buildx 플러그인 (멀티 아키텍처 빌드 지원)
        Version:  v0.21.0
        Path:     /usr/libexec/docker/cli-plugins/docker-buildx
      compose: Docker Compose (Docker Inc.) # Docker Compose 플러그인 (멀티 컨테이너 관리)
        Version:  v2.33.0
        Path:     /usr/libexec/docker/cli-plugins/docker-compose
    
    # Docker 서버(Server) 정보
    Server:
     Containers: 1    # 현재 존재하는 컨테이너 개수 (총 1개)
      Running: 0     # 실행 중인 컨테이너 개수 (0개)
      Paused: 0      # 일시 정지된 컨테이너 개수 (0개)
      Stopped: 1     # 중지된 컨테이너 개수 (1개)
     Images: 1       # 현재 저장된 Docker 이미지 개수 (1개)
    
    # Docker 엔진 정보
     Server Version: 28.0.0    # Docker 엔진 버전
     Storage Driver: overlay2  # 사용 중인 스토리지 드라이버 (overlay2)
      Backing Filesystem: extfs  # 파일 시스템 타입 (extfs - 일반적으로 ext4)
      Supports d_type: true      # 파일 타입 지원 여부
      Using metacopy: false      # 메타데이터 복사 기능 사용 여부
      Native Overlay Diff: true  # overlay2의 네이티브 diff 기능 활성화 여부
      userxattr: false           # 사용자 확장 속성 지원 여부
    
    # 로그 드라이버 설정
     Logging Driver: json-file  # 기본 로그 드라이버 (json 파일로 저장)
     Cgroup Driver: systemd     # cgroup을 관리하는 방식 (systemd 사용)
     Cgroup Version: 2          # 사용 중인 cgroup 버전 (v2)
    
    # 지원하는 네트워크 드라이버
     Plugins:
      Volume: local                   # 볼륨 관리 플러그인 (local)
      Network: bridge host ipvlan macvlan null overlay  # 지원하는 네트워크 모드
      Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog  # 지원하는 로깅 방식
    
    Swarm: inactive  # Swarm 모드 비활성화 (클러스터링 기능 비활성화)
    
    # 실행 가능한 컨테이너 런타임(Runtime)
     Runtimes: io.containerd.runc.v2 runc  # 기본적으로 runc 사용
     Default Runtime: runc                 # 기본 컨테이너 런타임
    
    # Docker 초기화 바이너리
     Init Binary: docker-init               # 컨테이너 초기화 실행 파일
     containerd version: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb  # containerd 버전
     runc version: v1.2.4-0-g6c52b3f        # runc 버전
     init version: de40ad0                  # init 버전
    
    # 보안 설정 정보
     Security Options:
      apparmor   # AppArmor 보안 기능 활성화
      seccomp    # Seccomp(시스템 호출 제한 기능) 활성화
       Profile: builtin  # 내장된 seccomp 프로파일 사용
      cgroupns   # cgroup 네임스페이스 기능 활성화
    
    # 운영체제 및 시스템 정보
     Kernel Version: 5.15.0-131-generic  # 커널 버전
     Operating System: Ubuntu 22.04.5 LTS  # 현재 실행 중인 운영체제
     OSType: linux                        # OS 유형 (리눅스)
     Architecture: x86_64                  # CPU 아키텍처 (64비트)
     CPUs: 4                                # 사용 가능한 CPU 개수
     Total Memory: 3.82GiB                  # 총 시스템 메모리
    
    # Docker 저장소 경로
     Docker Root Dir: /var/lib/docker       # Docker의 기본 데이터 저장소 경로
    
     Debug Mode: false   # 디버그 모드 비활성화
     Experimental: false  # 실험적 기능 비활성화
    
    # 신뢰할 수 없는 레지스트리(Insecure Registries)
     Insecure Registries:
      ::1/128       # IPv6 루프백 주소 포함
      127.0.0.0/8   # 로컬 네트워크 허용
    
     Live Restore Enabled: false  # Live Restore 비활성화 (Docker가 중지되면 컨테이너도 중지됨)
    
    

도커 기본 활용법

→ 도커 작동 방식

image.png

도커를 이용해 애플리케이션을 실행하려고 할 때 먼저 docker run 또는 docker create 명령을 통해 컨테이너가 생성된다 이 시점에서 컨테이너는 created 상태로 머무르다가 docker start 명령이 내려오면 곧바로 실행되어 running 상태가 된다 실행 중인 컨테이너는 필요에 따라 docker pause 명령을 통해 일시 정지되고 그 상태에서 다시 docker unpause 명령을 내리면 재개되어 다시 running 상태로 돌아온다 만약 컨테이너를 중단하고 싶다면 docker stop 명령을 사용해 프로세스를 정상 종료할 수 있으며 이때 컨테이너는 stopped 상태가 된다 컨테이너가 멈춘 뒤 정책에 따라 재시작 여부를 확인할 수도 있고 필요하다면 docker restart 명령으로 곧바로 시작할 수도 있다 반면 강제로 종료해야 할 상황이 발생하면 docker kill 명령을 통해 프로세스를 종료시키고 그 결과 컨테이너는 die 과정을 거쳐 stopped 상태에 머문 뒤 필요에 따라 삭제될 수 있다 컨테이너가 삭제되면 deleted 상태가 되며 해당 컨테이너는 더 이상 존재하지 않아 완전히 제거된 것으로 간주된다

  1. docker pull로 이미지를 다운로드하고 docker createdocker run을 통해 컨테이너를 생성한다.
  2. docker start로 컨테이너를 실행하면 running 상태가 된다.
  3. docker pausedocker unpause를 통해 일시 정지와 재개를 할 수 있다.
  4. docker stop으로 정상 종료하면 stopped 상태가 되며, 필요하면 docker restart로 재시작이 가능하다.
  5. 긴급하게 종료해야 할 때는 docker kill을 사용하고, 이후 stopped 상태로 남는다.
  6. 더 이상 필요 없는 컨테이너는 docker rm 명령을 통해 deleted 상태로 완전히 제거할 수 있다.

이처럼 도커 컨테이너는 생성 → 실행 → 일시정지/재개 → 정상 종료/강제 종료 → 삭제의 과정을 거치며 애플리케이션의 라이프사이클을 유연하고 효율적으로 관리한다.

→ 도커를 pull 하고 run 하면 생기는 일

image.png

먼저 docker pull 명령을 통해 원격 레지스트리에서 이미지를 다운로드하고 필요한 준비 과정을 마친다 그런 다음 docker create 명령으로 다운로드된 이미지를 기반으로 컨테이너를 생성하여 미리 설정된 환경을 갖춘 상태로 대기시킨다.

컨테이너가 준비되면 docker start 명령으로 실행하여 running 상태로 전환하고 필요하다면 docker pause 명령을 통해 실행 중인 컨테이너를 일시 정지한 뒤 docker unpause 명령으로 다시 활성화할 수 있다.

컨테이너를 멈추려면 docker stop 명령을 사용하여 정상적으로 종료시키고 해당 컨테이너를 완전히 삭제하고 싶다면 docker rm 명령을 실행하여 deleted 상태가 되어 더 이상 존재하지 않는 컨테이너로 처리된다 강제 종료가 필요한 경우 docker kill 명령을 통해 프로세스를 강제로 중단할 수 있으며 이때 컨테이너는 die 과정을 거쳐 stopped 상태가 되고 이후 필요에 따라 다시 시작하거나 완전히 제거할 수 있다.

컨테이너를 손쉽게 재시작하고 싶다면 docker restart 명령을 통해 자동으로 멈췄다가 다시 실행되도록 할 수도 있으며 모든 과정을 거쳐 최종적으로 docker rm 명령을 실행하면 컨테이너가 완전히 제거되어 더 이상 남아 있지 않게 된다

→ 도커 이미지 확인법

docker image ls

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
ubuntu        latest    a04dc4851cbc   4 weeks ago   78.1MB
hello-world   latest    74cc54e27dc4   4 weeks ago   10.1kB

→ Docker Create

image.png

docker create -it --name mzc-ct01 ubuntu

docker ps -a

각 명령어 설명

  1. docker create -it --name mzc-ct01 ubuntu
  2. docker create -it ubuntu
  3. docker create -it -p 8080:80 --name mzc-ct01 ubuntu

→ Docker Start

image.png

docker ps -a
docker start mzc-ct01

→ Docker Ps

image.png

docker ps -a

도커 메타데이터를 확인할 수 있음

즉, 동작중인 도커 확인 가능

도커의 메타데이터는 /var/lib/docker 에 위치함

→ Docker Attatch

image.png

docker attach mzc-ct01
root@dytl:~# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
b0717c3fa984   ubuntu    "/bin/bash"   8 minutes ago   Up 5 minutes             mzc-ct01
root@dytl:~# docker attach mzc-ct01
root@b0717c3fa984:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@b0717c3fa984:/#

  1. docker attach 명령어는 실행 중인 컨테이너에 다시 접속하는 기능을 한다.
  2. 주의할 점

→ Docker exec

image.png

docker exec -it mzc-ct01 /bin/bash

→ Docker stop

image.png

docker stop mzc-ct01

→ Docker restart

image.png

watch -n 1 docker ps -a

watch는 지정된 간격으로 주기적으로 다른 명령어나 스크립트를 실행하고, 결과를 실시간으로 터미널에 표시하는 역할을 한다.

기본적으로 실행적인 결과를 확인하기 위한 모니터링용으로 사용한다.

ps라는 명령어를 매칭하는것