sts -250rrã§ãã ä»å㯠ã©ã¯ã¹ Advent Calendar 2018 ã«æçš¿ããèšäºãã éçºç°å¢ãäœãããã«Dockerã䜿ã£ã話 ãã®ç¶ãã«ãªããŸãã qiita.com ã¯ããã« Dockerãããã¯ãŒã¯ãäœæããŠã³ã³ããééä¿¡ éçºç°å¢ïŒGoïŒã»PostgreSQLã³ã³ããã®èµ·å docker-compose.yml Dockerfile 1_createdb.sql main.go ä»åã®ãã€ã³ã Goã®ããã±ãŒãžã€ã³ããŒã PostgreSQLã³ã³ããã§åæDBæ§ç¯ãè¡ã å®ã¯ã»ã»ã» ãŸãšã ã¯ããã« ååã®èšäº ã§ã¯Dockerã§éçºç°å¢ãäœã£ãŠã¿ãŸããã ãããã®ãŸãŸã§ã¯ããŸãã«ãããŒããªæ§æã«æããŸãããã ä»å㯠ã³ã³ããééä¿¡ ã䜿ã£ãŠå¥ã³ã³ããã«äœæããDBã®ããŒã¿ãååŸã§ãããããªæ§æãäœã£ãŠããããšãç®æšãšããŸãã ç®æšãšãã圢ã¯ä»¥äžã®ãããªã€ã¡ãŒãžã§ãã Dockerãããã¯ãŒã¯ãäœæããŠã³ã³ããééä¿¡ ã³ã³ããééä¿¡ãå®çŸããããã«ãDockerãããã¯ãŒã¯ãäœæããŸãã Dockerãããã¯ãŒã¯ã¯ã³ã³ããåãæå®ããããšã§ã¢ããªçšïŒéçºç°å¢çšïŒã®ã³ã³ããããDBã³ã³ããã«æ¥ç¶ããããšãã§ããããã«ãªããŸãã ãŸãã¯Dockerãããã¯ãŒã¯ãäœã£ãŠãããŸãã $ docker network create my-network cbe89848f313a1b7766780903f79da2ff3a83bbe962f930c1f3caf9136fbac6f $ docker network ls NETWORK ID NAME DRIVER SCOPE 39d283374d44 bridge bridge local a3d0faef3da4 host host local cbe89848f313 my-network bridge local 7b1a7347c6b9 none null local 以äžã®ã³ãã³ãã§Dockerãããã¯ãŒã¯ã®è©³çްã確èªããããšãã§ããŸãã $ docker network inspect my-network [ { "Name": "my-network", "Id": "cbe89848f313a1b7766780903f79da2ff3a83bbe962f930c1f3caf9136fbac6f", "Created": "2018-12-09T02:41:41.8124636Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ] äœæãããŠã®Dockerãããã¯ãŒã¯ãªã®ã§äœãç»é²ãããŠããããContainerséšåã空ã£ãœã§ãã ã³ã³ããèµ·åæã«ãã®Dockerãããã¯ãŒã¯ãæå®ããããšã§ãåäžã®ãããã¯ãŒã¯ã«ã³ã³ãããäœæããããããã³ã³ããééä¿¡ãã§ããããã«ãªããŸãã â»çްããéšåã¯è©°ããããŠããŸããã éçºç°å¢ïŒGoïŒã» PostgreSQL ã³ã³ããã®èµ·å ã³ã³ãããèµ·åããŠãéçºç°å¢ã³ã³ããã®Goããã°ã©ã ãã PostgreSQL ã³ã³ããã®DBã«æ¥ç¶åºæ¥ããããªç°å¢æ§ç¯ãè¡ãªã£ãŠãããŸãã ä»åãdocker-composeãå©çšããŠããã®ã§ ãã£ã¬ã¯ã ãªæ§æã»ãã¡ã€ã«ã以äžã®ããã«äœæããŸãã <ä»»æã®ãã£ã¬ã¯ããª> |-- init | |-- 1_createdb.sql |-- Dockerfile |-- docker-compose.yml |-- main.go ä»åã main.go ãã PostgreSQL ã³ã³ããã®DBã«æ¥ç¶ããããã«åèšå®ãã¡ã€ã«ãDBã®åææ§ç¯ãå¿
èŠã«ãªããŸãã åãã¡ã€ã«ã¯ä»¥äžã®ããã«äœæããŸãã docker-compose.yml version: '3' services: postgres: image: postgres environment: POSTGRES_USER: postgres # user POSTGRES_PASSWORD: postgres # pass ports: - "5432:5432" volumes: - ./db:/docker-entrypoint-initdb.d networks: - my-network app: build: . ports: - "8080:8080" networks: - my-network volumes: test_db: external: false networks: my-network: external: true Dockerfile #ããŒã¹ã®Dockerã€ã¡ãŒãžãgolangã§æå® FROM golang:latest EXPOSE 5000 #ã¯ãŒã¯ãã£ã¬ã¯ããªãèšå®ãã WORKDIR /go #ãã¹ãã®ãã£ã¬ã¯ããªã/goé
äžã«ã³ã㌠ADD . /go #GOPATHã®èšå® ENV GOPATH $GOPATH:$HOME/go RUN go get github.com/jinzhu/gorm RUN go get github.com/lib/pq #main.goãå®è¡ CMD ["go", "run", "main.go"] 1_createdb. sql create database testdb; main.go main.goã¯ãã¡ããåèã«ãããŠããã ããŸããã å®è¡ãããšDBã«ç»é²ãããŠããIDãšååãåºåããŸãã https://qiita.com/rky_1011/items/9772d92b5fe8cb3b82b0 qiita.com package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/lib/pq" ) type User struct { ID int64 `gorm:"primary_key" json:"id"` Name string `json:"name"` } type Users []User func main() { db, err := gorm.Open("postgres", "host=172.24.0.3 user=postgres port=5432 password=postgres dbname=testdb sslmode=disable") if err != nil { panic(err) } defer db.Close() db.AutoMigrate(User{}) var user = User{Name: "testname"} db.NewRecord(user) db.Create(&user) db.Save(&user) var users = Users{} db.Find(&users) fmt.Println(users) } ããŠããã¡ã€ã«ãæã£ããã docker-compose build ã docker-compose up ãå®è¡ããã°ã main.go ã®å®è¡çµæãåŸãããŸãã (ç¥) postgres_1 | 2018-12-09 06:32:23.787 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" postgres_1 | 2018-12-09 06:32:23.829 UTC [58] LOG: database system was shut down at 2018-12-09 06:32:23 UTC postgres_1 | 2018-12-09 06:32:23.851 UTC [1] LOG: database system is ready to accept connections app_1 | [{1 testname}] app_app_1 exited with code 0 postgres_1 | ã app_1 | ãšãã£ã圢ã§ã³ã³ããããšã®åºåçµæãåŸãããŠããŸãã app_1 | [{1 testname}] ãšåºåãããŠããã®ã§ãªãã ããããŠãããªæ°ãããŸãã ããã ãã§ã¯ãã³ãšããªãã®ã§ PostgreSQL ã³ã³ããã«å
¥ã£ãŠDBã確èªããŠã¿ããšã $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f9a9ed9b3fc8 postgres "docker-entrypoint.sâŠ" 2 minutes ago Up 2 minutes 0.0.0.0:5432->5432/tcp app_postgres_1 $ docker exec -it app_postgres_1 bash root@f9a9ed9b3fc8:/# psql -U postgres testdb psql (11.1 (Debian 11.1-1.pgdg90+1)) Type "help" for help. testdb=# select * from users; id | name ----+---------- 1 | testname (1 rows) PostgreSQL ã³ã³ããã®å
容ãšéçºç°å¢ã³ã³ããã®main.goå®è¡æã®å
容ãäžèŽããã®ã§æ£ããå€ãååŸã§ããŠããããã§ãã æåŸã«Dockerãããã¯ãŒã¯ã®ç¶æ
ã確èªããŸãã docker network inspect my-network [ { "Name": "my-network", "Id": "e77a834d8aff49e316e7ab153666232eab35f7fe4350b18be19da1d608125c4b", "Created": "2018-12-09T06:25:02.1986525Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.24.0.0/16", "Gateway": "172.24.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "f9a9ed9b3fc8b67232edb76ec4202e0b66ec776dbd0665db7f9ee11341088571": { "Name": "app_postgres_1", "EndpointID": "6dfd276d55c4352668364de97a588ca5072bf5ee647b8b9dbe5cbdc04d8603f1", "MacAddress": "02:42:ac:18:00:03", "IPv4Address": "172.24.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] GoåŽã®ã³ã³ããã¯å®è¡å®äºãšåæã«åæ¢ããŠããŸãã®ã§ã Containers ã«ã¯è¡šç€ºãããŠããŸããããPostgresã³ã³ããã my-network å
ã«å«ãŸããŠããããšãããããŸãã è²ã
è€éã§ããããã³ã³ããééä¿¡ãã§ããéçºç°å¢ãç¡äºå®æã§ãã ä»åã®ãã€ã³ã Goã®ããã±ãŒãžã€ã³ããŒã ããŒã«ã«ã§Goãæžãæã«ãå¿
èŠãªããšã§ããã軜ãè©°ãŸããŸããã main.goã®äžã§ Github ããããã±ãŒãžãã€ã³ããŒãããŠããŸãããäºåã«GOPATHãèšå®ããããgo getã§Gitãªã¢ãŒ ããªããž ããªãããŠã³ããŒãããŠãããªããã°ãªããªãã£ãããã§ãã Dockerã³ã³ããã§ãããã¯åæ§ãªã®ã§Dockerfileäžã§ENVãRUNã§å¿
èŠãªäºååŠçãè¡ã£ãŠããŸãããè©°ãŸã£ãã®ã¯RUNã§go getãå®è¡ããéšåã§ãã ã¯ããã¯CMDã§å®è¡ããŠããŸããããmain.goå®è¡æã«ãããªããŸãã app_1 | main.go:6:4: cannot find package "github.com/jinzhu/gorm" in any of: app_1 | /usr/local/go/src/github.com/jinzhu/gorm (from $GOROOT) app_1 | /go/src/github.com/jinzhu/gorm (from $GOPATH) app_1 | /go/src/src/github.com/jinzhu/gorm app_1 | main.go:7:4: cannot find package "github.com/lib/pq" in any of: app_1 | /usr/local/go/src/github.com/lib/pq (from $GOROOT) app_1 | /go/src/github.com/lib/pq (from $GOPATH) app_1 | /go/src/src/github.com/lib/pq app_app_1 exited with code 1 ããã±ãŒãžèŠã€ãããªããããšããæšã®ãšã©ãŒã§ããã 調ã¹ãŠã¿ããRUNãšCMDã§ãããªéãããããŸããã qiita.com æ·±ããŸã§è¿œããŠããŸãããã€ã¡ãŒãžäœææã«å®è¡ããŠãããªããšmain.goã®å®è¡æã«ã¯DLãå®äºã§ããªããšããªãã§ããããïŒ PostgreSQL ã³ã³ããã§åæDBæ§ç¯ãè¡ã PostgreSQL ã³ã³ããããã äœãã®ã¿ã§ã¯ãã¡ããDBã®äœæã¯ããŠããªãã®ã§ãæ¥ç¶ã«å€±æããŸããããšãã£ãŠæ¯åã³ã³ãããèµ·åãããã³ã«æåã§äœæããã®ã¯Dockerã®å©ç¹ã朰ããŠããŸã£ãŠããŸãããã ãããªããšãããªããŠè¯ãããã«Dockerhubã®å
¬åŒã®ã€ã¡ãŒãžã«ã¯äŸ¿å©æ©èœããããŸããã If you would like to do additional initialization in an image derived from this one, add one or more . sql , . sql .gz, or *.sh scripts under /docker-entrypoint-initdb.d (creating the directory if necessary). /docker-entrypoint-initdb.d ãšãã ãã£ã¬ã¯ã ãªã« .sql ã .sh ã®ãã¡ã€ã«ãé
眮ããŠããã°èµ·åæã«å®è¡ããŠãããã¿ããã§ãã ãšããããšã§ã docker-compose.yml ã® volumes: ã§ init 以äžã® 1_createdb.sql ã docker-entrypoint-initdb.d ã«é
眮ãã createdb ãå®è¡ããŠããŸããã å®ã¯ã»ã»ã» å¿
èŠãªãã¡ã€ã«ãæãã°ãããç°¡åã«å®è¡ã§ãããã®ããã«æžããŠããŸããã1床ç®ã®å®è¡ã¯ ã»ãŒå¿
ã 倱æããŸãã ãšããã®ã1床ç®ã®å®è¡ã§ã¯Dockerãããã¯ãŒã¯äžã® PostgreSQL ã³ã³ããã«å²ãæ¯ãããIPãããããªãããã§ãããã main.goã®äžã§æ¥ç¶å
ã®DBã®ããIPãæå®ããŠããã®ã§ããã®éšåã§ã³ã±ãŸãã å€åäœãããããæ¹æ³ããããã ãšæããŸãããçŸæç¹ã§ã¯èŠã€ãããããã è¯ãæ¹æ³ãããã°æããŠããã ãããã§ãããã ãŸãšã ä»åã¯Dockerãããã¯ãŒã¯ã䜿ã£ãŠGoã¢ããªãšDBãæ¥ç¶ããŠã¿ãŸããã ã¢ããªã®ã³ã³ãããšDBãåããããšãã§ãããªãã ãããããããªã£ãŠãããããªæ°ãããŸãã Dockerãdocker-composeããããªã«ãã£ãŠãããåãäžæããããªãã£ãæã«ã¯ã©ãã«åé¡ãããã®ããèŠã€ããã®ã倧å€ã§ãã ãã®ååºæ¥äžãã£ãŠããŸãã°äœãçŽããè€è£œãç°¡åã«ã§ããŠããŸãã®ã§ã䟿å©ã§ããããšã«å€ããã¯ãªãã§ããã å人çã«ã¯ããå®ã¯ã»ã»ã»ãã§ãäŒãããéšåã¯ãªããšã解決ããããã®ã§ãããã ãšã³ãžã㢠äžéæ¡çš ãµã€ã ã©ã¯ ã¹ã§ã¯ããšã³ãžãã¢ã»ãã¶ã€ããŒã® äžéæ¡çš ãç©æ¥µçã«è¡ã£ãŠãããŸãïŒ ãèå³ãããŸãããæ¯éã確èªããé¡ãããŸãã https://career-recruit.rakus.co.jp/career_engineer/ ã«ãžã¥ã¢ã«é¢è«ãç³èŸŒã¿ãã©ãŒã ã©ã®è·çš®ã«å¿åããã°è¯ããããããªããšããæ¹ã¯ãã«ãžã¥ã¢ã«é¢è«ãéæè¡ã£ãŠãããŸãã 以äžãã©ãŒã ãããç³èŸŒã¿ãã ããã rakus.hubspotpagebuilder.com ã©ã¯ ã¹Developersç»é²ãã©ãŒã https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ ã€ãã³ãæ
å ± äŒç€Ÿã®é°å²æ°ãç¥ãããæ¹ã¯ãæ¯é±éå¬ããŠããã€ãã³ãã«ãåå ãã ããïŒ âTECH PLAY techplay.jp âconnpass rakus.connpass.com