본문 바로가기

Kubernetes

[Docker] Docker 소개

반응형

Docker 소개

도커는 서버에서 어플리케이션을 실행 할 때 사용하는 특별한 상자로 생각하면 된다.

'컨테이너'라고 부르며, 그 안에 어플리케이션을 넣어서 사용한다.

따라서, 서버에 여러 어플리케이션을 설치할 때 도커를 쓰면 이런 앱들을 하나의 컨테이너 안에 넣어서 편하게 관리할 수 있다.

 

 

Docker 와 Kubernetes의 차이

Docker Kubernetes
단일 컨테이너 실행 및 관리 컨테이너 오케스트레이션과 클러스터 관리
단일 호스트에서 작동 다중 호스트와 컨테이너 관리
개별적으로 수동으로 관리 자동 스케일링 및 로드 밸런싱
로컬 파일 시스템 또는 볼륨 사용 동적 프로비저닝 및 스토리지 오케스트레이션
수동으로 구성 가능 자동 롤링 업데이트 및 자동 복구
활발한 Docker 커뮤니티와 생태계 Kubernetes 생태계 및 다양한 플러그인과 툴 지원
상대적으로 단순 높은 복잡성 및 학습 곡선

 

 

 

Docker Architecture

 

Docker Client : 사용자가 Docker 와 상호 작용하는 기본 방법, docker run과 같은 명령을 사용하면 클라이언트는 이러한 명령을 docker에 보내고 dockerd가 수행

Docker Host : Docker 컨테이너를 실행하고 관리하는 데 사용하는 물리적 또는 가상화된 시스템

Docker daemon : API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨과 같은 Docker 개체를 관리

Images : 이미지는 Docker 컨테이너를 생성하기 위한 읽기 전용 템플릿

Containers : 컨테이너는 실행 가능한 이미지 인스턴스

Registry : 누구나 사용할 수 있느 Docker Hub 공개 레지스트리가 있으며, 필요시 자신만의 개인 레지스트리를 실행 가능

 

Docker Image

Image는 Container를 만들 때 필요한 부품으로 이해하면 된다. CLI 를 사용해서 필요한 Image를 서버에 내려 받을 수 있다.

# Image가 없는 상태에서 nginx history 조회시 에러 발생
docker history nginx
Error response from daemon: No such image: nginx:latest
---
# Docker registry에서 nginx 이미지를 서버에 저장
docker pull nginx
# Docker history 조회시
docker history nginx

 

 

 

Linux(Ubuntu20.04) Docker 설치

Docker 엔진을 설치하는 과정은 개발 및 운영 환경을 컨테이너로 관리하기 위한 중요한 단계입니다. Docker엔진의 종류, 버전 및 Linux 환경에 Docker 엔진을 설치하는 방법에 대해 알아보자.

더보기

Docker는 2021년 8월 31일부터 Docker Desktop 이용자를 대상으로 유료 요금제 가입을 유도하기 시작했다. 250명 이상의 직원이 속한 매출 1,000만 달러 이상의 Docker Desktop 고객은 2022년 1월 31일 까지 유료 구독에 등록해야 애플리케이션을 계속 사용할 수 있다.

Docker엔진은 여러 가지 버전과 에디션으로 제공된다. 가장 널리 사용되는 버전은 "Docker Community Edition(CE)"와 "Docker Enterprise Edition(EE)"이다. Docker CE는 개발 및 테스트 환경에서 무료로 사용 가능하다.

 

 

필수 패키지 설치

Docker 설치 이전 필요한 패키지 미리 설치한다.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

 

Docker Repository 설정

Docker의 공식 GPG 키를 추가하고, Docker의 APT Repository를 설정한다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

 

 

Docker 엔진 설치

sudo apt-get update
sudo apt-get install -y docker-ce

 

 

Docker 서비스 시작 및 활성화

sudo systemctl start docker
sudo systemctl enable docker

 

 

Docker 설치 확인

docker --version

 

 

권한 부여

'root' 계정이 아닌 서비스 계정을 사용하여 Docker를 실행하기 ㅜ이해 현재 사용자를 'docker'그룹에 추가

sudo usermod -aG docker ${USER}

 

