Golang 写一个Web,如何使用Docker部署

使用Docker来部署服务已经流行一段时间了,可以说Docker在服务中是无处不在,几乎每个开源应用都有自己的docker镜像。Golang与其他语言相比,有更多的优势,Golang编译后得到的二进制文件可以直接跑在Linux平台,无需Golang运行时支持,简介的语法,极佳的性能,并行计算等。还有广大社区的支持,以及一些成熟的项目,比如Docker,Consul。

1. Docker 安装启动
yum -y install docker-io
service docker start
chkconfig docker on

2. 编译项目
SET CGO_ENABLED=0
SET GOARCH=amd64
SET GOOS=linux
go build -o server main.go
这样编译的二进制文件server可以直接在linux上运行,当然我这次不是直接运行,而是用docker来部署。

3. 自制服务镜像Dockerfile
FROM scratch
COPY ./server /server
EXPOSE 80/tcp
VOLUME ["/public"]
ENTRYPOINT ["/server"]
将上面的命令保存到文件Dockerfile中,与第二步生成的server文件一起上传到你要部署的linux服务器,假定放到public目录下。挨个执行下列命令,将生成一个镜像,通常这个镜像非常的小,相比.Net core,动辄500M,它仅仅不到10M。
$ cd public
$ chmod 777 server
$ docker build -t iissy1.0 .
$ docker images


4. 启动2个容器
之所以启动两个容器,主要考虑到做负载均衡、无缝发布,这样可以不用停止服务,就能发布,对用户透明。
$ docker run --name iissy1 -v /docker/iissy/public:/public -d iissy1.0
$ docker run --name iissy2 -v /docker/iissy/public:/public -d iissy1.0
查看容器是否启动成功。
$ docker ps
基于同一个镜像做的两个容器,这里并没有发布端口,如果您希望在开发机可以访问,可以加上-p 80:80,我这里是用nginx来做负载均衡,nginx容器也是在同一台机器,所以就无需对容器外访问。如果您不想使用nginx,仅仅想测试下,那么可以直接执行server,它就启动了一个web服务。在浏览器输入ip即可以访问。

5. 安装部署nginx
$ docker pull nginx
$ docker images
获取第四部启动的容器的IP,以便将它配置到nginx的配置文件nginx.conf,这个文件可以自己去获取。
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' iissy1
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' iissy2
我本机的一份启动nginx容器的命令,用到了ssl证书,所以启用443端口,后面还有个html目录,这个是用来做cdn用的,存储一些静态资源,可以参考,取你自己需要的部分:
docker run --name nginx -p 80:80 -p 443:443 \
-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /docker/nginx/conf/www.asyons.com.conf:/etc/nginx/www.asyons.com.conf:ro \
-v /docker/nginx/conf/www.iissy.com.conf:/etc/nginx/www.iissy.com.conf:ro \
-v /docker/nginx/conf/asyons.com.conf:/etc/nginx/asyons.com.conf:ro \
-v /docker/nginx/conf/asyons.com.ssl.conf:/etc/nginx/asyons.com.ssl.conf:ro \
-v /docker/nginx/conf/iissy.com.conf:/etc/nginx/iissy.com.conf:ro \
-v /docker/nginx/conf/iissy.com.ssl.conf:/etc/nginx/iissy.com.ssl.conf:ro \
-v /docker/nginx/conf/cdn.iissy.com.conf:/etc/nginx/cdn.iissy.com.conf:ro \
-v /docker/nginx/conf/cdn.iissy.com.ssl.conf:/etc/nginx/cdn.iissy.com.ssl.conf:ro \
-v /docker/nginx/html:/etc/nginx/html:ro \
-v /docker/nginx/certs:/etc/nginx/certs -d nginx

6. 容器之间通讯
每个容器都有一个自己的IP,一个端口,它们之间的通讯靠的就是这个IP加端口,所以一旦我们在程序里面,或者nginx配置文件里面指定了IP、端口,就意味着我们要考虑容器的启动顺序。
$ docker stop mysql asyons1 asyons2 iissy1 iissy2 nginx
$ docker start mysql asyons1 asyons2 iissy1 iissy2 nginx
我服务器安装了以上5个容器,如果按照上面的启动顺序,它们的IP分别如下:
mysql - 192.168.0.2
asyons1 - 192.168.0.3
asyons2 - 192.168.0.4
iissy1 - 192.168.0.5
iissy2 - 192.168.0.6
nginx- 192.168.0.7

以下是常用的docker命令,分别是查看容器日志、停止容器、启动容器、删除容器、删除镜像、进入容器、查看容器IP
$ docker logs nginx
$ docker stop nginx
$ docker start nginx
$ docker rm -v nginx
$ docker rmi nginx
$ docker save microsoft/dotnet > dotnet.tar
$ docker load < dotnet.tar
$ docker exec -it nginx /bin/bash
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' nginx

总结:用docker部署Go写的服务,非常的简单,容器的体量也很少,并且性能卓越。爱施缘这个网站,就是用Go写的,您可以体验下响应速度。
Posted by 何敏 on 2017-08-18 15:07:50