7 분 소요

Docker란 무엇인가?

개발하다 보면 밤을 새워야 하는 일이 많고 커피를 많이 마신다. 물론 커피를 가리지는 않지만 잠깐 상상을 해야 할 시간이다. 예를 들어 내가 자주 가는 카페에서 항상 똑같은 맛의 커피를 빠르게 제공받는다고 생각해 보면. 이 커피는 어느 지점에서나 같은 맛을 유지한다. Docker는 개발 세계의 ‘똑같은 커피’와 같다. 개발자가 어디서든 동일한 환경에서 앱을 실행할 수 있게 해주는 도구이다.

Docker의 장점

  • 일관성: Docker를 사용하면, 개발 환경이 항상 동일하므로 "내 컴퓨터에서는 잘 돌아가는데…"라는 문제가 사라진다.
  • 가볍고 빠름: 전통적인 가상화 방식보다 더 가볍고 빠르게 동작한다.
  • 유연성: 필요한 프로그램과 라이브러리만 담아서 ‘컨테이너’로 만들면, 그 안에서 앱이 실행된다.

Docker의 단점

  • 복잡성: 초보자에게는 처음 배울 때 조금 복잡할 수 있다.
  • 보안: 일부 보안 문제가 제기되기도 했으므로, 사용 전에 항상 보안에 주의해야 한다.

그렇다면 왜 사용해야 하는가?

카페 예제로 돌아가서 우리가 여러 지점을 돌면서 항상 똑같은 맛의 커피를 원한다면, 그 카페 체인이 특별한 레시피와 기술을 사용하는 것처럼, 개발자들도 Docker를 사용해 어디서든 똑같은 환경에서 코드를 실행하고 싶어한다.

결론적으로, Docker는 개발 환경을 표준화하고, 앱 배포를 간편하게 해주는 도구이다. 하지만 사용하기 전에 학습과 보안 문제에 주의해야 한다.

  1. Docker 설치 : Docker 공식 웹사이트에서 해당 운영 체제에 맞는 Docker를 다운로드하고 설치한다.
  2. Docker 이미지 받아오기
    • Docker는 ‘이미지’라는 것을 사용하여 앱을 실행한다.
    • 예: docker pull ubuntu 명령어는 Ubuntu OS 이미지를 받아옵니다.
  3. 컨테이너 실행
    • 받아온 이미지를 기반으로 ‘컨테이너’를 실행한다.
    • 예: docker run -it ubuntu /bin/bash 명령어는 Ubuntu 컨테이너를 실행하면서 bash 쉘에 접근한다.
  4. Dockerfile 사용
    • Dockerfile은 앱과 필요한 환경을 설정하기 위한 설명서와 같다.
    • Dockerfile을 작성한 후 docker build 명령어로 이미지를 생성한다.
  5. Docker Compose 사용
    • 여러 컨테이너를 함께 실행할 때 유용하다.
    • docker-compose.yml 파일을 작성하고 docker-compose up 명령어로 서비스를 시작한다.
  6. 컨테이너 관리
    • docker ps: 현재 실행 중인 컨테이너를 확인한다.
    • docker stop [컨테이너 이름 or ID]: 컨테이너를 멈춥니다.
  7. 이미지 관리
    • docker images: 현재 저장된 이미지를 확인한다.
    • docker rmi [이미지 이름 or ID]: 이미지를 삭제한다.

이는 Docker의 기본 사용법에 대한 간략한 개요이다. 실제로 Docker를 사용할 때에는 이보다 더 많은 기능과 옵션을 활용하게 될 것이다. 하지만 이 기본적인 사용법만으로도 여러분의 앱을 Docker 환경에서 실행하고 관리하는 데 큰 도움이 될 것이다.

이미지 관련 명령어

docker images: 로컬에 저장된 모든 이미지를 나열한다.
docker pull [이미지 이름]: Docker Hub에서 이미지를 다운로드한다.
docker rmi [이미지 이름 or ID]: 이미지를 삭제한다.
docker build -t [이미지 이름] [Dockerfile 위치]: Dockerfile을 바탕으로 이미지를 빌드한다.

컨테이너 관련 명령어

