일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- tour of go
- 코딩
- c++ heap
- C++ library
- C++ gui 라이브러리
- 자료구조
- 리듬게임
- BOJ
- Docker
- C언어
- 백준
- JUCE라이브러리
- JUCE 튜토리얼
- C++
- gui
- 운영체제
- JUCE
- 프로그래밍
- 공룡책
- 연결리스트
- JUCE library
- go channel
- Nebula
- C++ gui
- go
- a tour of go
- vim-go
- OS
- LOB
- Today
- Total
CafeM0ca
Go 서버 애플리케이션을 Docker로 AWS EC2에 배포 본문
작은 서비스를 만들어서 이를 배포하는 경험을 작성한다.
이 글의 서버 애플리케이션의 소스코드 구조는 다음과 같다
github.com/jinykim0x80/42report_calender_server
- 42report_calender_server
- Dockerfile
- internal
- *.go
- main.go
Dockerize
우리가 작성한 서버 애플리케이션 코드를 빌드하고 애플리케이션을 클라우드 서버에 구동시키면 배포가 끝난다.
자신의 로컬 PC와 클라우드의 환경이 다르므로 도커를 활용하고자 한다.
우선 golang이 깔려있는 컨테이너에서 소스코드를 빌드해야한다.
도커허브(https://hub.docker.com/)에서 golang을 검색하면 golang이 깔려있는 컨테이너 환경을 구축할 수 있다.
FROM golang:1.15
ENV GO111MODULE=on
RUN go get -u github.com/jinykim0x80/42report_calender_server
COPY ./ ./src
WORKDIR src
RUN go build -o 42report_calender_server
# 포트는 443 https 오픈
EXPOSE 443
# 실행할 애플리케이션
CMD ["./42report_calender_server"]
GO111MODULE=on
에 대한 설명은 여기를 참조(https://velog.io/@kimmachinegun/Go-Go-Modules-살펴보기-7cjn4soifk)
Dockerfile을 작성했으면 빌드하여 이미지로 만들고 실행하면 끝이다.
docker tag - buster, stretch, alpine, slim
컨테이너 tag를 보면 위와 같은 tag를 본 적이 있을 것이다. golang:1.16.3-buster
간단하게 설명하면 다음과 같다
- buster/stretch/jessie : debian release 버전에 따른 분류. buster는 debian 10.4, stretch는 9 버전 대, jessie는 8버전 대
- slim : full image과 짝이 되는 아래 버전. 일반적으로 최소한의 패키지를 설치하는게 목적
- apline : apline linux project가 베이스가 되는 이미지. 이미지의 크기가 매우 작아서 인기 있음. 그러나 어떤 팀은 디버깅이 힘들어서 안쓴다고 함.
버전만 있는 경우는 full official image로 안정성이 제일 좋다.
golang:1.15
python:3.8.3
node:14.1.2
본인의 경우 이미지를 빌드해보니 1GB 정도의 용량이 나왔다. 이는 가벼운 Go 서버 애플리케이션 치고는 묵직한 사이즈라 추후에 이미지 사이즈를 줄여보려고 한다.
+ 추가 (2022.08.24)
https://cafemocamoca.tistory.com/320
AWS에 Docker 올리기
서버 애플리케이션을 AWS EC2 nano 인스턴스에 올려보려한다. ec2 인스턴스를 생성하면 인바운드(외부에서 서버로 접근) 포트로 22번 ssh포트만 열려있다. 서버 애플리케이션에 접근하기 위해 80번 포트를 열어주자. 포트를 여는 방법은 여기를 참조(https://hit-it-sum.tistory.com/5)
0.0.0.0은 모든 IP를 의미한다.
::은 IPv6에서 모든 IP를 의미한다.
뒤의 /0은 서브넷 마스크를 의미한다.
인스턴스에 접속하여 git clone을 통해 프로젝트를 클론하고 이미지를 빌드하고 실행해주자.
- 이미지 빌드
docker build -t [빌드할 이미지 이름] [Dockerfile Path]
- 실행
docker run -it --rm -p 80:443 [빌드한 이미지 이름]
- 외부에서 www.test.com으로 접속하면 디폴트 포트로 80번을 사용한다.
- 도커에서 -p는 호스트OS와 컨테이너의 포트 연결을 지정하는 옵션이다.
- 호스트OS(인스턴스)는 80번으로 응답받아서 컨테이너로(443번 포트) 전달한다.
permission denied가 발생하면 sudo로 실행하자.
브라우저에서 ec2의 public ip나 public DNS로 접근하면 서버가 응답을 잘 준다.
원래는 쿠버네티스로 컨테이너 오케스트레이션을 시도했으나 쿠버네티스 마스터 노드를 운영하기 위해선 2개의 CPU가 필요한데 ec2 nano 인스턴스는 cpu가 1개 뿐이라 불가능하여 도커로 배포하게 되었다.
Reference
- https://lynlab.co.kr/blog/64 경량바이너리 배포
- https://hillfolk.org/posts/go-github-build-docker/ github action + docker 배포
- https://medium.com/swlh/alpine-slim-stretch-buster-jessie-bullseye-bookworm-what-are-the-differences-in-docker-62171ed4531d 도커의 태그 의미
- https://semaphoreci.com/community/tutorials/how-to-deploy-a-go-web-application-with-docker Go 애플리케이션 도커로 배포
- https://velog.io/@kimmachinegun/Go-Go-Modules-살펴보기-7cjn4soifk go111MODULE
- https://hit-it-sum.tistory.com/5 AWS 포트열기
'Programming > Go' 카테고리의 다른 글
[Go] sort In struct and map (0) | 2021.07.23 |
---|---|
AWS 도메인 연결과 Docker 컨테이너 통신 (0) | 2021.05.11 |
[Go] 패키지 네이밍(package naming) (0) | 2021.04.06 |
[Go] Go channel 데이터 파이프라인 (2) | 2021.04.05 |
[Go] net/http routing (0) | 2021.03.26 |