Dockerã使ã£ã¦æ¬çªããªããã®Golangã®ç°å¢ãæ§ç¯ãã¦IntelliJã§éçºãã
ãã£ã¨å£ç¯ã¯ä¸å¯å温ã®ç¶æ
ããæããããæ¥ã ã¨è¨ã£ã¦ããå£ç¯ã§ãããåã¯çã«è¦ããã§ãã¦ãã£ã¨ã®æãã§å復ã«åãã£ã¦ããã¾ãã
æ¥ã£ã¦ç´ æµã
ã¨ããããã§ãæ¥åã§æ°ããããã¸ã§ã¯ããGolangã§å®è£
ããæ¹éã«ãªã£ã¦ãã¾ã£ãã®ã§ã仿¹ãªãGolangã®éçºç°å¢ãæ§ç¯ãã¾ãã
Scalaã©ãè¡ã£ãã
åèªèº«ã¯ã¬ã¬ã·ã¼ããã¸ã§ã¯ãã«é·ããã¨ããã®ã§ä»æ´ãªããDockerã¸ã®å
¥éã¬ãã«ã®æ
å ±ãæ¸ã並ã¹ã¤ã¤ç°å¢æ§ç¯ãã¦ããã¾ãã
æºå
- VirtualBoxã®ã¤ã³ã¹ãã¼ã«
- Vagrantã®ã¤ã³ã¹ãã¼ã«
ç°å¢
- Mac OSX 10.9.5 Mavericks
- Vagrant 1.7.2
ç®æ¨
Macã®IntelliJããGolangã®ã½ã¼ã¹ã³ã¼ããä¿®æ£ãã¦ãDockerã³ã³ããå
ã«åæ ããã
Macã®ãã©ã¦ã¶çµç±ã§ã¢ã¯ã»ã¹ãã¦ã¬ã¹ãã³ã¹ã確èªã§ããã
ä»®æ³OSãæºåãã¦Macã¨ãã¡ã¤ã«ã®åæãè¡ãã
ä»®æ³OSã¯CoreOSã使ãã¾ãã
Vagrantfileã¯
ããæåãã¾ãã
æåãããã²ã¨ã¤ç´°å·¥ãæ½ãã¾ãã
ã¨ããã®ããMacã¨(CoreOSã¨)Dockerã®ãã£ã¬ã¯ããªãå
±æããæ¹æ³ãããã¤ãããã®ã§ããã
MacããCoreOSãããã©ã«ãã§ã¯NFSã«ãªã£ã¦ããã
Macã®IntelliJã§ãã¡ã¤ã«ãä¿®æ£ããå ´åã«CoreOSã«ãã¡ã¤ã«ãåæãã¦ããã¾ããã
linux - Vagrant, shared folder: take advantage of inotify over NFS - Stack Overflow
ããã§åæã®æ¹æ³ãrsyncã«å¤æ´ãã¾ãã
#config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
ããæ¸ãã¦ããã®ã
config.vm.synced_folder ".", "/home/core/share", id: "core", type: "rsync"
ããã ä¿®æ£ãçµãã£ããä»®æ³OSãç«ã¡ä¸ãã¾ãããã
$ vagrant up
ç«ã¡ä¸ããã vagrant rsync-auto
ãå®è¡ããã°IntelliJã§ä¿®æ£ãããã¡ã¤ã«ãCoreOSã«åæããã¾ãã
vagrant ssh
ãã¦ç¢ºèªãã¦ã¿ã¦ãã ããã
rsyncã䏿ãåããªãæã¯ä¸ã®æ¹ã«æ¸ãã¦ãããæ³¨æãã®é
ãèªãã§ãã ããã
CoreOSã§Dockerã³ã³ãããç«ã¡ä¸ãã
ä¸è¨ã®CoreOSã«ã¯æ¢ã«Dockerãã¤ã³ã¹ãã¼ã«ããã¦ããã®ã§ãæ©éDockerãç«ã¡ä¸ãã¾ãããã
ä»åã¯ä»¥ä¸ã®ã¹ã¯ãªãããç¨æããã®ã§ããããå®è¡ãã¦ã¿ã¦ãã ããã
docker-golang/create_container.sh at master · takasing/docker-golang · GitHub
ã¾ãã¯Golangã³ã³ããã®èµ·å
core@core-01 ~ $ ./share/create_container.sh golang api
ãã®ã¹ã¯ãªããå
ã§å®è¡ããã¦ãã docker
ã³ãã³ãã®ãã£ãã解説ã¯ãããªæãã
å 容 | æå³ | åè |
---|---|---|
docker run |
æå®ããDockerã³ã³ãããç«ã¡ä¸ãã | |
--name |
ã³ã³ããã®ååãæå® ããããªãå ´åã¯ããã©ã«ãã§ãªãããã£ã¡ãããååãã¤ãã¦ãããã¾ã(^q^) |
|
-itd |
ã³ã³ããã®æ¨æºå ¥åãéãã¦tty(端æ«ããã¤ã¹)ã確ä¿ãããã | CoreOS docker のコマンド - わすれないうちにメモしよう |
-d |
ã³ã³ãããããã¯ã°ã©ã¦ã³ãã§å®è¡ ããããªãã¨ã³ã³ããããexitããã¨ã³ã³ãããã¨stopãã¦ãã¾ãã¾ã |
|
-p |
ãã¼ããã©ã¯ã¼ãã£ã³ã°ã®è¨å® ãã¹ãOS(CoreOS)ã®ãã¼ãã¨ã³ã³ããã®ãã¼ããæå®ãã |
|
-h |
ãã¹ãåãæå® | |
-v |
ãã¹ãOSã®ãã¡ã¤ã«ã·ã¹ãã ããã¦ã³ããã vã¯volumeã®æå³ã£ã½ã |
|
golang:1.4 |
èµ·åããã¤ã¡ã¼ã¸ãæå® ãã¼ã«ã«ã«ç¡ãã£ããpullãã¦ãã |
ã¨ããããã§å ã»ã©ã®ã³ãã³ããå®è¡ããã°Golangã®ã¤ã³ã¹ãã¼ã«ãããã³ã³ãããç«ã¡ä¸ããã¾ãã
core@core-01 ~ $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1eb71b579780 golang:1.4 "/bin/bash" 12 minutes ago Up 12 minutes 0.0.0.0:8080->8080/tcp api core@core-01 ~ $ docker exec -it api bash root@golang:/go# echo $GOPATH /go
golangã®ã³ã³ãããä½ãã£ã¦ããã¯Dockerfileãè¦ãã°ãããã¾ãã
Dockerfileãããã¯æ¬¡åããã°ã«æ¸ããããªã¨æã£ã¦ã¾ãã
Nginxã®ã³ã³ãããç«ã¡ä¸ãã
ããããã£ãç¨æããã¹ã¯ãªããã使ãã¾ãã
core@core-01 ~ $ ./share/create_container.sh nginx web
ã³ã³ããéã®éä¿¡ã«ã¯ --link
ã使ã
ãã®nginxã§ã¯ããªã¯ã¨ã¹ããåãåã£ããgolangã®ã³ã³ããã®8080ãã¼ãã¸ãããã·ãã¦ãã¾ãã
ã³ã³ããéã§éä¿¡ãè¡ãããã®æ©æ§ãDockerã¯ç¨æãã¦ãã¦ãããã --link
ã§ãã
--link hoge:fuga
ã¨æ¸ããã¨ã«ãã£ã¦ã
ãhogeã¨ããã³ã³ããã«fugaã¨ããã¨ã¤ãªã¢ã¹ã§ã¢ã¯ã»ã¹ãã§ãã¾ãã
ããã§ã¯apiã¨ãã®ã¾ã¾ã§ãã
ããã§å
ã»ã©ã®ãªãã¸ããªã«å«ã¾ãã¦ããnginxã®è¨å®ãã¡ã¤ã«ãè¦ã¦ã¿ã¾ãã
docker-golang/golang-app.conf at master · takasing/docker-golang · GitHub
--link
ãæå®ãããã¨ã«ãã£ã¦ãnginxã³ã³ããã®ä¸ããapiã¨ããã¨ã¤ãªã¢ã¹ã§ã³ã³ããã¸ã®éä¿¡ãã§ããããã«ãªã£ãã®ã§ãnginxã®è¨å®ãã¡ã¤ã«ã®ä¸ã§apiã¨ããã¨ã¤ãªã¢ã¹ã使ãã¾ãã
ããã§ã·ã³ãã«ã«ãããã·ãè¨å®ããã¾ãã
IntelliJå´ã®è¨å®
以ä¸ãåç §(ææã)ã
å¤é¨ããã±ã¼ã¸ãå©ç¨ããããã©ãåç §è§£æ±ºãã¦ãããªãã£ã¦æã¯
Go の開発環境は IntelliJ IDEA + golang plugin がマトモだった - Qiita
GAE - go getしたライブラリをIntelliJ IDEAの補完候補に追加するには - Qiita
ãã®ã¸ããåèã«ããã°è¯ãã
ã¡ãªã¿ã«IntelliJãéçºã§ä½¿ãããã«ã¯Macã®ãã¼ã«ã«ç°å¢ã«Golangãå
¥ããªããã°ãªããªãããã§ãã
Dokcerã®Golangã®ã©ã³ã¿ã¤ã åç
§ã§ãããããªãã®ããªãããªãã ãããªã
ãã©ã¦ã¶ããã¢ã¯ã»ã¹ï¼
ãã¨ã¯IntelliJã§ä½ã£ãããã¸ã§ã¯ãã®ãã£ã¬ã¯ããªã golang/go
ã«ã·ã³ããªãã¯ãªã³ã¯ãªã©ãããã¦èªåã®ãªãã¸ããªã¨ããGolangã®Dockerã³ã³ããã«å
±æãã¦å®è¡ãã¦ã¿ã¾ãããã
ä»åã¯é©å½ã«ginãã¬ã¼ã ã¯ã¼ã¯ã§GETã®ã¨ã³ããã¤ã³ããå¹¾ã¤ã試ãã«ä½ãã¾ãã
$ cat golang/go/src/hello/hello.go package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "hello world") }) router.GET("/ping", func(c *gin.Context) { c.String(http.StatusOK, "pong") }) router.GET("/pong", func(c *gin.Context) { c.String(http.StatusOK, "ping") }) router.Run(":8080") } root@golang:/go# go get root@golang:/go# go run hello.go
go get
ã§ã¯ããã±ã¼ã¸å
ã®*.goãã¡ã¤ã«ã®importæãè¦ã¦å¿
è¦ãªããã±ã¼ã¸ã®ã½ã¼ã¹ã³ã¼ãã$GOPATH/srcã«è½ã¨ãã¦ãã¾ãã
æ£å¸¸ã«ç«ã¡ä¸ãã£ãããã©ã¦ã¶ã§Vagrantã®CoreOSã®80ãã¼ãã«ã¢ã¯ã»ã¹ããã°pingã ã£ããpongãè¿ã£ã¦ããã¨æãã¾ãã
IntelliJã§ããã¸ã§ã¯ããä½ãã¨ãã¯
注æ
ããVPNæ¥ç¶ãªã©ã§ãCiscoã®AnyConnect使ã£ã¦ã人ã¯vagrantã¾ã§ã®routeãçããªãã£ããããããªã®ã§ãä¸åº¦åæãã¦ä»¥ä¸ã®ã³ãã³ããæã£ã¦ãã ããããã¡ããç°å¢ã«åããã¦ã
$ sudo route -nv add -net 172.17.8 -interface vboxnet0
-netã«æå®ããã¨ãã㯠vagrant ssh
ããå¾ã«
core@core-01 ~ $ cat /etc/systemd/network/50-vagrant1.network
ãªã©ã¨ã³ãã³ããå®è¡ãã¦ãããã¨CoreOSã¾ã§ã®IPããããã®ã§ããã®ãã©ã¤ãã¼ããããã¯ã¼ã¯ã¸ã®routeã追å ãã¦ããã°ããã§ãã
routeéã£ã¦ãã¦ããã¡ã£ã½ãæã¯ vagrant rsync-auto --poll
ã¨ãªãã·ã§ã³ãä»ãã¦ã¿ã¦ãã ããã
TODO
- dockerã³ãã³ãã®ç®æãDockerfileã«ãã
GOPATHã¨ãå¼ãããããã vagrant rsync-auto
ã§syncãããªãæãããã®ã§boot2dockerã«ããæ¹ãããæ°ããã¦ãããè¦æ¤è¨¼
ä¸å¿--poll
ãªãã·ã§ã³ãã¤ãããåããã§ããPCéããªãã£ã¦ããã- DBã®linkããã
ãã¹ã°ãããã - --linkãããªãã¦Unixãã¡ã¤ã³ã½ã±ããã§é£æºãã
Docker を利用した Web アプリケーションのデプロイ - クックパッド開発者ブログ - ä¾åé¢ä¿è§£æ±ºãã¼ã«å¨ãã¨ã¯ã¼ã¯ã¹ãã¼ã¹
ãªããå ¬å¼è¦è§£å«ãã¦ããã¾ã¤ã±ã¦ãªãæ°ãããã
godepã¨ãgomã¨ã使ã£ã¦ãçµå±ã«ã¬ã³ããã£ã¬ã¯ããªé ä¸ã«ãã£ã¬ã¯ããªä½ã£ã¦å ¥ããæãã«ãªã£ã¦ãã¦ãGOPATHãDockerfileã¨ãã§è¨å®ããã¨ãã¦ã$GOPATH/src
以ä¸ã«å ¥ãã¦ãããªããæå³ããã®ï¼ã¿ããã«ãªãã
ã¯ã¼ã¯ã¹ãã¼ã¹ã«ã¤ãã¦ã¯ããããã®ããããããã
Goコードの書き方 - The Go Programming Language
ãªããã¾ã ã¾ã æªéæã§ããã
誰ã詳ãã人ãããæãã¦ä¸ããã
ã¾ã¨ã
ã¨ããããå ¥éãã¦ã¿ã¦ãã£ã¨æ¸ãã¦ã¿ããã©ãã¾ã ã¾ã Dockerã¨ãGolangå¨ãã¯ãã¹ããã©ã¯ãã£ã¹å®ã¾ã£ã¦ãªãã£ããã¨ãè°è«ããã¦ããã¨ãããã®ã§æ©ã¾ãããã¨ããã£ã±ãã ã£ãã