docker ps: 현재 실행 중인 컨테이너를 나열한다.
docker ps -a: 모든 컨테이너(실행 중이거나 정지된 상태 포함)를 나열한다.
docker run [옵션] [이미지 이름]: 이미지를 바탕으로 컨테이너를 실행한다. (-it, -d, -p 등 다양한 옵션 사용 가능)
docker start [컨테이너 이름 or ID]: 컨테이너를 시작한다.
docker stop [컨테이너 이름 or ID]: 컨테이너를 멈춘다.
docker restart [컨테이너 이름 or ID]: 컨테이너를 재시작한다.
docker rm [컨테이너 이름 or ID]: 컨테이너를 삭제한다.
docker logs [컨테이너 이름 or ID]: 컨테이너의 로그를 확인한다.

기타 유용한 명령어

docker exec -it [컨테이너 이름 or ID] [명령어]: 실행 중인 컨테이너에서 명령어를 실행한다. (예: bash 쉘 접근)
docker network ls: Docker의 네트워크를 나열한다.
docker volume ls: Docker의 볼륨을 나열한다.

이러한 명령어들은 Docker를 사용하면서 기본적으로 자주 사용하는 명령어들이다. 실제로 작업을 진행하면서 필요에 따라 다양한 옵션과 함께 이 명령어들을 조합하여 사용하게 될 것이다.

누가 Docker를 사용하면 좋을까?

개발자: 개발 환경을 표준화하고, “내 컴퓨터에서는 잘 돌아갔는데”라는 문제를 방지하려는 개발자에게 유용하다. 테스트 엔지니어: 다양한 환경에서의 테스트를 쉽게 재현하려는 테스터나 QA 엔지니어에게 유용하다. 시스템 관리자: 애플리케이션 배포 및 관리를 간소화하려는 시스템 관리자나 DevOps 전문가에게 좋다.

어느 OS에서 Docker를 사용하는 것이 좋을까?

리눅스: Docker는 원래 리눅스에서 시작되었기 때문에 리눅스에서 동작하는 것이 가장 자연스럽다. 대부분의 Docker 이미지도 리눅스 기반이다.

macOS 및 Windows: Docker Desktop을 통해 macOS 및 Windows에서도 Docker를 쉽게 설치하고 사용할 수 있다. 내부적으로는 가상화 기술을 사용하여 리눅스 커널을 실행하지만, 사용자는 그것을 몰라도 된다. 하지만, 리소스 사용량이 높을 수 있으므로 높은 사양의 컴퓨터에서 사용하는 것이 좋다.

결론적으로, Docker의 사용 적합성은 “누가 사용하느냐”, “어디에서 사용하느냐”보다는 “어떤 문제를 해결하려고 하는가”에 따라 결정된다. 개인의 요구 사항과 환경에 맞게 Docker를 활용하는 것이 중요하다.

도커의 기술 적인 부분

  1. 컨테이너화: Docker는 ‘컨테이너’라는 개념을 사용하여 애플리케이션을 패키징한다. 컨테이너는 애플리케이션과 그 애플리케이션을 실행하는 데 필요한 모든 것 (라이브러리, 설정, 파일 시스템 등)을 포함한다.

  2. 이미지: Docker 이미지는 애플리케이션과 그 종속성을 함께 묶은 것이다. 이미지는 불변(immutable)하므로 한 번 생성하면 변경되지 않는다. 이러한 특성 때문에 다양한 환경에서도 동일하게 동작하는 것을 보장할 수 있다.

  3. Docker Daemon: Docker Daemon은 백그라운드에서 실행되며, Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리한다.

  4. Docker Client: 사용자는 Docker Client를 통해 Docker Daemon과 통신한다. docker 명령어를 사용할 때 이 클라이언트가 동작하는 것이다.

  5. Docker Hub: Docker Hub는 Docker 이미지의 클라우드 기반 저장소이다. 개발자는 여기에 자신의 이미지를 푸시하고, 다른 사람이 공유된 이미지를 가져올 수 있다.

  6. 컨테이너 vs VM (가상 머신): 가상 머신은 각각의 전체 운영 체제와 가상 하드웨어를 가지고 있어 자원 소모가 큽니다. 반면, Docker 컨테이너는 호스트 OS의 커널을 공유하면서 독립적으로 실행되기 때문에 훨씬 가볍고 빠릅니다.

  7. 레이어화된 파일 시스템: Docker는 이미지를 여러 레이어로 나눠 저장한다. 각 레이어는 이전 레이어의 변경 사항만을 저장한다. 이런 방식은 이미지의 재사용과 공유를 최적화한다.

  8. 네트워킹: Docker는 컨테이너 간의 네트워크 연결을 관리한다. 브릿지, 호스트, 오버레이 등 다양한 네트워크 모드를 제공하여 컨테이너의 통신 방식을 설정할 수 있다.

  9. 데이터 저장: Docker는 ‘볼륨’이라는 기능을 제공하여 컨테이너 외부에 데이터를 지속적으로 저장할 수 있게 한다.

