Docker 애플리케이션 운영(22.05.12)

박민선·2022년 5월 12일
0

Go

mkdir -p ~/golang/hello
cd ~/golang/hello
sudo apt install golang
go mod init hello

hello.go

package main

import "fmt"

func main() {
        fmt.Println("hello go world")
}
go run .
-OR-
go run hello.go
go build .
-OR-
go build -o hello hello.go

Dockerfile

FROM golang:1.18-buster AS gobuilder
COPY . /app
WORKDIR /app
RUN go build .

FROM scratch
COPY --from=gobuilder /app/hello /
CMD ["/hello"]
docker build -t gohello .
docker run gohello

Http Web

mkdir ~/golang/goweb
cd ~/golang/goweb
go mod init goweb

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))
}
go run .
curl 192.168.100.100:8080
curl 192.168.100.100:8080/encore
go build .

.dockerignore

goweb
Dockerfile
.dockerignore

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
docker build -t goweb .
docker run -d -p 80:8080 goweb

Gin

mkdir ~/golang/gogin
cd ~/golang/gogin
go mod init gogin

gogin.go

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
go mod tidy
cat go.sum

Dockerfile

FROM golang:1.18-buster AS gobuilder
ENV CGO_ENABLED 0
COPY . /app
WORKDIR /app
RUN go build -o gogin .

FROM scratch
COPY --from=gobuilder /app/gogin /
CMD ["/gogin"]
EXPOSE 8080
docker build -t gogin .
docker run -d -p 80:8080 gogin
curl 192.168.100.100/ping

Docker Compose

Docker IaC

docker-compose -> docker compose

docker-compose.yaml 또는 docker-compose.yml

예제1

docker-compose.yaml

version: '3'

services:
  web:
    image: httpd

실행

docker compose up -d

프로젝트 목록 확인

docker compose ls

서비스 목록(컨테이너)

docker compose ps

삭제

docker compose down

예제2

version: '3'

services:
  web:
    image: httpd
    restart: always
    ports:
      - 80:80
    environment:
      MSG: hello world
    volumes:
      - web-contents:/var/www/html
    networks:
      - web-net
  web2:
    image: nginx
    networks:
      - web-net

volumes:
  web-contents:

networks:
  web-net:
docker compose up -d
docker compose exec web bash

> apt update; apt install curl
> curl web2

도커 컴포즈로 배포한 컨테이너는 서로 이름으로 통신가능

예제3

version: '3'

services:

  myflask:
    build: ./hello-flask

  mydjango:
    build: ./hello-django
cp -r ~/python/hello-django .
cp -r ~/python/hello-flask .

쉘 변수

a.sh

#!/bin/sh

echo "\$MSG = $MSG"
echo "\$@ = $@"
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
MSG="Hello World" ./a.sh 1 2 3 4 5 6
  • $0: 명령어
  • $1: 첫번째 아규먼트
  • $2: 두번째 아규먼트
  • $@: 모든 아규먼트

Alpine Linux

Busybox + APK(패키지 관리자)

패키지 인덱스

apk update

패키지 검색

apk search <PKG>

패키지 추가

apk add <PKG>

패키지 제거

apk del <PKG>

명령 실행

&&

command1 && command2
  • command1이 실행되면 command2 실행
  • command1이 실패하면 command2 실행 X

||

command1 || command2
  • command1이 실행되면 command2 실행 X
  • command1이 실패하면 commans2 실행

profile
클라우드신생아

0개의 댓글