[Cloud] Docker

MeltingOlafยท2022๋…„ 5์›” 12์ผ
0

[Cloud]

๋ชฉ๋ก ๋ณด๊ธฐ
11/25

โญ๏ธ Go

mkdir -p ~/golang/hello
cd ~/golang/hello

Golang ์„ค์น˜

sudo apt install golang
go mod init hello

hello.go

package main

import "fmt"

func main() {
        fmt.Println("hello go world")
}

์‹คํ–‰

  • ๋นŒ๋“œ ํ›„ ์‹คํ–‰ ๋จ
$ go run .  # go mod ํŒŒ์ผ ์žˆ์–ด์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
-OR-
$ go run ํŒŒ์ผ๋ช…
$ go build . # go mod ํŒŒ์ผ ์žˆ์–ด์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
-OR-
$ go build -o [์‹คํ–‰ํŒŒ์ผ๋ช…] [์†Œ์Šค์ฝ”๋“œ ํŒŒ์ผ๋ช…]

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

โญ๏ธ Node.js

$ mkdir ~/nodejs/web
$ cd ~/nodejs/web

app.js

const http = require('http');

const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
$ node app.js
Server running at http://0.0.0.0:3000/

์˜ˆ์ œ

https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

package.json

{
  "name": "docker_web_app",
  "version": "1.0.0",
  "description": "Node.js on Docker",
  "author": "First Last <first.last@example.com>",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.16.1"
  }
}

server.js

'use strict';

const express = require('express');

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

์‹คํ–‰

$ npm install

added 57 packages, and audited 58 packages in 7s

7 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 8.5.5 -> 8.10.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.10.0
npm notice Run npm install -g npm@8.10.0 to update!
npm notice
$ ls
node_modules  package-lock.json  package.json  server.js

nodejs๋Š” ํŒจํ‚ค์ง€๋ฅผ node_moduels์— ์ €์žฅ == ๋„์ปค ์ด๋ฏธ์ง€์— ๋„ฃ์œผ๋ฉด ์•ˆ๋จ
package-lock.json : ํŒจํ‚ค์ง€ ๋ชฉ๋ก == ๋„์ปค ์ด๋ฏธ์ง€์— ๋„ฃ์–ด์ฃผ์–ด์•ผํ•จ

.dockerignore

node_moduels/
Dockerfile
.dockerignore        

Docerfile

FROM node:16

WORKDIR /usr/src/app
COPY . .
RUN npm install # package-lock.jsonํŒŒ์ผ ๋ณด๊ณ  ํŒจํ‚ค์ง€ ์„ค์น˜
EXPOSE 8080
CMD [ "node", "server.js" ]
$ docker build -t mynode .
$ docker run -d -p 80:8080 mynode

โญ๏ธ Docer hub


$ docker login

๋กœ๊ทธ์ธ๋˜๋ฉด ./docker/config.json์— ์ธ์ฆ ์ •๋ณด ์ €์žฅ
image ๋นŒ๋“œ ์‹œ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ, ๋ฃจํŠธ ์—์„œ๋Š” ์ ˆ๋Œ€ ์•ˆ๋จ

$ docker push pyhello:v1
The push refers to repository [docker.io/library/pyhello]
7201388967b8: Preparing
673874d26a0c: Preparing
003d829fbdc9: Preparing
c624266426ab: Preparing
ca6c84023067: Preparing
8272ebc3fc9d: Waiting
74f08751ac3f: Waiting
58b24c6222e3: Waiting
7ae08394a32a: Waiting
f70b727d55c3: Waiting
denied: requested access to the resource is denied

-> ์ด๋ฏธ์ง€ ํ˜•์‹์ด ๋งž์ง€ ์•Š์•„์„œ denied ๊ฐ€ ๋œฌ๋‹ค

๊ธฐ์กด ์ด๋ฏธ์ง€์— ํƒœ๊ทธ ๋‹ฌ์•„์ฃผ๊ธฐ

$ docker tag ๊ธฐ์กด์ด๋ฏธ์ง€๋ช…:ํƒœ๊ทธ๋ช… ๋„์ปค๊ณ„์ •๋ช…/์ƒˆ๋กœ์šด์ด๋ฏธ์ง€๋ช…:ํƒœ๊ทธ๋ช…
$ docker tag pyhello:v1 ์‚ฌ์šฉ์ž๊ณ„์ •/pyhello:v1

-> ์ด๋ฏธ์ง€์ด๋ฆ„์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋’ค์— ํƒœ๊ทธ๊ฐ€ ๋” ์ถ”๊ฐ€ ๋˜๋Š” ๊ฒƒ

โญ๏ธ Docer Compose

Docker IaC

docker-compose -> docker compose

docker-compose.yaml ๋˜๋Š” docker-compose.yml
-> ํŒŒ์ผ๋ช…์€ ์ •ํ•ด์ ธ ์žˆ์Œ

์˜ˆ์ œ1

docker-compose.yaml

version: '3' # 3๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ

services: # ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„œ๋น„์Šค๋ž€ ๊ฐœ๋…์œผ๋กœ ์‚ฌ์šฉ
  web:    # ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„
    image: httpd  # ์ด๋ฏธ์ง€ ์ง€์ •

์‹คํ–‰

$ docker compose up -d

ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก ํ™•์ธ

$ docker compose ls

์„œ๋น„์Šค ๋ชฉ๋ก(์ปจํ…Œ์ด๋„ˆ)

$ docker compose ps

์‚ญ์ œ

docker compose down

์˜ˆ์ œ2

version: '3'

services:
  web:   # ์„œ๋น„์Šค 1
    image: httpd   # ์ด๋ฏธ์ง€
    restart: always  # ์žฌ์‹œ์ž‘ ์ •์ฑ…
    ports:
      - 80:80
    environment:    #ํ™˜๊ฒฝ๋ณ€์ˆ˜
    MSG: hello world 
    volumes:
      - web-contents:/var/www/  # ๋ณผ๋ฅจ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์‹คํ–‰
    networks:
      - web-net
  web2:     # ์„œ๋น„์Šค 2
    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 .
profile
How R U Today :)

0๊ฐœ์˜ ๋Œ“๊ธ€