이러한 기술적인 특성들 덕분에 Docker는 개발, 테스트, 배포 등 다양한 환경에서 애플리케이션의 일관성을 유지하면서도 빠르고 효율적으로 동작할 수 있다.

Docker는 가상?

Docker는 “가상화” 기술을 사용하여 독립적인 “컨테이너”를 생성하고 실행하는 플랫폼이다. 그렇기 때문에 Docker 컨테이너는 일종의 “가상환경”이라고 볼 수 있다. 그러나 Docker의 가상화 방식은 전통적인 가상 머신(VM)과는 다르게 작동한다.

전통적인 VM은 각 VM마다 전체 운영 체제를 가지고 있어야 한다. 반면, Docker 컨테이너는 호스트 OS의 커널을 공유하면서 독립적으로 실행된다. 이렇게 컨테이너는 호스트 OS와 매우 밀접한 관계를 가지지만, 컨테이너 내의 애플리케이션과 설정은 독립적으로 유지된다.

  • Docker 컨테이너는 “가상환경”이라고 할 수 있다. 왜냐하면 각 컨테이너는 독립된 실행 환경을 제공하기 때문이다.
  • 그러나 Docker는 전통적인 VM과 같은 “전체 OS 가상화”를 제공하지 않는다. 대신, “커널 수준에서의 경량화된 가상화”를 제공한다.
  • Docker를 실행하는 실제 기기나 서버는 “로컬 환경” 또는 “호스트 환경”이라고 한다.

요약하자면, Docker는 애플리케이션을 실행하기 위한 “가상환경”을 제공하는 도구이다.

공격은?

Docker 컨테이너는 호스트 OS의 커널을 공유하기 때문에 기본적으로 컨테이너와 호스트 사이에는 격리가 있다. 이 격리 덕분에 컨테이너 내에서 실행되는 프로세스는 일반적으로 호스트 시스템에 직접적인 영향을 미치지 못한다. 그러나 이것이 절대적인 보안을 의미하는 것은 아니다.

다음은 Docker에서 주의해야 할 몇 가지 보안 관련 사항이다

특권 컨테이너: Docker 컨테이너를 –privileged 플래그와 함께 실행하면 컨테이너가 호스트 시스템의 많은 리소스에 대한 접근 권한을 얻게 된다. 이렇게 실행된 컨테이너는 잠재적으로 호스트 시스템을 위험에 빠뜨릴 수 있다.

컨테이너 탈출: 과거에는 Docker의 몇몇 버전에서 컨테이너 탈출 취약점이 발견되었다. 이러한 취약점을 이용하면 악성코드가 컨테이너에서 호스트 시스템으로 탈출할 수 있다. 이런 이유로 항상 Docker의 최신 버전을 사용하는 것이 중요하다.

이미지의 출처: Docker Hub나 다른 저장소에서 임의의 이미지를 다운로드 받을 때는 해당 이미지의 출처와 안전성을 검증해야 한다. 악성코드가 포함된 이미지를 사용하면 시스템이 위험에 노출될 수 있다.

컨테이너 데몬 권한: Docker 데몬은 기본적으로 root 권한으로 실행된다. 따라서 Docker API나 소켓에 대한 접근을 조심스럽게 관리해야 한다.

네트워킹: Docker 컨테이너의 네트워킹 설정에 따라, 컨테이너가 네트워크 상에서 다른 시스템에 영향을 줄 수 있다.

