우분투(Ubuntu) Docker 퍼펙트 가이드
목차
- Ubuntu와 Docker에 대한 개요
- Docker 설치 전 확인해야 할 사항
- Docker 설치 방법
- Docker 사용 예시
- Docker 관련 명령어
- Docker의 장단점
- Docker와 관련된 주요 개념 설명
- Docker를 활용한 개발 및 배포 방법
- Docker 관련 유용한 자료 및 참고 링크
Ubuntu와 Docker에 대한 개요
Ubuntu는 개발자와 서버 관리자를 위한 무료 운영 체제(OS) 중 하나로, Debian을 기반으로 한다. Ubuntu의 LTS(Long Term Support)는 안정적인 버전으로, 데스크톱 및 서버에서 사용할 수 있다.
Docker는 컨테이너 기반의 가상화 플랫폼으로, 애플리케이션을 독립적인 환경에서 실행할 수 있도록 해준다. 이를 통해 애플리케이션 개발 및 배포를 더욱 효율적으로 처리할 수 있으며, 시스템 자원의 사용을 최적화할 수 있다. Docker는 오픈소스로 누구나 사용 가능하며, 다양한 운영 체제에서 동작한다.
Docker 설치 전 확인해야 할 사항
시스템 요구사항
- Ubuntu 18.04 LTS 이상
- 64비트 아키텍처
- CPU 가상화 지원
기존 Docker 설치 여부 확인
$ docker --version
Docker가 설치되어 있지 않은 경우에는 해당 명령어를 실행해도 출력이 나오지 않습니다.
Docker 설치 방법
이 문서에서 사용된 설치 방법은 다음 우분투 버전에서 정상적으로 사용 할 수 있습니다.
- Ubuntu 18.04 LTS
- Ubuntu 20.04 LTS
- Ubuntu 22.04 LTS
- Ubuntu 23.04
Docker 설치를 위한 사전 작업
$ sudo apt update -y
$ sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
Ubuntu의 패키지 인덱스를 업데이트하고, HTTPS 연결을 통해 패키지를 다운로드할 수 있도록 패키지 관련 도구를 설치합니다.
Docker 설치 스크립트 실행
$ 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"
$ sudo apt update -y
$ sudo apt install -y docker-ce docker-ce-cli containerd.io
$ docker version</code>
</pre>
<p>Docker 공식 GPG 키를 추가하고 Docker의 stable 버전을 사용할 수 있도록 리포지토리를 추가합니다. 그리고 다시 패키지 인덱스를 업데이트하고 Docker Engine을 설치합니다.</p>
<p> </p>
<h3>Docker Compose 설치</h3>
<pre><code lang="bash">$ sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
Docker Compose를 다운로드합니다. 그리고 설치가 제대로 되었는지 확인합니다.
Docker 사용 예시
Docker는 애플리케이션을 컨테이너 단위로 실행하여 개발, 테스트, 배포 등 다양한 용도로 활용할 수 있습니다. 이번에는 Docker를 사용하는 몇 가지 예시를 살펴보겠습니다.
이미지 다운로드 및 실행
Docker 이미지는 컨테이너를 실행하기 위한 파일 시스템과 애플리케이션 설정 정보를 담고 있습니다. Docker Hub에서 제공하는 공식 이미지를 다운로드하여 실행해 볼 수 있습니다. 예를 들어, Redis 데이터베이스를 Docker 이미지로 실행하는 경우 다음과 같은 명령어를 사용합니다.
$ docker run --name my-redis -d redis
위 명령어를 실행하면 Redis 컨테이너가 실행되며, 이름이 my-redis
로 지정되고 백그라운드에서 실행됩니다.
컨테이너 생성 및 실행
Docker는 사용자 정의 컨테이너를 생성하고 실행할 수 있습니다. 예를 들어, Ubuntu 20.04를 기반으로 하는 컨테이너를 생성하여 실행하는 경우 다음과 같은 명령어를 사용합니다.
$ docker run -it ubuntu:20.04 /bin/bash
위 명령어를 실행하면 Ubuntu 20.04 컨테이너가 실행되며, 인터랙티브 모드로 실행되어 Bash 쉘을 사용할 수 있습니다.
컨테이너 삭제 및 정지
Docker 컨테이너를 삭제하려면 docker rm
명령어를 사용합니다. 예를 들어, 이름이 my-redis
인 Redis 컨테이너를 삭제하는 경우 다음과 같은 명령어를 사용합니다.
$ docker rm my-redis
Docker 컨테이너를 정지하려면 docker stop
명령어를 사용합니다. 예를 들어, 이름이 my-redis
인 Redis 컨테이너를 정지하는 경우 다음과 같은 명령어를 사용합니다.
$ docker stop my-redis
위와 같은 예시를 통해 Docker를 사용하여 애플리케이션을 실행하고 관리하는 방법을 익힐 수 있습니다.
Docker 관련 명령어
도커 이미지 관련 명령어
docker images
: 로컬에 저장된 모든 도커 이미지를 확인합니다.docker pull [이미지명]
: 도커 이미지를 다운로드합니다.docker rmi [이미지명]
: 로컬에 저장된 도커 이미지를 삭제합니다.
도커 컨테이너 관련 명령어
docker ps
: 현재 실행 중인 컨테이너 목록을 확인합니다.docker run [이미지명]
: 새로운 컨테이너를 생성하고 실행합니다.docker start [컨테이너명]
: 정지된 컨테이너를 시작합니다.docker stop [컨테이너명]
: 실행 중인 컨테이너를 정지합니다.docker rm [컨테이너명]
: 컨테이너를 삭제합니다.
도커 네트워크 관련 명령어
docker network ls
: 도커 네트워크 목록을 확인합니다.docker network create [네트워크명]
: 새로운 네트워크를 생성합니다.
도커 볼륨 관련 명령어
docker volume ls
: 도커 볼륨 목록을 확인합니다.docker volume create [볼륨명]
: 새로운 볼륨을 생성합니다.
기타 명령어
docker exec [컨테이너명] [명령어]
: 실행 중인 컨테이너에서 명령어를 실행합니다.docker commit [컨테이너명] [이미지명]
: 컨테이너에서 변경된 내용을 새로운 이미지로 저장합니다.docker login
: 도커 레지스트리에 로그인합니다.docker push [이미지명]
: 로컬에서 생성한 도커 이미지를 도커 레지스트리에 업로드합니다.
Docker의 장단점
장점
- 가볍고 빠르다: 컨테이너는 가상화 기술 중에서도 가장 가볍고 빠릅니다. 가상 머신처럼 하드웨어 자원을 완전히 가상화하지 않기 때문에, 호스트 운영체제와 거의 동일한 속도로 작동합니다.
- 환경 일관성: Docker를 사용하면 모든 서버, 개발자 컴퓨터, 빌드 환경 등에서 동일한 개발/실행 환경을 구축할 수 있습니다. 이것은 응용 프로그램을 테스트하고 배포하는 데 매우 유용합니다.
- 쉬운 이식성: Docker 컨테이너는 호스트 운영체제와 관계없이 실행될 수 있기 때문에, 어디에서든 쉽게 이식할 수 있습니다.
- 확장성: Docker는 여러 컨테이너를 클러스터로 묶어서 응용 프로그램을 확장하는 것이 매우 쉽습니다.
- 높은 보안성: Docker는 격리 기술을 사용하기 때문에, 컨테이너를 통해 응용 프로그램을 실행할 때 호스트 운영체제나 다른 컨테이너에 영향을 끼치지 않습니다.
단점
- 복잡한 구성: Docker는 가상화를 이용하는 기술이기 때문에, 설치 및 구성이 상대적으로 복잡합니다.
- 커널 호환성: 호스트 운영체제와 컨테이너 운영체제의 커널 호환성 문제가 발생할 수 있습니다. 이 경우, 컨테이너 운영체제를 업그레이드하거나 호스트 운영체제를 변경해야 합니다.
- 자원 제한: Docker는 컨테이너를 격리시키기 위해 리소스를 제한하는데, 이로 인해 응용 프로그램이 특정 리소스에 대해 충분한 권한을 가지지 못하는 문제가 발생할 수 있습니다.
- 가상화 오버헤드: Docker 컨테이너는 호스트 운영체제와 일부 자원을 공유하므로 가상화 오버헤드가 발생할 수 있습니다. 이것은 어떤 환경에서는 무시할 수 있지만, 고성능 환경에서는 문제가 될수 있습니다.
- 보안 이슈: Docker는 여러 컨테이너를 호스트에서 실행하기 때문에, 각 컨테이너의 보안을 철저히 관리하지 않으면 보안 이슈가 발생할 수 있습니다. 예를 들어, 컨테이너 내부에서 발생하는 네트워크 트래픽이 호스트 운영체제와 공유되는 경우, 이를 악용할 수 있는 공격이 가능합니다.
- 파일 시스템 문제: Docker 컨테이너는 호스트 운영체제의 파일 시스템을 공유하지만, 파일 시스템의 호환성 문제가 발생할 수 있습니다. 예를 들어, Windows 호스트에서 Linux 컨테이너를 실행할 경우, 파일 시스템 호환성 문제가 발생할 수 있습니다.
- 라이선스 문제: Docker 컨테이너 내에서 사용하는 소프트웨어에 대한 라이선스 문제가 발생할 수 있습니다. 예를 들어, GPL 라이선스를 가진 소프트웨어를 컨테이너 내에서 실행하면, GPL 라이선스에 따라 소스코드를 공개해야 하는 경우가 발생할 수 있습니다.
- 데이터 지속성: Docker 컨테이너는 일반적으로 임시적인 자원으로 사용되기 때문에, 컨테이너가 삭제되면 데이터도 함께 삭제될 수 있습니다. 이 문제를 해결하기 위해서는 데이터를 별도의 볼륨에 저장하거나, 데이터베이스 등을 사용해야 합니다.
Docker와 관련된 주요 개념 설명
Docker는 컨테이너 기반 가상화 기술을 이용하여 애플리케이션을 배포 및 실행하는 플랫폼입니다. 이를 이해하기 위해 다음과 같은 주요 개념들에 대해 설명해보겠습니다.
- 이미지 (Image)
- 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 불변의 패키지입니다.
- 도커 이미지는 레지스트리에 저장되어 다른 사용자들이 공유 및 사용할 수 있습니다.
- 컨테이너 (Container)
- 이미지를 실행한 상태로, 독립적인 공간에서 애플리케이션을 실행하는 경량화된 가상환경입니다.
- 도커 컨테이너는 이미지를 기반으로 생성되며, 컨테이너의 상태가 변경되어도 이미지는 변경되지 않습니다.
- 레지스트리 (Registry)
- 도커 이미지가 저장되는 저장소입니다.
- 도커 허브(Docker Hub)와 같은 공개 레지스트리와, 도커 엔터프라이즈(Docker Enterprise)와 같은 사설 레지스트리가 있습니다.
- 도커 컴포즈 (Docker Compose)
- 여러 개의 도커 컨테이너를 정의하고 실행하는 도구입니다.
- YAML 파일로 정의되며, 여러 컨테이너 간의 의존성 관계를 설정할 수 있습니다.
- 네트워크 (Network)
- 도커 컨테이너 간의 통신을 위한 가상 네트워크입니다.
- 네트워크를 생성하고, 컨테이너를 연결하는 방식으로 사용됩니다.
- 볼륨 (Volume)
- 도커 컨테이너가 사용하는 파일 시스템이나 데이터를 저장하는 공간입니다.
- 호스트와 컨테이너 간에 파일을 공유하는 방식으로 사용됩니다.
위와 같은 개념들을 이해하면, Docker의 기본적인 동작 방식을 이해하고, 효율적인 배포 및 관리가 가능합니다.
Docker를 활용한 개발 및 배포 방법
Docker는 애플리케이션 개발 및 배포에서 매우 유용한 도구입니다. 이 섹션에서는 Docker를 활용하여 애플리케이션을 개발하고 배포하는 방법에 대해 살펴보겠습니다.
Docker를 이용한 애플리케이션 개발 방법
Docker를 이용한 애플리케이션 개발 방법은 다음과 같습니다.
Docker 이미지 생성: 먼저 애플리케이션 개발에 필요한 환경을 구성한 후, Docker 이미지를 생성합니다. Docker 이미지는 애플리케이션 개발에 필요한 모든 구성 요소를 포함합니다.
Docker 컨테이너 실행: Docker 이미지를 사용하여 Docker 컨테이너를 실행합니다. 컨테이너는 이미지를 기반으로 생성되며, 애플리케이션을 실행하는 데 필요한 모든 구성 요소를 포함합니다.
애플리케이션 개발: Docker 컨테이너 내에서 애플리케이션을 개발합니다. 이때 필요한 모든 도구와 라이브러리는 이미지와 컨테이너에 이미 포함되어 있으므로 개발자는 추가적인 설치나 구성 없이 즉시 개발을 시작할 수 있습니다.
Docker를 이용한 애플리케이션 배포 방법
Docker를 이용한 애플리케이션 배포 방법은 다음과 같습니다.
Docker 이미지 빌드: 먼저 애플리케이션을 배포할 Docker 이미지를 빌드합니다. 이때 개발자는 애플리케이션을 실행하는 데 필요한 모든 구성 요소를 이미지에 포함해야 합니다.
Docker 이미지 레지스트리 업로드: Docker 이미지를 빌드한 후, 레지스트리에 업로드합니다. 레지스트리는 Docker 이미지를 저장하고 배포하는 데 사용되는 중앙 집중식 저장소입니다.
Docker 컨테이너 실행: Docker 이미지를 사용하여 Docker 컨테이너를 실행합니다. 컨테이너는 이미지를 기반으로 생성되며, 애플리케이션을 실행하는 데 필요한 모든 구성 요소를 포함합니다.
로드 밸런서 구성: 로드 밸런서를 구성하여 여러 개의 Docker 컨테이너에 트래픽을 분산합니다. 로드 밸런서는 애플리케이션의 가용성과 확장성을 높여줍니다.
스케일링: 필요에 따라 Docker 컨테이너를 추가로 실행하여 애플리케이션의 성능을 향상시킵니다. 이때 로드 밸런서가 추가된 컨테이너에 트래픽을 분산합니다.
모니터링 및 로깅: 애플리케이션을 실행하는 Docker 컨테이너들의 상태를 모니터링하고 로그를 수집합니다. 이를 통해 애플리케이션의 성능 및 안정성을 모니터링하고 문제를 해결할 수 있습니다.
이상으로 Docker를 활용한 개발 및 배포 방법에 대해 살펴보았습니다. 이외에도 다양한 Docker 기능과 도구를 활용하여 애플리케이션 개발 및 운영에 대한 생산성을 높일 수 있습니다.
업데이트: 애플리케이션의 업데이트가 필요한 경우, 새로운 Docker 이미지를 빌드하고 이를 이전 버전의 이미지와 교체합니다. 이때 로드 밸런서는 이전 버전의 컨테이너에서 새로운 버전의 컨테이너로 트래픽을 전환합니다.
이상으로 Docker를 활용한 개발 및 배포 방법에 대해 살펴보았습니다. 이외에도 다양한 Docker 기능과 도구를 활용하여 애플리케이션 개발 및 운영에 대한 생산성을 높일 수 있습니다.
Docker 관련 유용한 자료 및 참고 링크
Docker를 공부하고 활용하는 데 도움이 되는 다양한 자료와 참고 링크를 소개합니다.
공식 문서: Docker의 공식 문서는 매우 자세하고 정확한 정보를 제공합니다.
https://docs.docker.com/Docker Hub: Docker Hub는 Docker 이미지를 저장하고 공유하는 공식 레지스트리입니다. Docker Hub에서는 다양한 오픈 소스 프로젝트와 공식 이미지를 찾아볼 수 있습니다.
https://hub.docker.com/Docker 커뮤니티: Docker 커뮤니티는 개발자와 사용자들이 모여 다양한 정보를 공유하고 서로 도움을 주고받는 곳입니다. Docker Forum과 Docker Community Slack 채널이 유용합니다. https://forums.docker.com/
https://community.docker.com/Docker를 활용한 실전 예제: Docker를 활용한 실제 예제를 참고하여 Docker의 기본 개념과 사용 방법을 익힐 수 있습니다.
https://github.com/docker/labsDockerfile 레파지토리: Dockerfile은 Docker 이미지를 빌드하기 위한 설정 파일입니다. Dockerfile을 공유하는 레파지토리들을 살펴보면 다양한 이미지를 빠르게 만들 수 있습니다.
https://github.com/docker-library/Docker Compose 사용 방법: Docker Compose를 사용하면 멀티 컨테이너 애플리케이션을 관리할 수 있습니다. 공식 문서에서 예제를 참고하여 사용 방법을 익힐 수 있습니다. https://docs.docker.com/compose/gettingstarted/
Docker 기술 블로그: Docker 기술 블로그에서는 Docker와 관련된 다양한 기술적인 이슈와 해결 방법, 새로운 기능 소개 등을 다루고 있습니다.
https://www.docker.com/blog/Docker 웹캐스트: Docker 웹캐스트는 Docker를 활용한 실전 예제와 도커 엔터프라이즈 제품의 소개 등을 다루고 있습니다.
https://www.docker.com/dockercon/webcastDocker Hands-on Labs: Docker Hands-on Labs에서는 Docker 기술을 실제로 적용해보면서 학습할 수 있는 환경을 제공합니다.
https://training.play-with-docker.com/
안정적이고 저렴한 가상 서버(VPS) 안내
안정적인 서버 호스팅을 찾고 계신가요? 지금 Vultr 호스팅을 한번 이용 해 보세요. 지금 보고 계신 HaruLogs 사이트도 Vultr에서 VPS 호스팅 하고 있습니다. 한국, 일본, 미국등 다양한 국가에 클릭 몇번으로 안정적이고 저렴한 VPS를 운영 할 수 있습니다.
아래 배너를 통해 회원 가입을 하시면 100달러의 무료 크레딧을 받을 수 있습니다. 100달러의 무료 크레딧은 Vultr의 최소 사양 VPS를 20대 동시 운영가능한 크레딧입니다.
Vultr 서비스 요약
- VPS
- 인스턴스
- AMD 또는 Intel High Performance 인스턴스 최저 $6 - 1vCPU, 1GB Memory, 2TB Bandwidth, 25GB NVMe
- 엣지
- 인스턴스
- Block Storage
- Object Storage (AWS S3 호환)
- Firewall
- Network
- Load Balancers
- Kubernetes
- Databases