본문 바로가기
반응형

DevOps/Docker94

[Docker] : 도커와 컨테이너 생태계 [Docker] : 도커와 컨테이너 생태계 컨테이너가 내부적으로 어떻게 구성되어 있는지, 생태계가 어떤 방향으로 나아가고 있는지 이해가 필요하다. 도커 핵심 프로세스라고 하면 dockerd(도커 데몬)을 떠올리기 마련이지만 사실 도커 데몬은 컨테이너가 아니다. 실제로 컨테이너 프로세스라고 부를 것은 runC이다. 컨테이너에 1대1로 매칭되는 런타임 역할을 runC가 담당한다. 그리고 여러 개의 runC 컨테이너 프로세스 및 이미지를 관리하는 주체가 바로 containerd(컨테이너-디)이다. 우리가 알고 있는 도커 엔진(dockerd 프로세스)은 contanerd와 통신을 통해 runC를 사용하게 한다. ps aux | grep contalnerd 도커가 실행중인 호스트에서도 바로 확인이 가능하다. 컨테.. 2022. 3. 12.
[Docker] : 도커 스택 사용하기 networks: {} services: mysql: comand: mysqld image: alicek106/composetest:mysql web: command: apachectl -DFOREGROUND image: alicek106/composetest:web links: - mysql: db ports: - 80:80 version: '3.0' volumes: {} docker-compose.yml 파일을 작성한다. 이제 이 파일을 가지고 스택으로 변환한다. docker stack deploy 명령어에 YAML 파일을 지정하고 마지막에 스택 이름을 입력한다. docker stack deploy -c docker-compose.yml mystack docker-compose.yml 파일에서 mys.. 2022. 3. 12.
[Docker] : 도커 스웜 모드와 함께 사용하기 stack이 도커 엔진 1.13버전에 추가됐다. 스택은 YAML 파일에서 생성된 컨테이너의 묶음으로 YAML로 스택을 생성하면 YAML에 정의된 서비스가 스웜 모드의 클러스터에서 일괄적으로 생성된다. 스택은 도커 컴포즈 명령인 docker-compose가 아닌 docker stack로 제어해야 한다. 📖 ← [ 시작하세요! 도커/쿠버네티스 ] 책을 참고하여 공부하였습니다. 2022. 3. 10.
[Docker] : 도커 컴포즈 네트워크 YAML 파일에 네트워크 항목을 정의하지 않으면 도커 컴포즈는 프로젝트별로 브리지 타입의 네트워크를 생성한다. docker-compose up 명령어뿐 아니라 docker-compose scale 명령어로 생성되는 컨테이너 전부가 이 브리지 타입의 네트워크를 사용한다. —net-alias가 서비스의 이름을 갖도록 자동으로 설정된다. 때문에 이 네트워크에 속한 컨테이너는 서비스의 이름으로 서비스 내의 컨테이너에 접근할 수 있다. 📖 ← [ 시작하세요! 도커/쿠버네티스 ] 책을 참고하여 공부하였습니다. 2022. 3. 10.
[Docker] : YAML 파일 작성(2) 볼륨 정의 driver는 볼륨을 생성할 때 사용될 드라이버를 설정한다. external은 YAML 파일에서 volume, volumes-form 옵션을 사용하면 프로젝트마다 볼륨을 생성한다. YAML 파일 검증하기 오타 및 파일 포맷에 대한 검사를 원하면 docker=compose config 명령어를 사용한다. 📖 ← [ 시작하세요! 도커/쿠버네티스 ] 책을 참고하여 공부하였습니다. 2022. 3. 9.
[Docker] : YAML 파일 작성(1) YAML 파일 작성 도커 컴포즈를 실 사용하기 위해 더 많은 옵션과 명령어를 공부해야 하고 YAML 파일 작성에도 익숙해야 한다. 기존에 사용하던 run 명령어를 YAML 파일로 변환해 사용하는 게 도커 컴포즈의 사용법이다. YAML 파일은 버전, 서비스, 볼름, 네트워크 이렇게 총 4개의 정의 항목으로 구성된다. 가장 많이 사용하는 건 서비스 정의이고 볼륨과 네트워크 정의는 서비스로 생성된 컨테이너에 선택적으로 사용된다. 항목의 하위 항목을 정의하기 위해 2개의 공북으로 들여쓰기해서 상위 항목과 구분한다. 버전 정의 버전은 YAML 맨 윗 부분에 정의한다. version: '3.0' 서비스 정의 서비스는 컨테이너로 구현된다. 하나의 프로젝트로서 도커 컴포즈에 의해 관리된다. services: my_co.. 2022. 3. 8.
[Docker] : 도커 컴포즈의 프로젝트, 서비스, 컨테이너 도커 컴포즈의 프로젝트, 서비스, 컨테이너 도커 컴포즈는 컨테이너를 프로젝트 및 서비스 단위로 구분하기 떄문에 컨테이너의 이름은 일반적으로 프로젝트이름_서비스이름_서비스내에서컨테이너의번호로 구성되어 있다. 하나의 프로젝트는 여러 개의 서비스로 구성된다. 여러 서비스는 다시 여러 컨테이너로 구성된다. 스웜 모드에서의 서비스와 마찬가지로 하나의 서비스에는 여러 컨테이너가 존재할 수 있도록 컨테이너의 번호를 붙여 서비스 내의 컨테이너를 구분한다. docker-compose scale mysql=2 docker-compose ps 컨테이너 목록을 확인해 보면 서비스의 컨테이너가 늘어난 것을 확인할 수 있다. 컨테이너 수를 늘이고 줄여서 일정하게 유지할 수 있다. docker-compose down 명령어로 프로.. 2022. 3. 8.
[Docker] : docker-compose.yml 작성과 활용하기 docker-compose.yml 작성과 활용 docker run -d --name mysql \\ alicek106/composetest:mysql \\ mysqld docker run -d -p 80:80 \\ --link mysql:db --name web \\ alicek106/composetest:web \\ apachectl -DFOREGROUND run 명령어를 docker-compose.yml 파일로 변환해 컨테이너를 생성하고 실행한다. version : '3.0' services: web: image: alicek106/composetest:web ports: - "80:80" links: - mysql:db command: apachectl -DFOREGROUND mysql: image.. 2022. 3. 7.
[Docker] : 도커 컴포즈 설치하기 도커 컴포즈 설치 curl -L /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 도커 컴포즈는 깃 허브 저장소에서 내려 받을 수 있다. docker-compose -v 도커 컴포즈 정상 설치를 확인하기 위해 버전을 확인해 준다. 2022. 3. 7.
[Docker] : 도커 컴포즈를 사용하는 이유 도커 컴포즈를 사용하는 이유 여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 테스트하려면 각 컨테이너를 하나씩 생성해야 한다. docker run --name mysql -d alicelk106/composetest:mysql mysqld docker run -d -p 80:80 \\ --link mysql:db --name web \\ alicek106/composetest:web apachectl -DFOREGROUND 아파치 웹 서버 컨테이너와 mysql 컨테이너를 생성한다. 여러 컨테이너로 구성된 애플리케이션을 구축하기 위해 run 명령어를 여러번 사용해야 하지만 테스트 하기가 번거롭다. 이를위해 도커 컴포즈(Docker Compose)는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러.. 2022. 3. 7.
[Docker] : service 제약 설정 docker service create 명령에 —constraint 옵션을 추가해 서비스의 컨테이너가 할당될 노드의 종류를 선택할 수 있다. 다른 방법으로는 노드의 ID나 호스트 이름, 도커 데몬의 라벨로 제약 조건을 설정할 수도 있다. node.labels 제약조건 docker service create --name label_teat \\ --constraint 'node.labels.storage == ssd' \\ --replicas=5 \\ ubuntu:14.04 \\ ping docker.com docker node update 명령어로 설정해 줄 수 있다. 여러 노드에 라벨이 설정되어 있으면 매니저 노드의 스케줄러는 해당 노드들을 대상으로 컨테이너를 할당하는 스케쥴링을 진행한다. 만약 제한 .. 2022. 3. 7.
[Docker] : 노드 라벨 추가하기 노드에 라벨을 추가는 노드 분류와 비슷하다. 라벨은 키-값 형태를 가지고 있고 특정 노드에 라벨을 추가하면 서비스를 할당할 때 컨테이너를 생성할 노드의 그룹을 선택하는 게 가능하다. docker node update \\ --label-add storage=ssd \\ swarm-worker1 swarm-worker1 노드 라벨을 storage=ssd로 설정해 storage라는 키에 ssd라는 값을 설정해 준다. docker node inspect --pretty swarm-worker1 docker node inspect 명령으로 확인할 수 있다. 📖 ← [ 시작하세요! 도커/쿠버네티스 ] 책을 참고하여 공부하였습니다. 2022. 3. 7.
[Docker] : 노드 AVAILABILITY변경하기 노드 AVAILABILITY변경하기 docker node ls 구축한 스웜 클러스터의 노드를 확인한다. 모든 노드의 STATUS 항목이 Ready, AVAILABILITY항목이 Active인 것을 알 수 있다. Active Active 상태는 새로운 노드가 스웜 클러스터에 추가되면 기본적으로 설정되는 상태로서, 노드가 서비스의 컨테이너를 할당받을 수 있음을 의미한다. docker node update \\ --availability active \\ swarm-worker1 Active 상태가 아닌 노드를 Acitve 상태로 변경한다. Drain 스웜 매니저의 스케줄러는 컨테이너를 해당 노드에 할당하지 않는다. 보통 매니저 노드에 설정하는 상태지만 노드에 문제가 생겨 일시적으로 사용하지 않는 상태로 설정.. 2022. 3. 7.
[Docker] : 스웜 모드에서 볼륨의 한계점 서비스를 할당받을 수 있는 모든 노드가 볼륨 데이터를 가지고 있어야 해서 스웜 클러스터에서 볼륨을 사용하기 어렵다. 스웜 모드에서는 도커 볼륨이나 호스트와의 볼륨 사용이 적합하지 않은 기능일 수도 있다. 해결하기 위해 어느 노드에서도 접근 가능한 퍼시스턴트 스토리지(Persistent Storage)를 사용하는 것이다. 퍼시스턴트 스토리지는 호스트와 컨테이너와 별개로 외부에 존재해 네트워크로 마운트 할 수 있는 스토리지이다. 📖 ← [ 시작하세요! 도커/쿠버네티스 ] 책을 참고하여 공부하였습니다. 2022. 3. 6.
[Docker] : bind 타입의 볼륨 생성 bind 타입의 볼륨 생성 바인드 타입은 호스트와 디렉터리를 공유할 때 사용된다. 공유 될 호스트의 디렉터리를 설정해야 하므로 source 옵션을 반드시 명시해야 한다. docker service create --name ubuntu \\ --mount type=bind, source=/root/host, target=/root/container \\ ubuntu:14.04 \\ ping docker.com 📖 ← [ 시작하세요! 도커/쿠버네티스 ] 책을 참고하여 공부하였습니다. 2022. 3. 6.
[Docker] : volume 타입의 볼륨 생성 volume 타입의 볼륨 생성 스웜 모드에서 도커 볼륨을 사용하는 서비스를 생성하기 위해 —mount 옵션의 type 값에 volume를 지정해 줘야한다. docker service create --name ubuntu \\ --mount type=volume, source=myvol, target=/root \\ ubuntu:14.04 \\ ping docker.com type에 volume를 적어준다. source는 사용할 볼륨, target은 컨테이너 내부에 마운트 될 디렉터리의 위치이다. docker service create --name ubuntu \\ --mount type=volume, target=/root \\ ubuntu:14.04 \\ ping docker.com source 옵션을.. 2022. 3. 6.
[Docker] : 서비스 디스커버리 같은 컨테이너를 여러 개 만들어 사용할 때 문제가 되는 부분은 컨테이너 생성의 발견(Service Discovery)와 없어진 컨테이너 감지인데 스웜 모드는 서비스 발견 기능을 자체적으로 지원한다. docker network create -d overlay discovery 서비스가 사용할 오버레이 네트워크를 생성한다. docker service create --name server \\ --replicas 2 \\ --network discovery \\ alicek106/book:hostname docker service create --name client \\ --network discovery \\ alicek106/book:curl \\ ping docker.com 서비스 두 개를 생성한다. .. 2022. 3. 6.
[Docker] : 사용자 정의 오버레이 네트워크 사용자 정의 오버레이 네트워크 스웜 모드는 자체 키-값 저장소를 가지고 있어 사용자 정의 오버레이 네트워크를 생성하고 사용할 수 있다. docker network create \\ --subnet 10.0.9.0/24 \\ -d overlay \\ myoverlay -d 명령어로 네트워크 드라이버를 overlay로 설정하고 —subnet 옵션으로 오버레이 네트워크의 서브넷을 10.0.9.0으로 설정했다. 이렇게 설정한 네트워크의 이름은 myoverlay가 된다. docker network ls 명령어로 생성한 오버레이 네트워크를 확인한다. 새롭게 생성한 오버레이 네트워크의 SCOPE가 swarm으로 설정되어 있는데 이것은 스웜 클러스터에서만 사용할 수 있는 네트워크라는 뜻이고 매니저 노드에서 docker.. 2022. 3. 6.
[Docker] : docker_gwbridge 네트워크 docker network ls | grep docker 오버레이 네트워크를 사용하지 않는 컨테이너는 기본적으로 존재하는 브리지 네트워크를 사용해 외부와 연결하지만 오버레이 네트워크는 이와 다른 브리지 네트워크인 docker_gwbridge 네트워크와 함께 상요된다. docker_gwbridge 네트워크는 외부로 나가는 통신 및 오버레이 네트워크의 트래픽 종단덤(VTEP) 역할을 담당하게 된다. docker_gwbridge 네트워크는 컨테이너 내부의 네트워크 인터페이스 카드 중 eth1과 연결된다. 📖 ← [ 시작하세요! 도커/쿠버네티스 ] 책을 참고하여 공부하였습니다. 2022. 3. 5.
[Docker] : 오버레이 네트워크 docker ps --format "table {{.ID}}\\t{{.Status}}\\t{{.Image}}" docker exec 컨테이너ID ifconfig 명령어로 컨테이너 내부에서 ifconfig 명령어를 실행해 가상 네트워크 인터페이스를 출력한다. docker ps --format "table {{.ID}}\\t{{.Status}}\\t{{.Image}}" docker exec 컨테이너ID ifconfig 컨테이너마다 eth0, eth1, lo가 할당 된 것을 확인할 수 있고 swarm-manager에서 생성도니 컨테이너와 swarm-worker1에서 생성된 컨테이너 IP 주소가 차례로 할당됐다는 것이다. ingress 네트워크는 오버레이 네트워크 드라이버를 사용하는데 여러개의 도커 데몬을 하나.. 2022. 3. 5.
[Docker] : ingress 네트워크 ingress 네트워크는 스웜 클러스터를 생성하면 자동으로 등록되는 네트워크다. 스웜 모드를 사용할 때만 유효하다. docker network ls | grep ingress 매니저 노드, 스웜 클러스터에 등록된 노드라면 전부 ingress 네트워크가 생성된다. docker service create --name hostname \\ -p 80:80 \\ --replicas=4 \\ alicek106/book:hostname 위 이미지는 컨테이너의 호스트 이름, 즉 임의로 할당된 16진수를 출력하는 PHP 파일이 들어있는 웹 서버이다. docker ps --format "table {{.ID}}\\t{{.Status}}\\t{{.Image}}" 각 노드에서 명령어로 컨테이너 ID를 확인한다. 어떤 노드의.. 2022. 3. 5.
반응형