결론적으로, Docker 컨테이너는 기본적인 격리 기능을 제공하지만, 절대적인 보안을 보장하지는 않는다. 따라서 Docker를 사용할 때는 위의 사항들을 고려하여 보안 관련 베스트 프랙티스를 따르는 것이 중요하다.

도커는 어디 까지?

  1. 서버처럼 계속 켜두기: Docker 컨테이너를 실행할 때 -d (또는 –detach) 옵션을 사용하면, 컨테이너를 백그라운드에서 실행하게 되어 서버처럼 지속적으로 작동하게 할 수 있다.

  2. 외부 접속 허용: Docker 컨테이너는 기본적으로 격리된 네트워크 환경에서 실행된다. 그러나 -p (또는 –publish) 옵션을 사용하여 호스트의 특정 포트와 컨테이너의 포트를 연결(매핑)함으로써 외부에서 해당 포트를 통해 컨테이너에 접속할 수 있게 만들 수 있다.

예를 들어, 컨테이너 내부의 웹 서버가 80번 포트에서 실행되고 있다면, 다음과 같은 명령어를 사용하여 호스트의 8080번 포트와 연결할 수 있다.

docker run -d -p 8080:80 웹서버_이미지_이름

위의 설정으로 호스트의 8080번 포트로 들어오는 모든 트래픽은 컨테이너의 80번 포트로 전달된다.

  1. 공유: Docker의 또 다른 강력한 기능은 이미지를 Docker Hub나 다른 이미지 저장소에 푸시하여 다른 사람들과 공유할 수 있다는 것이다. 이를 통해 다른 사람들이나 시스템에서 동일한 환경의 컨테이너를 쉽게 실행할 수 있다.

요약하면, Docker를 서버처럼 지속적으로 실행하고 외부 접속을 허용하는 것은 간단한 설정을 통해 가능하며, 이미지를 공유하는 기능 덕분에 다른 사람들과 쉽게 환경을 공유할 수 있다.

가격은 얼마지?

Docker 자체의 사용에는 무료 옵션이 있다. 그러나 특정 상황에서 비용이 발생할 수 있다. 아래는 Docker 사용과 관련된 주요 비용 요소이다.

Docker CE (Community Edition):

개인이나 소규모 기업에서 사용하기 위해 설계된 버전이다.
Linux, Windows 및 macOS에서 사용할 수 있다.
비용: 무료

Docker Hub

Docker 이미지를 저장하고 공유하는 클라우드 기반 저장소이다. 무료 계정(Free Tier)으로 제한된 수의 private 저장소와 무제한 public 저장소를 제공한다. Pro와 Team 플랜과 같은 유료 옵션들이 있어 더 많은 private 저장소나 추가 기능을 이용할 수 있다. 비용: 무료 계정은 무료이며, Pro 및 Team 플랜의 비용은 Docker Hub 공식 웹사이트에서 확인할 수 있다.

Docker EE (Enterprise Edition)

큰 규모의 기업이나 복잡한 요구 사항을 갖는 조직을 위한 버전이다. 추가적인 보안, 관리 및 확장성 기능을 제공한다. 비용: 라이선스 모델에 따라 다르며, Docker의 공식 웹사이트에서 확인할 수 있다.

호스팅 및 인프라 비용

Docker 컨테이너를 클라우드 서비스(예: AWS, Google Cloud, Azure 등)에서 실행하려는 경우 해당 클라우드 서비스의 비용이 발생한다. 직접 서버를 구축 및 유지 관리하는 경우에도 관련 비용이 발생할 수 있다.

CTFd와 같은 서비스를 Docker에서 구축하려는 경우 Docker CE와 Docker Hub의 무료 계정만으로 충분할 수 있다. 그러나 클라우드에서 호스팅하려는 경우 클라우드 서비스 제공업체의 비용을 고려해야 한다.

맨 위로 올라가기

저의 글을 읽어 주셔서 감사합니다. 문제가 있으면 저의 메일로 연락 주시면 감사하겠습니다. 댓글과 피드백 또한 감사합니다.
Thank you for visiting my blog. If you have any problems, please contact me by e-mail. Thanks also for the comments and feedback.

태그: , , ,

카테고리:

업데이트:

댓글남기기