Introduction
This tutorial will guide you through the process of quickly setting up a best docker container up and running server. You'll learn how to install Docker, create and manage Docker containers, configure networking and scaling, and troubleshoot your Docker environments. By the end of this tutorial, you'll have a solid understanding of Docker and be able to set up a robust and scalable Docker container server.
Docker 및 그 이점 이해
Docker 는 애플리케이션 개발, 배포 및 관리 방식을 혁신한 강력한 컨테이너화 플랫폼입니다. 표준화된 방식으로 소프트웨어를 패키징하고 배포하여 다양한 환경에서 애플리케이션을 빌드, 배포 및 실행하기를 용이하게 합니다.
Docker 란 무엇인가요?
Docker 는 개발자가 컨테이너 내에서 애플리케이션을 빌드, 배포 및 실행할 수 있도록 지원하는 오픈 소스 소프트웨어 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 모든 것을 포함하는 경량, 독립 실행형 및 실행 가능한 패키지입니다. 코드, 런타임, 시스템 도구 및 라이브러리가 포함됩니다.
Docker 의 이점
- 일관성: Docker 컨테이너는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장하여 일관되고 예측 가능한 환경을 제공합니다.
- 이식성: Docker 컨테이너는 개발자의 노트북에서 프로덕션 서버까지 다양한 플랫폼 간에 쉽게 이동 및 배포할 수 있습니다. 복잡한 구성 변경 없이도 가능합니다.
- 확장성: Docker 는 필요에 따라 컨테이너를 신속하게 생성 및 삭제하여 애플리케이션을 쉽게 확장 또는 축소할 수 있도록 지원하여 효율적인 리소스 활용을 가능하게 합니다.
- 격리: Docker 컨테이너는 애플리케이션과 그 종속성이 호스트 시스템 및 서로 격리되도록 높은 수준의 격리를 제공하여 충돌 및 보안 취약성 위험을 줄입니다.
- 효율성: Docker 컨테이너는 기존 가상 머신보다 경량이며 더 적은 리소스를 사용하여 하드웨어를 더 효율적으로 사용하고 시작 시간을 단축합니다.
Docker 아키텍처
Docker 는 Docker 클라이언트가 Docker 데몬과 통신하는 클라이언트 - 서버 아키텍처를 사용합니다. Docker 데몬은 컨테이너, 이미지 및 기타 Docker 리소스를 관리하는 역할을 합니다. Docker 데몬은 클라이언트와 동일한 머신 또는 원격 머신에서 실행될 수 있습니다.
graph LR
A[Docker Client] -- 명령어 --> B[Docker Daemon]
B -- 관리 --> C[Docker Images]
B -- 관리 --> D[Docker Containers]
B -- 관리 --> E[Docker Volumes]
B -- 관리 --> F[Docker Networks]
Docker 의 활용 사례
Docker 는 다양한 산업 및 시나리오에서 널리 사용됩니다.
- 마이크로서비스: Docker 는 각 서비스를 별도의 컨테이너로 패키징 및 배포할 수 있는 마이크로서비스 기반 애플리케이션을 구축 및 배포하는 데 특히 적합합니다.
- 지속적 통합 및 배포: Docker 는 CI/CD 파이프라인과 원활하게 통합하여 애플리케이션의 자동 빌드, 테스트 및 배포를 가능하게 합니다.
- 클라우드 및 서버리스 컴퓨팅: Docker 컨테이너는 클라우드 플랫폼에서 쉽게 배포 및 확장할 수 있어 효율적이고 비용 효율적인 클라우드 기반 애플리케이션을 구축할 수 있습니다.
- 개발자 생산성: Docker 는 일관되고 재현 가능한 환경을 제공하여 개발 및 테스트 프로세스를 단순화하고 "내 컴퓨터에서는 작동합니다" 문제를 해결합니다.
Docker 의 기본 사항과 이점을 이해함으로써 애플리케이션 개발 및 배포 프로세스를 간소화하기 위해 컨테이너화의 힘을 활용하기 시작할 수 있습니다.
운영 체제에 Docker 설치하기
Ubuntu 22.04 에 Docker 설치하기
Ubuntu 22.04 에 Docker 를 설치하려면 다음 단계를 따르세요.
- 패키지 인덱스를 업데이트하고 필요한 종속성을 설치합니다.
sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
- 공식 Docker GPG 키를 추가합니다.
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
- Docker 리포지토리를 설정합니다.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Docker Engine, containerd 및 Docker Compose 패키지를 설치합니다.
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 다음 명령어를 실행하여 설치를 확인합니다.
sudo docker run hello-world
이 명령어는 테스트 이미지를 다운로드하고 컨테이너에서 실행하여 Docker 설치가 정상적으로 작동하는지 확인합니다.
루트 사용자가 아닌 사용자로 Docker 관리하기
기본적으로 Docker 데몬은 루트 사용자로 실행되므로 보안 위험이 있을 수 있습니다. 루트 사용자가 아닌 사용자로 Docker 를 관리하려면 다음 단계를 따르세요.
- Docker 그룹을 만듭니다.
sudo groupadd docker
- 사용자를 Docker 그룹에 추가합니다.
sudo usermod -aG docker $USER
변경 사항이 적용되도록 로그아웃하고 다시 로그인합니다.
sudo 없이 Docker 명령어를 실행할 수 있는지 확인합니다.
docker run hello-world
이제 루트 사용자가 아닌 사용자로 Docker 를 관리하여 시스템의 전반적인 보안을 향상시킬 수 있습니다.
Docker 컨테이너 생성 및 실행
Docker 이미지와 컨테이너 이해
Docker 이미지는 Docker 컨테이너를 생성하는 기반입니다. 이미지는 Docker 컨테이너를 생성하기 위한 지침을 담고 있는 읽기 전용 템플릿입니다. Docker 이미지를 실행하면 이미지의 실행 가능한 인스턴스인 컨테이너가 생성됩니다.
Docker 컨테이너 생성
Docker 컨테이너를 생성하려면 docker run 명령어를 사용할 수 있습니다. 기본 구문은 다음과 같습니다.
docker run [옵션] 이미지 [명령] [인수]
nginx:latest 이미지를 기반으로 컨테이너를 생성하고 Nginx 웹 서버를 실행하는 예는 다음과 같습니다.
docker run -d -p 80:80 --name my-nginx nginx:latest
명령어를 자세히 살펴보겠습니다.
-d: 컨테이너를 분리 모드 (백그라운드) 로 실행-p 80:80: 호스트 포트 80 을 컨테이너 포트 80 으로 매핑--name my-nginx: 컨테이너에 이름 "my-nginx" 할당nginx:latest: 컨테이너 생성에 사용할 이미지
Docker 컨테이너와 상호 작용
컨테이너가 실행되면 다양한 Docker 명령어를 사용하여 컨테이너와 상호 작용할 수 있습니다.
docker ps: 모든 실행 중인 컨테이너 목록docker stop my-nginx: "my-nginx" 컨테이너 중지docker start my-nginx: "my-nginx" 컨테이너 시작docker logs my-nginx: "my-nginx" 컨테이너의 로그 표시docker exec -it my-nginx bash: "my-nginx" 컨테이너에 들어가 bash 셸 열기
사용자 정의 Docker 이미지 생성
Dockerfile 을 사용하여 사용자 정의 Docker 이미지를 만들 수도 있습니다. Dockerfile 은 Docker 이미지를 빌드하기 위한 지침이 포함된 텍스트 파일입니다. 사용자 정의 HTML 페이지가 포함된 사용자 정의 Nginx 이미지를 만드는 예제 Dockerfile 은 다음과 같습니다.
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
이후 이미지를 빌드하고 기반으로 컨테이너를 실행할 수 있습니다.
docker build -t my-custom-nginx .
docker run -d -p 80:80 --name my-custom-nginx my-custom-nginx
Docker 컨테이너 생성 및 실행의 기본 사항을 이해하면 컨테이너화의 힘을 활용하여 자신의 애플리케이션을 빌드하고 배포하기 시작할 수 있습니다.
Docker 컨테이너 구성 및 관리
Docker 컨테이너 구성
Docker 컨테이너를 생성할 때 다양한 구성 옵션을 지정하여 동작을 사용자 지정할 수 있습니다. 일반적인 구성 옵션은 다음과 같습니다.
- 포트:
-p또는--publish플래그를 사용하여 호스트 포트를 컨테이너 포트에 매핑합니다. - 환경 변수:
-e또는--env플래그를 사용하여 환경 변수를 설정합니다. - 볼륨:
-v또는--volume플래그를 사용하여 호스트 디렉토리 또는 파일을 컨테이너에 마운트합니다. - 네트워크:
--network플래그를 사용하여 컨테이너를 특정 네트워크에 연결합니다. - 리소스 제한: 컨테이너가 사용할 수 있는 리소스 (CPU, 메모리 등) 의 양을 제한합니다.
몇 가지 구성 옵션을 사용하여 컨테이너를 생성하는 예는 다음과 같습니다.
docker run -d -p 8080:80 -e DB_HOST=192.168.1.100 -v /host/path:/container/path --network my-network nginx:latest
Docker 컨테이너 관리
컨테이너가 실행되면 다양한 Docker 명령어를 사용하여 관리할 수 있습니다.
docker ps: 모든 실행 중인 컨테이너 목록docker stop <container_name>: 실행 중인 컨테이너 중지docker start <container_name>: 중지된 컨테이너 시작docker restart <container_name>: 실행 중인 컨테이너 재시작docker rm <container_name>: 중지된 컨테이너 제거docker logs <container_name>: 컨테이너의 로그 보기docker exec -it <container_name> <command>: 실행 중인 컨테이너 내에서 명령 실행
컨테이너 수명주기 관리
Docker 컨테이너는 다음과 같은 상태를 포함하는 수명주기를 갖습니다.
- Created: 컨테이너가 생성되었지만 아직 시작되지 않음
- Running: 컨테이너가 현재 실행 중
- Paused: 컨테이너의 프로세스가 일시 중지됨
- Stopped: 컨테이너가 중지됨
- Deleted: 컨테이너가 제거됨
docker start, docker stop, docker pause, docker rm과 같은 다양한 Docker 명령어를 사용하여 컨테이너의 수명주기를 관리할 수 있습니다.
컨테이너 네트워킹
Docker 는 컨테이너를 연결하기 위한 여러 네트워킹 옵션을 제공합니다.
- Bridge 네트워크: 기본 네트워크 모드로, 컨테이너가 가상 브리지 네트워크에 연결됩니다.
- Host 네트워크: 컨테이너가 호스트 시스템과 동일한 네트워크 스택을 공유합니다.
- Overlay 네트워크: 서로 다른 Docker 호스트에서 실행되는 컨테이너가 통신할 수 있도록 하는 멀티 호스트 네트워크입니다.
docker network 명령어를 사용하여 Docker 네트워크를 생성하고 관리할 수 있습니다.
Docker 컨테이너를 구성하고 관리하는 방법을 이해하면 컨테이너화된 환경에서 애플리케이션을 효과적으로 배포하고 유지 관리할 수 있습니다.
Docker 이미지 빌드 및 공유
Docker 이미지 빌드
사용자 정의 Docker 이미지를 빌드하려면 docker build 명령과 Dockerfile 을 사용합니다. Dockerfile 은 Docker 이미지를 빌드하기 위한 지침이 포함된 텍스트 파일입니다.
사용자 정의 HTML 페이지가 포함된 사용자 정의 Nginx 이미지를 만드는 예제 Dockerfile 은 다음과 같습니다.
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
다음 명령을 사용하여 이미지를 빌드할 수 있습니다.
docker build -t my-custom-nginx .
이 명령은 Dockerfile 의 지침에 따라 "my-custom-nginx"라는 이름의 새 Docker 이미지를 생성합니다.
Docker 이미지 태깅 및 푸시
Docker 이미지를 빌드한 후 특정 버전 또는 레이블로 태그할 수 있습니다. 이렇게 하면 이미지의 다양한 버전을 관리하고 추적할 수 있습니다.
이미지를 태그하려면 docker tag 명령을 사용합니다.
docker tag my-custom-nginx:latest my-custom-nginx:v1.0
이렇게 하면 "my-custom-nginx" 이미지에 "v1.0"이라는 새 태그가 생성됩니다.
다른 사용자와 Docker 이미지를 공유하려면 Docker Hub 또는 개인 레지스트리와 같은 Docker 레지스트리에 푸시할 수 있습니다. 푸시하기 전에 docker login 명령을 사용하여 레지스트리에 인증해야 합니다.
docker login
docker push my-custom-nginx:v1.0
이렇게 하면 "my-custom-nginx:v1.0" 이미지가 Docker 레지스트리에 푸시됩니다.
Docker Hub 사용
Docker Hub 는 Docker 이미지의 공식 공용 레지스트리입니다. Docker Hub 를 사용하여 기존 이미지를 찾고 가져오는 동시에 사용자 정의 이미지를 호스트하고 공유할 수 있습니다.
Docker Hub 에서 이미지를 검색하려면 docker search 명령을 사용할 수 있습니다.
docker search nginx
Docker Hub 에서 이미지를 가져오려면 docker pull 명령을 사용합니다.
docker pull nginx:latest
자신의 Docker 이미지가 있는 경우 Docker Hub 계정을 만들고 레지스트리에 이미지를 푸시하여 다른 사용자가 사용할 수 있도록 할 수 있습니다.
Docker 이미지를 빌드하고 태그하고 공유하는 방법을 이해하면 컨테이너화의 힘을 활용하여 사용자 정의 애플리케이션과 서비스를 만들고 배포할 수 있습니다.
Docker 컨테이너 네트워킹 및 연결
Docker 네트워크 드라이버
Docker 는 컨테이너를 연결하기 위한 여러 네트워크 드라이버를 제공합니다.
- Bridge 네트워크: 호스트 시스템에서 가상 브리지를 생성하고 컨테이너를 연결하는 기본 네트워크 드라이버입니다.
- Host 네트워크: 컨테이너가 호스트 시스템과 동일한 네트워크 스택을 공유합니다.
- Overlay 네트워크: 서로 다른 Docker 호스트에서 실행되는 컨테이너가 통신할 수 있도록 하는 멀티 호스트 네트워크입니다.
- Macvlan 네트워크: 컨테이너에 MAC 주소가 할당되어 네트워크에서 직접 주소 지정이 가능합니다.
- 네트워크 플러그인: Calico, Flannel 또는 Weave 와 같은 타사 네트워크 플러그인을 사용하여 고급 네트워킹 기능을 제공할 수 있습니다.
컨테이너 연결
컨테이너를 연결하는 방법은 다음과 같습니다.
- 컨테이너 연결: 레거시
--link플래그를 사용하여 컨테이너를 이름으로 연결할 수 있습니다. 이를 통해 한 컨테이너가 다른 컨테이너의 환경 변수에 액세스할 수 있습니다. - 사용자 정의 네트워크:
docker network create명령을 사용하여 사용자 정의 네트워크를 생성하고--network플래그를 사용하여 컨테이너를 연결합니다. - 서비스 검색: Docker Swarm 또는 Kubernetes 를 사용할 때 컨테이너는 내장된 서비스 검색 메커니즘을 사용하여 서로를 검색하고 통신할 수 있습니다.
사용자 정의 브리지 네트워크를 생성하고 두 개의 컨테이너를 연결하는 예는 다음과 같습니다.
## 사용자 정의 네트워크 생성
docker network create my-network
## 두 개의 컨테이너를 실행하고 사용자 정의 네트워크에 연결
docker run -d --name web --network my-network nginx:latest
docker run -d --name app --network my-network my-custom-app:latest
이제 "web" 및 "app" 컨테이너는 "my-network" 네트워크 내에서 컨테이너 이름을 사용하여 서로 통신할 수 있습니다.
네트워크 구성
컨테이너의 다양한 네트워크 설정을 구성할 수 있습니다.
- IP 주소:
--ip또는--ip6플래그를 사용하여 컨테이너에 특정 IP 주소를 할당합니다. - DNS 서버:
--dns플래그를 사용하여 컨테이너의 DNS 서버를 설정합니다. - 포트 매핑:
-p또는--publish플래그를 사용하여 호스트 포트를 컨테이너 포트에 매핑합니다.
Docker 의 네트워킹 기능을 이해하면 컨테이너화된 애플리케이션 간에 효과적으로 연결하고 통신하여 더 복잡하고 확장 가능한 배포를 가능하게 할 수 있습니다.
Docker 배포 확장 및 부하 분산
Docker 컨테이너 확장
Docker 는 필요에 따라 컨테이너를 추가하거나 제거하여 애플리케이션을 쉽게 확장할 수 있도록 지원합니다. Docker 컨테이너를 확장하는 방법은 다음과 같습니다.
- 수동 확장:
docker run및docker rm명령을 사용하여 컨테이너를 수동으로 생성하거나 제거할 수 있습니다. - 자동 확장: Docker Swarm, Kubernetes 또는 타사 오케스트레이션 플랫폼과 같은 도구는 미리 정의된 규칙이나 메트릭을 기반으로 컨테이너를 자동으로 확장할 수 있습니다.
- 수평 확장: 여러 호스트에 걸쳐 부하를 분산하여 더 많은 컨테이너 인스턴스를 추가하여 애플리케이션을 확장할 수 있습니다.
- 수직 확장: 각 컨테이너에 할당된 리소스 (CPU, 메모리 등) 를 늘려 애플리케이션을 확장할 수 있습니다.
Docker 컨테이너 부하 분산
여러 Docker 컨테이너에 걸쳐 들어오는 트래픽을 분산하려면 부하 분산 솔루션을 사용할 수 있습니다. 다음은 몇 가지 옵션입니다.
- Docker Swarm 부하 분산: Docker Swarm 에는 여러 컨테이너 인스턴스에 트래픽을 자동으로 분산하는 서비스를 생성할 수 있는 내장 부하 분산 기능이 있습니다.
graph LR
A[Docker Swarm] -- 부하 분산 --> B[컨테이너 1]
A -- 부하 분산 --> C[컨테이너 2]
A -- 부하 분산 --> D[컨테이너 3]
Kubernetes 부하 분산: Kubernetes 는 여러 컨테이너 pod 에 트래픽을 분산할 수 있는 내장
Service객체와 같은 다양한 부하 분산 옵션을 제공합니다.타사 부하 분산기: Nginx, HAProxy 또는 클라우드 기반 부하 분산기 (예: AWS Elastic Load Balancing, Azure Load Balancer) 와 같은 외부 부하 분산기를 사용하여 Docker 컨테이너에 걸쳐 트래픽을 분산할 수 있습니다.
graph LR
A[부하 분산기] -- 부하 분산 --> B[컨테이너 1]
A -- 부하 분산 --> C[컨테이너 2]
A -- 부하 분산 --> D[컨테이너 3]
Docker 배포를 확장하고 부하를 분산하는 방법을 이해하면 애플리케이션이 증가하는 트래픽을 처리하고 높은 가용성을 유지할 수 있도록 할 수 있습니다.
Docker 환경 모니터링 및 문제 해결
Docker 컨테이너 모니터링
Docker 환경을 모니터링하는 것은 애플리케이션의 상태와 성능을 보장하는 데 필수적입니다. Docker 컨테이너를 모니터링하는 도구 및 기술은 다음과 같습니다.
- Docker CLI 명령:
docker ps,docker logs,docker stats와 같은 다양한 Docker CLI 명령을 사용하여 컨테이너를 모니터링할 수 있습니다. - Docker 메트릭: Docker 는 CPU, 메모리 및 네트워크 사용량과 같은 내장 메트릭을 제공하며, Docker API 또는 타사 모니터링 도구를 사용하여 액세스할 수 있습니다.
- 타사 모니터링 도구: Prometheus, Grafana, LabEx 모니터링과 같은 도구는 Docker 와 통합되어 Docker 환경의 포괄적인 모니터링 및 시각화를 제공할 수 있습니다.
graph LR
A[Docker 컨테이너] -- 메트릭 --> B[모니터링 도구]
B -- 시각화 --> C[대시보드]
Docker 컨테이너 문제 해결
Docker 환경에서 문제가 발생하면 다음 기술을 사용하여 문제를 해결하고 해결할 수 있습니다.
- 컨테이너 로그:
docker logs명령을 사용하여 컨테이너 로그를 검사하여 오류 또는 문제를 식별합니다. - 컨테이너 검사:
docker inspect명령을 사용하여 컨테이너의 구성, 네트워크 설정 및 리소스 사용량과 같은 자세한 정보를 얻습니다. - 컨테이너 네트워킹: Docker 네트워크 구성을 검사하고, 컨테이너 IP 주소를 확인하며, 네트워크 연결을 확인하여 네트워크 관련 문제를 해결합니다.
- 리소스 사용량:
docker stats명령 또는 타사 모니터링 도구를 사용하여 컨테이너의 리소스 사용량을 모니터링하여 리소스 관련 문제를 식별합니다. - 컨테이너 재시작: 컨테이너가 예상대로 작동하지 않으면
docker restart명령을 사용하여 재시작해 봅니다.
graph LR
A[Docker 컨테이너] -- 문제 해결 --> B[로그]
A -- 문제 해결 --> C[검사]
A -- 문제 해결 --> D[네트워킹]
A -- 문제 해결 --> E[리소스 사용량]
A -- 문제 해결 --> F[재시작]
Docker 에서 제공하는 모니터링 및 문제 해결 도구 및 기술을 활용하여 Docker 기반 애플리케이션을 효과적으로 관리하고 유지하여 안정성과 성능을 보장할 수 있습니다.
요약
이 "Docker 컨테이너 서버 빠르게 설정하기" 튜토리얼에서는 Docker 설치, Docker 컨테이너 생성 및 관리, Docker 이미지 빌드 및 공유, Docker 배포 확장 및 모니터링 방법을 배웠습니다. 이러한 기술을 통해 이제 최상의 Docker 컨테이너 서버를 빠르게 설정하고 Docker 의 기능을 활용하여 애플리케이션 개발 및 배포 프로세스를 간소화할 수 있습니다.



