Post

DockerFile로 이미지 만들기

DockerFile로 이미지 만들기

Docker image(with. Go)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//Server
package main

import (
	"fmt"
	"net"
)

func requestHandler(c net.Conn) {
	data := make([]byte, 4096)  //주고 받을 데이터는 슬라이스로 선언

	for {                       //무한 반복 
		n, err := c.Read(data)  //받은 데이터 읽기
		if err != nil {
			fmt.Println(err)
			return
		}

		fmt.Println(string(data[:n])) // 받은 데이터 출력

		c.Write(data[:n])    //받은 데이터 리턴

		if err != nil {
			fmt.Println(err)
			return
		}
	}
}

func main() {
	ln, err := net.Listen("tcp", ":3000")   //3000port 대기

	if err != nil {
		fmt.Println(err)
		return

	}

	defer ln.Close()                        //main 함수 종료 시 호출 되어 대기 멈춤

	for {
		conn, err := ln.Accept()            // port에 신호가 들어오면 전달

		if err != nil {
			fmt.Println(err)
			continue
		}

		defer conn.Close()

		go requestHandler(conn)             // go routin으로 실행
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//Client
package main

import (
	"fmt"
	"net"
	"strconv"
	"time"
)

func main() {
	client, err := net.Dial("tcp", "127.0.0.1:3000")

	if err != nil {
		fmt.Println(err)
		return

	}
	defer client.Close()

	go func(c net.Conn) {
		data := make([]byte, 4096)

		for {
			n, err := c.Read(data)
			if err != nil {
				fmt.Println(err)
				return

			}
			fmt.Println(string(data[:n]))

			time.Sleep(1 * time.Second)
		}

	}(client)

	go func(c net.Conn) {
		i := 0
		for {
			s := strconv.Itoa(i)

			c.Write([]byte(s))
			if err != nil {
				fmt.Println(err)
				return
			}

			i++
			time.Sleep(1 * time.Second)
		}
	}(client)

	fmt.Scanln()
}

코드는 localhost에서 3000port를 열고 통신을 하는 코드다. 이중에 서버쪽 코드를 Dockerfile로 이미지를 만들고 컨테이너를 실행시켜보았다.

1. DockerFile 준비

1
2
3
4
5
6
7
8
9
10
11
12
13
# 빌드 단계
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

# 실행 단계
FROM scratch
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 3000
CMD ["./main"]

2. docker build

1
$ docker build . -t goserver

이렇게 하면 goserver라는 docker image가 생성된다. 이제 컨테이너로 실해시키자.

3. Container run

1
$ docker run --name testserver --rm -p 3000:3000 goserver

–name 은 컨테이너의 이름을 설정, –rm은 컨테이너가 종료될 시 컨테이너를 삭제한다는 선언, -p 3000:3000 호스트에서 3000번대로 접근하고 컨테이너 내부적으로도 3000번대를 연결시킨다.

4. 신호 날려보기

이제 클라이언트 코드를 실행시켜 통신이 되는지 확인해보자.

This post is licensed under CC BY 4.0 by the author.