DevOps/Docker

[Docker] Web App을 Docker Image로 빌드하기

TTOII 2022. 5. 12. 22:58
728x90

✔️ Web App

Golang의 net/http 패키지를 이용해 Web App을 만들어보자
Writing Web Applications - The Go Programming Language
net/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