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/
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
위 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
'Kubernetes' 카테고리의 다른 글
CNCF란? Cloud Native란? (0) | 2024.09.25 |
---|---|
[Docker] Docker 이미지 빌드, 배포, 백업 (0) | 2024.07.25 |
실습으로 배우는 쿠버네티스 멀티 클러스터 관리 (0) | 2024.07.15 |
Github WebHooks 연동하여 Jenkins 빌드 자동화 (0) | 2024.03.13 |
Jenkins를 Kubernetes 에 구성하기 (0) | 2024.03.11 |