4-4. 애플리케이션 빌드 실전 예제: Go 소스 코드
FROM diamol/golang AS builder
COPY main.go .
RUN go build -o /server # 의존모듈 설치 없이 바로 빌드
#app
FROM diamol/base
ENV IMAGE_API_URL="http://iotd/image" \
ACCESS_API_URL="http://accesslog/access-log" # 환경병수 설정
CMD ["/web/server"]
WORKDIR web
COPY index.html .
COPY --from=builder /server .
RUN chmod +x server
빌드코드
cd ch04/exercises/image-gallery
docker image build -t image-gallery .
- Go는 네이티브 바이너리로 컴파일되는 크로스 플랫폼 언어로 어떤 플랫폼이든 동작하는 바이너리를 컴파일 할 수 있어 별도의 런타임이 필요없기 때문에 도커 이미지가 매우 매우 작아진다. 도커 역시 Go로 구현되었다.
- 아래의 명령으로 다른 언어의 이미지 크기를 비교해보면, Go 빌드 도구를 포함하면 800MB이지만 실제 앱의 크기는 25MB이다. 여기서 중요한 것은 최종적으로 앱 이미지에 모든것이 들어가지 않아 실행시에 별도의 빌드 도구가 필요없다는 것이다. 또 보안적으로 공격이 가능한 부분 자체를 줄인다는 장점이 있다.
docker image ls -f reference=diamol/golang -f reference=image-gallery
- 아래의 코드를 마지막으로 실행시키면 현재까지 3개의 컨테이너에 걸친 분산 어플리케이션이 빌드도구 없이 실행된다. Go 웹어플리케이션이 자바 API를 호출하고 Node.js로 구현된 API에 로그를 남긴다.
docker container run -d -p 802:80 --network nat image-gallery
- docker image build자체가 파이프라인 정의 역활을 하기에 추가로 파이프라인 정의 없이 애저 데브옵스, 젠킨스 등을 사용할 수 있다.
[5장. 도커 허브 등 레지스트리에 이미지 공유하기]
5-1. 레지스트리, 리포지터리, 이미지 태그 다루기
- 이미지 다운 시 도커 레지스트리로 불리는 서버에 저장되며 기본으로 도커 허브를 사용한다.
- 이미지의 전체 이름은 docker.io/diamol/golang/latest 로 레지스트리 도메인(기본값은 도커허브), 작성자 계정 이름, 앱 이름, 이미지 태그로 구성된다.
- 직접 패키징을 하려면 태그를 부여하여 버전을 구별할 수 있게해야한다.
- 레지스트리에 이미지를 푸시하려면 명시적으로 태그를 부여해야하며, 같은 그룹 구성원(작성자 계정 이름)이어야한다.
5-2. 도커 허브에 직접 빌드한 이미지 푸시하기