Docker를 사용하여 PostgreSQL + Go의 개발 환경을 만들려고했습니다.

10320 단어 5PostgreSQL도커

소개



Go에서 PostgreSQL에 연결하는 부분을 잘 알지 못했기 때문에, 스스로 Docker 환경 만들어 시험해 보았다.

참고



여기를 많이 참고로 했다.
Go PostgreSQL에 연결하기 - Qiita
Docker로 만드는 postgres 환경 | Crudzoo

도커



점은 networks 부분을 동일하게 하고 있는 곳.

네트워크 준비


# docker network create postgres-test-network
# docker network ls
NETWORK ID          NAME                    DRIVER              SCOPE
xxxxxxxxxxxx        postgres-test-network   bridge              local

PostgreSQL



이런 느낌.POSTGRES_HOST_AUTH_METHOD: true 는 추천하지 않는다고 말했지만, 로컬의 시험 환경이기 때문에 무시했다.

Dockerfile
FROM postgres:11-alpine
ENV LANG ja_JP.utf8

docker-compose.yml
version: '3'
services:
  db:
    build: .
    tty: true
    ports:
      - 5434:5432
    environment:
      POSTGRES_USER: root
      POSTGRES_HOST_AUTH_METHOD: trust
networks:
  default:
    external:
      name: postgres-test-network

이것으로 시작
docker-compose up -d

5



Dockerfile
FROM golang:latest
RUN mkdir /go/src/work
WORKDIR /go/src/work
ADD . /go/src/work

docker-compose.yml
version: '3'
services:
  app:
    build: .
    tty: true
    volumes:
      - .:/go/src/work
networks:
  default:
    external:
      name: postgres-test-network


이것으로 시작
docker-compose up -d

액세스 부분



Go 쪽의 컨테이너 중에서는 이것을 실행한다.

여기를 거의 거의 copipe 시켜 주었다.
Go PostgreSQL에 연결하기 - Qiita

main.go
package main

import (
    "database/sql"
    "fmt"

    _ "github.com/lib/pq"
)

type EMPLOYEE struct {
    ID     string
    NUMBER string
}

func main() {
    db, err := sql.Open("postgres", "host=db port=5432 user=root sslmode=disable")
    defer db.Close()

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

    if _, err := db.Exec("CREATE TABLE employee (emp_id serial PRIMARY KEY, emp_number INTEGER);"); err != nil {
        fmt.Println(err)
    }

    // INSERT
    var empID string
    id := 4
    number := 4445
    err = db.QueryRow("INSERT INTO employee (emp_id, emp_number) VALUES($1,$2) RETURNING emp_id", id, number).Scan(&empID)

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

    fmt.Println(empID)

    // SELECT
    rows, err := db.Query("SELECT * FROM employee")

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

    var es []EMPLOYEE
    for rows.Next() {
        var e EMPLOYEE
        rows.Scan(&e.ID, &e.NUMBER)
        es = append(es, e)
    }
    fmt.Printf("%v", es)
}

lib/pq 가 들어 있지 않았기 때문에, go get 했다. 드라이버 같다.
go get github.com/lib/pq

여러가지 시험하고 있을 때, 네트워크 연결되지 않는다고 몇번인가 말해졌으므로, ping 해 확인했다.
Docker가 잘, DNS 서버 갓 compose 에 걸린 services의 이름으로 등록 해주는 것 같다.
# ping db
PING db (172.20.0.3) 56(84) bytes of data.
64 bytes from work2_postgres_db_1.postgres-test-network (172.20.0.3): icmp_seq=1 ttl=64 time=0.258 ms

이것으로. 실행했을 때, 그것처럼 움직였다.
go run main.go

Postico에서 확인



일단 DB의 내용도 GUI 툴로 확인했다. 좋은 느낌.
Postico – a modern PostgreSQL client for the Mac




결론



로컬로에 움직이는 환경 만들 수 있었기 때문에, 여러가지 시험해 보고 싶다.

좋은 웹페이지 즐겨찾기