
if(kakao)2022 이게 돼요? 도커 없이 컨테이너 만들기를 정리해봅니다. 저는 ubuntu server 22.04 환경에서 실습을 진행했습니다. 컨테이너 왜 쓸까? 다양한 서버 환경. 서버의 사양, OS 종류, 설치 환경 운영 비용 증가. 애플리케이션이 동작하는 환경 별로 대응이 어려움 서버 환경에 구애 받지 않을 수 있을까? 앱 전용 환경 만들기 패키징 격리 자원 할당 애플리케이션의 전용 환경을 제공합니다. 컨테이너의 사용 요건 리눅스 기술 런타임(컨테이너 관리 도구) 쿠버네티스 실습 환경 구축 root 사용자로 /tmp 디렉토리 밑에서 실습을 진행합니다. sudo -Es cd /tmp # 필요 패키지 설치 apt-get update \ && apt-get -y install gcc \ && a..

서비스(Service): 포드에 연결하고 외부에 노출 디플로이먼트를 통해 생성된 포드에 어떻게 접근할 수 있을까요? 이전 까지는 kubectl describe 명령어로 포드의 내부 IP를 직접 확인한 뒤 포드로 직접 접근할 수는 있었지만, 이 방법은 로컬 개발 환경 또는 쿠버 클러스터 내부에서만 사용할 수 있었습니다. 게다가 도커 컨테이너와 마찬가지로 포드의 IP는 영속적이지 않아 항상 변할 수 있다는 점도 유의해야 합니다. 여러 개의 디플로이먼트를 하나의 완벽한 애플리케이션으로 연동하려면 포드 IP가 아닌, 서로를 발견할 수 있는 다른 방법이 필요합니다. 도커 사용 방법을 되살펴 보면 도커 컨테이너는 -p 옵션으로 손쉽게 컨테이너를 외부로 노출할 수 있었습니다. 즉, 컨테이너가 생성됨과 동시에 외부로 ..

디플로이먼트(Deployment): 레플리카셋, 포드의 배포를 관리 디플로이먼트 사용하기 실제 쿠버네티스 운영 환경에서 레플리카셋을 YAML 파일에서 사용하는 경우는 거의 없고, 대부분 레플리카셋과 포드의 정보를 정의하는 디플로이먼트(Deployment)라는 이름의 오브젝트를 YAML 파일에 정의해 사용한다. 디플로이먼트는 레플리카셋의 상위 오브젝트이기 때문에 디플로이먼트를 생성하면 해당 디플로이먼트에 대응하는 레플리카셋도 함께 생성된다. # vi deployment-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx-deployment spec: replicas: 3 selector: matchLabels: app: my-n..

레플리카셋(Replica Set): 일정 개수의 포드를 유지하는 컨트롤러 레플리카셋을 사용하는 이유 쿠버네티스의 기본 단위인 포드는 여러 개의 컨테이너를 추상화해 하나의 애플리케이션으로 동작하도록 만드는 컨테이너 묶음이다. 실제로 외부 사용자의 요청을 처리해야 하는 마이크로 서비스 구조의 포드라면 스웜 모드처럼 여러 개의 동일한 컨테이너를 생성한 뒤 외부 요청이 각 컨테이너에 적절히 분배될 수 있어야 한다. 쿠버네티스에서는 기본 단위가 포드이기 때문에 동일한 여러 개의 포드를 생성해 외부 요청을 각 포드에 분배하는 방식을 사용해야 한다. apiVersion: v1 kind: Pod metadata: name: my-nginx-pod-a spec: containers: - name: my-nginx-con..

쿠버네티스를 시작하기 전에 도커 스웜 모드와 비교해서 쿠버네티스만이 가지는 고유한 특징들을 살펴보자. 모든 리소스는 오브젝트 형태로 관리된다. 도커 스웜 모드에서 컨테이너의 묶음을 표현하기 위해 서비스라는 것을 사용했는데 이것도 컨테이너 리소스의 집합을 정의한 것이기 때문에 일종의 오브젝트라고 볼 수 있다. 그러나 쿠버네티스는 이러한 개념을 더욱 폭넓고 세밀한 단위로 사용한다. 예를 들어 쿠버네티스에서는 컨테이너의 집합(Pods), 컨테이너의 집합을 관리하는 컨트롤러(Replica Set), 심지어 사용자(Service Account), 노드(Node)까지도 하나의 오브젝트로 사용할 수 있다. 쿠버네티스에서 사용할 수 있는 오브젝트는 kubectl api-resources 명령어를 사용해 확인할 수 있다..

가장 기초가 되는 도커 컨테이너를 다루기 위해 도커 엔진을 공부했고, 여러 대의 도커 엔진을 효율적으로 관리하기 위해 도커 스윔의 개념과 사용 방법을 다뤘다. 그리고 여러 종류의 컨테이너를 YAML 파일로 선언적으로 정의해 생성할 수 있는 도커 컴포즈의 사용 방법 또한 알아봤다. 이러한 프로젝트들의 개념을 한군데로 모아 사용할 수 있는 더욱 훌륭한 프로젝트가 바로 쿠버네티스다. 그리스어로 조타수라는 뜻의 쿠버네티스는 오늘날 사실상 표준으로 사용되고 있는 컨테이너 오케스트레이션 도구이다. 쿠버네티스는 도커 스웜 모드처럼 여러 대의 도커 호스트를 하나의 클러스터로 만들어 준다는 점은 같지만, 세부적인 기능을 더욱 폭넓게 제공하고 있다. 쿠버네티스의 장점 서버 자원 클러스터링, 마이크로서비스 구조의 컨테이너 ..