변경 사항 적용

newgrp docker

 

 

이제 Docker 실습을 해보자.

https://docs.docker.com/engine/reference/run/

 

Running containers

Running and configuring containers with the Docker CLI

docs.docker.com

 

 

Image 조회

docker search <Image name or Image ID>
docker search nginx

user07@user07-vm1:~$ docker search nginx
NAME                               DESCRIPTION                                     STARS     OFFICIAL
nginx                              Official build of Nginx.                        20035     [OK]
unit                               Official build of NGINX Unit: Universal Web …   33        [OK]

 

더보기

Docker 이미지는 누구나 만들어서 업로드 할 수 있다. 그러나 Docker 이미지를 사용할 때, 가능하면 공식 이미지나 인증된 퍼블리셔의 이미지를 사용하거나 직접 만든 이미지를 사용하는 것이 좋다.

 

 

Imgae 서버에 가져오기

# 최신 버전의 nginx 이미지 가져오기
docker pull nginx

# 버전을 선택하여 nginx 이미지 가져오기
docker pull nginx:1.26.0


user07@user07-vm1:~$ docker pull nginx:1.26.0
1.26.0: Pulling from library/nginx

 

https://github.com/docker-library/repo-info/tree/master/repos

 

repo-info/repos at master · docker-library/repo-info

Extended information (especially license and layer details) about the published Official Images - docker-library/repo-info

github.com

더보기

위 Docker 공식 githug 링크에 들어가면 여러 종류의 이미지 정보를 확인 가능하다.

 

 

 

Image 시스템에 저장된 모든 Docker Image 검색

docker images

user07@user07-vm1:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    a72860cb95fd   4 weeks ago    188MB
nginx        1.26.0    94543a6c1aef   2 months ago   188MB

 

 

Container 실행

docker run --name <container_name> <image_name>
docker run -d -p 80:80 --name nginx -u root nginx:latest

root@user07-vm1:/home/user07# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                   NAMES
b07e01be833f   nginx:latest   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   mynginx


# 서버 재기동시 container 자동실행
docker run --restart always -d -p 8080:80 --name mynginx -u root nginx:latest

root@user07-vm1:/home/user07# docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' mynginx
always

 

더보기

run = pull(이미지 다운로드) + create(Container 생성) + start(Container 실행) 합쳐진 의미

 

Container 시작 및 정지

# Container 시작
docker start <container_id> <container_id> <container_id>

# Container 정지
docker stop <container_id> <container_id> <container_id>

 

 

Docker 삭제 관련 명령어

# 도커 이미지 삭제
docker rmi <image_id>

# stop된 컨데이터가 존재 할경우에 강제 삭제 (running 중인 컨테이너가 있을경우 삭제불가)
docker rmi -f <image_id>

# 사용되지 않는 이미지 삭제 (조심해서 사용)
docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

# docker container 삭제
docker rm <continaer_id>

# docker container 강제 삭제
docker rm -f <continaer_id>

# 모든 종료된 컨테이너 삭제
docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N]

# 모든 Docker 데이터 삭제
docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N]

 

 

Container 접근

docker exec -it <container_id> /bin/bash or /bin/sh

 

 

 

Container 상태 보기

root@user07-vm1:/home/user07# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
b07e01be833f   nginx:latest   "/docker-entrypoint.…"   31 minutes ago   Up 31 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   mynginx

 

 

Container log 상태 확인

docker logs <container_id>
docker logs --tail 10 <container_id>

 

 

 

Docker 시스템 정보 확인

root@user07-vm1:/home/user07# docker info
Client: Docker Engine - Community
 Version:    27.1.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.16.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 1
  Running: 1
  Paused: 0
  Stopped: 0
 Images: 2
 Server Version: 27.1.1
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: false
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 2bf793ef6dc9a18e00cb12efb64355c2c9d5eb41
 runc version: v1.1.13-0-g58aa920
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
 Kernel Version: 5.15.0-1068-azure
 Operating System: Ubuntu 20.04.6 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 7.704GiB
 Name: user07-vm1
 ID: c7c3a01f-e2e1-45e2-9b8c-756c568aa40c
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false