금일은 docker 와 msa 의 관계, 멀티 플랫폼 이미지를 지원하기 위한 Docker Buildx 에 대해 알아보겠습니다.
앞서 CNCF 에 대해 간단히 설명하였습니다. 리눅스 산화기관으로 CLOUD 에 필요한 기능 및 기술들에 대해 소개하는 유익한 사이트 입니다.
Cloud Native Trail Map 에서의 Docker 에 위치를 아래의 사이트에서 알 수 있습니다.
Containeriation 부터 Software Distribution 까지 10가지의 기술들에 대해 로드맵 형태로 소개 하고 있습니다.
각 10가지의 Cloud Service에 대해 적합한 기술들에 대해 살펴볼 수 있습니다.
Microservices : 하나의 단일 서비스를 서비스의 경계를 명확히 나누어서 데이터를 독립적으로 사용하며 개발과 배포를 자유롭게 구성할 수 있는 환경
서비스의 장애시에 해당 서비스만 격리가 가능하다. 확장성과 복제(Scaling) 이 보다 자유롭게 가능하다.
Containerization : 가상화, 독립적으로 격리된 상태에서 애플리케이션을 개발하고 배포하는 기술
컨테이너 런타임만 존재한다면 자유롭게 배포할 수 있는 기술입니다.
Continuous delivery : ci/cd 를 묶은 개념으로 만들어져 있는 애플리케이션을 원하는 운영서버에 자동화 배포 기술을 내포하며
소스코드를 빌드, 테스트 코드 실행, 보안 점검, 정적 테스트 을 통한 패키징 합니다.
패키징 결과를 이미지화 하고 Registry 에 보관하여 해당 인스턴스에서 컨테이너화 하는 과정입니다.
DevOps : 개발조직과 운영조직을 합쳐서 서비스를 유지하고 지속적으로 고도화 하여 서비스 활성화 하는 개념입니다.
기술과 팀원들만이 아니라 경영진과 기업의 문화가 바뀌어 주어야 되기 때문에 업무량은 늘어난다는 통계가 있지만
서비스의 지속적인 향상과 유저의 만족, 그리고 끊임없이 발전되어 가는 모습을 제공하기 위해 적절한 보상체계가 마련되어있어야 합니다.
정리하자면 서비스가 완성되면 살아 있는 유기체 처럼 고객이 만족할 때 가지 발전해나가는 사이클을 말합니다. cloud native 강의에서 마지막 단계라고 할 수 있습니다.
Microsoft 에서 제공하는 Docker Cluster 의 이미지입니다.


해당 이미지에서 BFF 란 프론트엔드 기술을 위한 백엔드 이며 프론트엔드에 백엔드 기술이 포함되어 있는 형태입니다.
Microservice 에 적합하며 각 프론트 기술을 벡엔드와 별도의 통신이 없기 때문에 속도 측면에서 유리합니다.
그밖에도 api gateways 를 통해서 다양한 domain microservice 로 통신하게 됩니다.
서비스 간의 동기화를 위해서는 Event bus, pub/sub, messaging queueing 으로 이한 비동기 처리를 할 수 있습니다.

다음 이미지를 구축할 예정입니다. API Service 같은경우 구축한 웹 애플리케이션을 구동할 수 있도록 제공하는 서버가 WAS(web application server) 이며 Java 진영에서의 Opensource 로 tomcat 이 있으며 기본 포트가 8080 인 것입니다.
docker-compose 로 작성시 각각 하나의 서비스만 가능하지만 docker-swarm 을 사용한다면 각 컨테이너별로 스케일링을 통해 여러개의 서비스를 만들어 가용성을 확보 할 수 있습니다.
docker buildx ls
Multi Platform 빌드 지원 기능을 의미하며 Docker 19.03 부터 사용 가능하며, Docker Desktop 에 Buildx 플러그인을 포함합니다.
MacOS 환경에서 이미지를 buildx 명령어를 통해 만들게 되면 linux ec2 환경에서 해당 이미지를 실행할 수 있는 멀티 환경을 실행 가능하게 합니다.
해당 실습은 MocOS m1 chip 환경에서 ec2 cloud 환경으로 진행하는 방향으로 하였습니다.
windows 환경의 경우 linux/amd64 platform 에서 멀티 플랫폼이 지원 가능하다고 알고있습니다. 궁금하신 분은 해당 키워드를 통해 구글링을 하시면 될것 같습니다.
FROM node:alpine
WORKDIR /app
[host pc]
docker build --tag [dockerhub name]/my-node:m1 -f Dockerfile .
docker images | grep my-node
docker push [dockerhub name]/my-node:m1 // docker hub push
[ec2 cloud]
docker pull [dockerhub name]/my-node:m1
docker run -it inheecho/my-node:m1 bash
cat /etc/*-release
해당 명령어로 ec2 cloud 환경에서 실행하게 되면 platform does not match .. error 가 발생하게 됩니다.
cat 명령어를 통해 사용하고 있는 linux 버전을 확인 가능합니다.
maxOS 환경에서는 linux/arm64 환경이고 ec2 cloud 환경의 버전은 linux/amd64 버전이며 ec2 cloud 환경에서 호환 가능한 플랫폼을 docker buildx ls 명령어를 통해 찾아보면 linux/arm64 버전이 없는 것을 찾아 볼 수 있습니다.
그렇기 때문에 dockerhub 에 해당 이미지를 push 하기전에 ec2 에서 호환가능한 플랫폼 형태로 이미지를 push 해주어야 합니다.
docker buildx dimagetools inspect node:alpine
해당 명령어를 maxOS 환경에서 실행하게 되면 node:alpine 이미지가 지원하는 환경을 찾아 볼 수 있습니다. (arm64, amd64 포함이 되어있음)
docker buildx build --paltform linux/amd64
--tag inheecho/my-node:amd64 Dockerfile .
그런다음 ec2 cloud 환경에서 호환 가능한 해당 플랫폼을 변경해주는 명령어를 통해 해당 이미지를 제 빌드 해주어야 합니다.
[ec2-cloud]
docker run -it inheecho/my-node:amd64 sh
node --version
이렇게 ec2 cloud 환경에서 해당 명령어를 실행하면 node 의 버전을 확인 가능합니다.