도커 컴포즈 도커 컴포즈를 사용하는 이유 여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 이를 테스트하려면 각 컨테이너를 하나씩 생성해야 한다. 매번 run 명령어에 옵션을 설정해 CLI로 컨테이너를 생성하기보다는 여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리할 수 있다면 좀더 편리하다. 이를 위해 도커 컴포즈는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있는 작업 환경을 제공한다. 도커 컴포즈 설치 # ubuntu, 루트에서 해야함, 최신버전찾기 : https://github.com/docker/compose $ curl -L https://github.com/docker/compose/releases/download/(..

도커 데몬 도커의 구조 $ which docker $ ps aux | grep docker 컨테이너나 이미지를 다루는 명령어는 /usr/bin/docker/에서 실행되지만 도커 엔진의 프로세스는 /usr/bin/dockerd 파일로 실행된다. 이는 docker 명령어가 실제 도커 엔진이 아닌 클라이언트로서의 도커이기 때문이다. 도커의 구조는 크게 두 가지로 나뉜다. 하나는 클라이언트로서의 도커이고, 다른 하나는 서버로서의 도커이다. 실제로 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체는 도커 서버이고, 이는 dockerd 프로세스로서 동작한다. 도커 엔진은 외부에서 API 입력을 받아 도커 엔진의 기능을 수행하는데, 도커 프로세스가 실행되어 서버로서 입력을 받을 준비가 된 상태를 도커 데몬이라고 이..

도커 이미지 도커는 기본적으로 도커 허브라는 중앙 이미지 저장소에서 이미지를 내려받는다. 이미지 저장소를 다른 사람들에게 공개하지 않기 위해 비공개 저장소를 사용하려면 비공개 저장소의 수에 따라 요금을 지불해야 한다. 이를 해결하기 위해 도커 이미지 저장소를 직접 구축해 비공개로 사용할 수도 있다. 도커 엔진에서 docker search 명령어를 사용하여 어떤 이미지가 있는지 확인할 수 있다. $ docker search ubuntu 도커 이미지 생성 컨테이너에 애플리케이션을 위한 특정 개발 환경을 직접 구축한 뒤 사용자만의 이미지를 직접 생성해야 하는 경우가 많다. 컨테이너 안에서 작업한 내용을 이미지로 만드는 방법을 알아보자. $ docker run -it --name commit_test ubunt..

도커 네트워크 도커 네트워크 구조 도커는 컨테이너에 내부 IP를 순차적으로 할당하며, 이 IP는 컨테이너를 재시작할 때마다 변경될 수 있다. 이 내부 IP는 도커가 설치된 호스트, 즉 내부 망에서만 쓸 수 있는 IP이므로 외부와 연결될 필요가 있다. 이 과정은 컨테이너를 시작할 때마다 호스트에 veth(virtual ethernet)…라는 네트워크 인터페이스를 생성함으로써 이뤄진다. 도커가 설치된 호스트에서 ifconfig 같은 명령어로 인터페이스를 확인하면 실행 중인 컨테이너 수만큼 veth로 시작하는 인터페이스가 생성된 것을 알 수 있다. veth 인터페이스뿐 아니라 docker0이라는 브리지도 존재하는데 docker0 브리지는 각 veth 인터페이스와 바인딩돼 호스트의 eth0 인터페이스와 이어주는..

도커 컨테이너 다루기 컨테이너를 외부에 노출 컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당 받는다. 기본적으로 도커는 컨테이너에 172.17.0.x의 IP를 순차적으로 할당한다. 아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없으며 도커가 설치된 호스트에서만 접근할 수 있다. 외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 한다. 컨테이너에 아파치 웹서버를 설치하고 외부에 노출해보자. $ docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04 -p 옵션은 컨테이너의 포트를 호스트의 포트와 바인딩해 연결할 수 있게 설정한다. 호스트포트:컨테이너포트 형식으로 쓰면된다. $ ..

도커 엔진 도커 이미지와 컨테이너 도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너임. 도커 이미지 이미지는 컨테이너를 생성할 때 필요한 요소이며, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념이다. 이미지는 여러 개의 계층으로 된 바이너리 파일로 존재하고, 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용된다. 도커 명령어로 내려받을 수 있다. 도커 컨테이너 이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성되고, 이것이 바로 도커 컨테이너가 된다. 생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리돼 있으므로 특정 컨테이너에서 어떤 애플리케이션을 설치하거나 삭제해..

도커란? 일반적으로 도커라고 하면 도커 엔진이라는 의미이다. 도커 엔진이 컨테이너를 생성하고 관리하는 주체로서 이 자체로도 컨테이너를 제어할 수 있고 다양한 기능을 제공하는 도커의 주 프로젝트 이기 때문. 가상 머신과 도커 컨테이너 가상 머신은 완벽한 운영체제를 생성할 수 있다는 장점이 있지만 일반 호스트에 비해 성능 손실이 있으며, 수 기가바이트에 달하는 가상 머신 이미지를 애플리케이션으로 배포하기는 부담스럽다는 단점이 있음. 이에 비해 도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스의 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없음. 도커를 시작해야 하는 이유 애플리케이션의 개발과 배포가 편함. 도커 이미지는 ..