[Docker] Web App을 Docker Image로 빌드하기DevOps/Docker2022. 5. 12. 22:58
Table of Contents
728x90
✔️ Web App
Golang의 net/http
패키지를 이용해 Web App을 만들어보자
Writing Web Applications - The Go Programming Languagenet/http
package : Web App을 만들 때 사용하는 패키지
//go:build ignore
package main
import ( # 패키지를 추가하는 부분
"fmt"
"log"
"net/http" # 웹 서버 작동을 위한 패키지
)
# HandleFunc()가 호출
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler) # root에 접속하면 handler라는 함수 실행
log.Fatal(http.ListenAndServe(":8080", nil)) # 8080 포트로 서비스 한다.
}
✔️ Web App 개발 환경 준비
vagrant@docker ~/golang mkdir goweb
vagrant@docker ~/golang cd goweb
vagrant@docker ~/golang/goweb go mod init goweb
go: creating new go.mod: module goweb
vagrant@docker ~/golang/goweb cat go.mod
module goweb
go 1.13
✔️ Web App 실행
vagrant@docker ~/golang/goweb vi goweb.go
vagrant@docker ~/golang/goweb cat goweb.go
package main
import (
"fmt"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
vagrant@docker ~/golang/goweb go fmt
goweb.go
vagrant@docker ~/golang/goweb go run .
내용을 출력하지 않을뿐 실행 중인 상태이다.
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
handler 함수에서 PATH[1:] 에 의해
192.168.100.100:8080/test 으로 접속 시 "test"가 PATH에 들어가게 된다.
^Csignal: interrupt
vagrant@docker ~/golang/goweb go build . # 실행 파일 생성
vagrant@docker ~/golang/goweb ls
go.mod goweb goweb.go
vagrant@docker ~/golang/goweb ls -lh goweb
-rwxrwxr-x 1 vagrant vagrant 7.2M May 12 11:38 goweb
vagrant@docker ~/golang/goweb
특별히 이름을 지정하지 않으면 goweb.go에서 .go를 뺀 이름으로 binary 파일이 만들어진다.
사이즈가 작아 마이크로 서비스 아키텍처에서 기능을 분리하고 컨테이너 이미지를 만들 때 효율적이다.
규모 있는 코드를 짜도 몇십 MB를 넘지 않는다. binary가 하나밖에 없다.
✔️ Web App을 Docker Image로 빌드하기
✔️ .dockerignore 파일 구성하기
.dockerignore
vagrant@docker ~/golang/goweb vi .dockerignore
vagrant@docker ~/golang/goweb cat .dockerignore
goweb
.dockerignore
Dockerfile
✔️ Dockerfile 작성하기(멀티 스테이지 빌드)
Dockerfile
vagrant@docker ~/golang/goweb vi Dockerfile
vagrant@docker ~/golang/goweb cat Dockerfile
FROM golang:1.18-buster AS gobuilder
ENV CGO_ENABLED 0
COPY . /app
WORKDIR /app
RUN go build -o goweb .
FROM scratch
COPY --from=gobuilder /app/goweb /
CMD ["/goweb"]
EXPOSE 8080
✔️ Web App 이미지 빌드
vagrant@docker ~/golang/goweb docker build --no-cache -t goweb .
Sending build context to Docker daemon 7.46MB
Step 1/9 : FROM golang:1.18-buster AS gobuilder
---> addc000ec7ea
Step 2/9 : ENV CGO_ENABLED 0
---> Running in 94ba1bbc9c0d
Removing intermediate container 94ba1bbc9c0d
---> 2b60d9fb320e
Step 3/9 : COPY . /app
---> 9515fe74b378
Step 4/9 : WORKDIR /app
---> Running in c0fe7db4ae09
Removing intermediate container c0fe7db4ae09
---> a485f7fe20b5
Step 5/9 : RUN go build -o goweb .
---> Running in 379800b131e0
Removing intermediate container 379800b131e0
---> 050002765306
Step 6/9 : FROM scratch
--->
Step 7/9 : COPY --from=gobuilder /app/goweb /
---> 5a80b745b8dc
Step 8/9 : CMD ["/goweb"]
---> Running in d4cdebeac75b
Removing intermediate container d4cdebeac75b
---> 33c6c92562e8
Step 9/9 : EXPOSE 8080
---> Running in 6cb49869fab3
Removing intermediate container 6cb49869fab3
---> a00cef21aebd
Successfully built a00cef21aebd
Successfully tagged goweb:latest
✔️ Web App 이미지로 컨테이너 실행
vagrant@docker ~/golang/goweb docker run -d -p 80:8000 goweb
fb195e0138faad620d6ffb1da165eee82ce1b62e1ea24f3d0c4310502b400437
vagrant@docker ~/golang/goweb docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
fb195e0138fa goweb "/goweb" 3 seconds ago Up 2 seconds 8080/tcp, 0.0.0.0:80->8000/tcp, :::80->8000/tcp angry_driscoll
vagrant@docker ~/golang/goweb docker images | grep goweb
goweb latest a00cef21aebd About a minute ago 6.24MB
728x90
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker Hub 사용법 (0) | 2022.05.12 |
---|---|
[Docker] node.js App을 Docker Image로 빌드하기 (0) | 2022.05.12 |
[Docker] Golang App을 Docker Image로 빌드하기 (0) | 2022.05.12 |
[Docker] Django App을 Docker 이미지로 빌드하기 (0) | 2022.05.12 |
[Docker] Flask App을 Docker 이미지로 빌드하기 (0) | 2022.05.12 |
@TTOII :: 뭉게뭉게 클라우드
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!