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
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
$ 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
$ 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/

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

$ 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
-> ์ด๋ฏธ์ง์ด๋ฆ์ด ๋ฐ๋๋ ๊ฒ์ด ์๋๋ผ ๋ค์ ํ๊ทธ๊ฐ ๋ ์ถ๊ฐ ๋๋ ๊ฒ

Docker IaC
docker-compose -> docker compose
docker-compose.yaml ๋๋ docker-compose.yml
-> ํ์ผ๋ช
์ ์ ํด์ ธ ์์
docker-compose.yaml
version: '3' # 3๋ฒ์ ์์ ์ฌ์ฉํ ์ ์๋ ์ต์ ๋ฒ์ ์ฌ์ฉ
services: # ์ปจํ
์ด๋๋ฅผ ์๋น์ค๋ ๊ฐ๋
์ผ๋ก ์ฌ์ฉ
web: # ์ปจํ
์ด๋ ์ด๋ฆ
image: httpd # ์ด๋ฏธ์ง ์ง์
์คํ
$ docker compose up -d
ํ๋ก์ ํธ ๋ชฉ๋ก ํ์ธ
$ docker compose ls
์๋น์ค ๋ชฉ๋ก(์ปจํ ์ด๋)
$ docker compose ps
์ญ์
docker compose down
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
๋์ปค ์ปดํฌ์ฆ๋ก ๋ฐฐํฌํ ์ปจํ ์ด๋๋ ์๋ก ์ด๋ฆ์ผ๋ก ํต์ ๊ฐ๋ฅ
version: '3'
services:
myflask:
build: ./hello-flask
mydjango:
build: ./hello-django
cp -r ~/python/hello-django .
cp -r ~/python/hello-flask .