内容简介:很久不看docker的东西了,之前了解的一些基本命令都忘得差不多了,适逢工作需要,再来复习巩固下。今天想完成的是:借助docker不部署下自己的服务。都说“巧妇难为无米之炊”,所以还是需要先准备下的。OS:Ubuntu 16.04, 2G内存
很久不看 docker 的东西了,之前了解的一些基本命令都忘得差不多了,适逢工作需要,再来复习巩固下。今天想完成的是:借助docker不部署下自己的服务。
环境准备
都说“巧妇难为无米之炊”,所以还是需要先准备下的。
OS:Ubuntu 16.04, 2G内存
docker:1.13.2
coding language: golang (gin web framework)
编码
将服务跑起来,是我们要完成的第一个步骤,而且是最重要的一个步骤。所以这一步需要仔细调试,为了方便,我就写的简单点。
- app.go
package main
import (
"os"
"log"
"github.com/gin-gonic/gin"
"net/http"
"time"
)
func GetHostName() string {
hostname, err := os.Hostname()
if err != nil {
log.Fatal(err)
}
return hostname
}
func GetCurrentTime() string {
timer := time.Now()
return timer.String()
}
func startGinApp() {
app := gin.Default()
app.GET("/ping", func(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "当前为您服务的主机为:" + GetHostName(),
})
})
app.GET("/", func(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "当前时间为:" + GetCurrentTime(),
})
})
app.Run(":8080")
}
func main() {
startGinApp()
}
- 把服务跑起来
go run app.go
- curl一下看看服务是否正确跑起来了
➜ gin curl http://localhost:8080
{"message":"当前时间为:2018-10-14 11:31:23.016121853 +0800 CST m=+0.254631109"}%
➜ gin curl http://localhost:8080/ping
{"message":"当前为您服务的主机为:BiaodeMacBook-Pro.local"}%
➜ gin
制作Makefile
经过刚才的测试,代码可以正确跑起来了。但是要做到“一次编码,到处运行”,还是需要在构建阶段下点心思的,为了更好的维护,借助Makefile来规范构建过程,是比较合适的方法。
- Makefile
# 这个是注释
# 开头可以声明一大堆变量名
BUILD_NAME ?= httpserver
COMPILER ?= go
BUILD ?= build
# 上方留一个空格,区分变量区和构建区
all: build test deploy clean
build:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(COMPILER) $(BUILD) -o $(BUILD_NAME)
test:
echo "test over."
deploy:
echo "deploy over."
clean:
echo "clean over."
.PHONY: build test deploy clean
- 构建服务
➜ gin ls
Makefile app.go
➜ gin make all
go build -o httpserver
echo "test over."
test over.
echo "deploy over."
deploy over.
echo "clean over."
clean over.
➜ gin ls
Makefile app.go httpserver
➜ gin ./httpserver &
[1] 6450
➜ gin [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ping --> main.startGinApp.func1 (3 handlers)
[GIN-debug] GET / --> main.startGinApp.func2 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
➜ gin curl http://localhost:8080/ping
[GIN] 2018/10/14 - 11:50:23 | 200 | 214.161µs | ::1 | GET /ping
{"message":"当前为您服务的主机为:BiaodeMacBook-Pro.local"}%
➜ gin
好了基本没什么问题,然后就可以通过scp命令将文件拷贝到 linux 服务器上了。
制作Dockerfile
由于golang构建出来的是二进制可执行程序,所以制作Dockerfile很简单。
- Dockerfile
FROM ubuntu:latest MAINTAINER guopu marksinoberg@gmail.com WORKDIR /app EXPOSE 8080 ADD . /app CMD ["./httpserver"]
- 构建自己的镜像
root@Server218 /h/d/g/d/httpserver# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ginserver latest 6277a0180f4f 19 hours ago 101 MB flaskindocker latest 170c6c0a41db 22 hours ago 131 MB python 2.7-slim 14dad3ead5f4 4 days ago 120 MB docker/compose 1.23.0-rc2 dc59a0b5e981 5 days ago 45.6 MB ubuntu latest cd6d8154f1e1 5 weeks ago 84.1 MB root@Server218 /h/d/g/d/httpserver# docker build -t httpserver . Sending build context to Docker daemon 17.07 MB Step 1/6 : FROM ubuntu:latest ---> cd6d8154f1e1 Step 2/6 : MAINTAINER guopu marksinoberg@gmail.com ---> Running in 7106748df3ad ---> 0ae808029537 Removing intermediate container 7106748df3ad Step 3/6 : WORKDIR /app ---> 7278bf9659e7 Removing intermediate container f7fdc76b19a8 Step 4/6 : EXPOSE 8080 ---> Running in bedfabcb4b16 ---> edf4c123f72f Removing intermediate container bedfabcb4b16 Step 5/6 : ADD . /app ---> 36390e554a2f Removing intermediate container b14cce9da53e Step 6/6 : CMD ./httpserver ---> Running in 6682c8364717 ---> b490fef8a9ca Removing intermediate container 6682c8364717 Successfully built b490fef8a9ca root@Server218 /h/d/g/d/httpserver# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpserver latest b490fef8a9ca 4 seconds ago 101 MB ginserver latest 6277a0180f4f 19 hours ago 101 MB flaskindocker latest 170c6c0a41db 22 hours ago 131 MB python 2.7-slim 14dad3ead5f4 4 days ago 120 MB docker/compose 1.23.0-rc2 dc59a0b5e981 5 days ago 45.6 MB ubuntu latest cd6d8154f1e1 5 weeks ago 84.1 MB root@Server218 /h/d/g/d/httpserver#
- 让服务在docker中跑起来
root@Server218 /h/d/g/d/httpserver# docker run -d -p 8000:8080 httpserver
ebb1926206cdaf16eae9f4e13d5a7e70dd695da91463b438f77e45c6f65d3323
root@Server218 /h/d/g/d/httpserver# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebb1926206cd httpserver "./httpserver" 4 seconds ago Up 3 seconds 0.0.0.0:8000->8080/tcp nostalgic_wright
root@Server218 /h/d/g/d/httpserver# curl http://localhost:8000/ping
{"message":"当前为您服务的主机为:ebb1926206cd"}~
root@Server218 /h/d/g/d/httpserver# curl http://localhost:8000/
{"message":"当前时间为:2018-10-14 04:14:29.116207751 +0000 UTC"}~ root@Server218 /h/d/g/d/httpserver#
至此,看起来服务已经成功在服务器环境下的docker中运行了。
弹性服务
一个容器跑一个服务,有些服务访问峰差很大的场景,就需要做下弹性适配,于是需要用一下docker swarm服务。这个在linux环境下需要进行安装。具体可以参考官网链接: https://github.com/docker/compose/releases
其运行以来一个YAML配置文件,具体细节不多说,上手吧。
- docker-compose.yml
version: "3"
services:
web:
image: httpserver:latest
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-faliure
ports:
- "8000:8080"
networks:
- webnet
networks:
webnet:
- 初始化swarm
root@Server218 /h/d/g/d/httpserver# docker swarm init
Swarm initialized: current node (atiuy6c8k1qcig5w3br1bwf0n) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-5e0sj0glbwl5w5rqytyqokeg91n7piwdyw9ik598x0poiz5s20-do445zhrdr5io93lplov42c2y \
172.31.237.68:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
root@Server218 /h/d/g/d/httpserver#
- 发布服务到swarm中
root@Server218 /h/d/g/d/httpserver# docker stack deploy -c docker-compose.yml httpserver
Creating service httpserver_web
root@Server218 /h/d/g/d/httpserver#
root@Server218 /h/d/g/d/httpserver#
root@Server218 /h/d/g/d/httpserver#
root@Server218 /h/d/g/d/httpserver# docker stack ps httpserver
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kvpvwptlj44c httpserver_web.1 httpserver:latest Server218 Running Running 14 seconds ago
6549g79dz5iz httpserver_web.2 httpserver:latest Server218 Running Running 14 seconds ago
xkz42mnetmws httpserver_web.3 httpserver:latest Server218 Running Running 14 seconds ago
rpziwzmpogn2 httpserver_web.4 httpserver:latest Server218 Running Running 14 seconds ago
y2kfe8bp09ld httpserver_web.5 httpserver:latest Server218 Running Running 6 seconds ago
root@Server218 /h/d/g/d/httpserver# curl http://localhost:8000/ping
{"message":"当前为您服务的主机为:a5419e3d3f9c"}~
root@Server218 /h/d/g/d/httpserver# curl http://localhost:8000/ping
{"message":"当前为您服务的主机为:f636819bd9c4"}~
root@Server218 /h/d/g/d/httpserver# curl http://localhost:8000/ping
{"message":"当前为您服务的主机为:97a6e3c9a064"}~
root@Server218 /h/d/g/d/httpserver# curl http://localhost:8000/ping
{"message":"当前为您服务的主机为:7f1b28e14970"}~
root@Server218 /h/d/g/d/httpserver# curl http://localhost:8000/ping
{"message":"当前为您服务的主机为:0ce251661188"}~
root@Server218 /h/d/g/d/httpserver# curl http://localhost:8000/ping
{"message":"当前为您服务的主机为:a5419e3d3f9c"}~
root@Server218 /h/d/g/d/httpserver#
-
实例弹性变化
具体的操作只需要修改
docker-compose.yml中的replicas的数量即可。然后重新使用:
docker stack deploy -c docker-compose.yml httpserver
发布就可以了,可以看出swarm管理下的实例会进行自动的负载均衡。
- 关停服务
root@Server218 /h/d/g/d/httpserver# docker stack ls NAME SERVICES httpserver 1 root@Server218 /h/d/g/d/httpserver# docker stack rm httpserver Removing service httpserver_web Removing network httpserver_webnet root@Server218 /h/d/g/d/httpserver# docker stack ls NAME SERVICES root@Server218 /h/d/g/d/httpserver#
- 关掉swarm
root@Server218 /h/d/g/d/httpserver# docker swarm leave --force Node left the swarm. root@Server218 /h/d/g/d/httpserver#
总结
最后,回头看看这个目录。
root@Server218 /h/d/g/d/httpserver# ls -al total 16688 drwxr-xr-x 2 root root 4096 Oct 14 12:20 ./ drwxr-xr-x 5 root root 4096 Oct 14 12:00 ../ -rw-r--r-- 1 root root 121 Oct 14 12:11 Dockerfile -rw-r--r-- 1 root root 362 Oct 14 12:01 Makefile -rw-r--r-- 1 root root 682 Oct 14 12:01 app.go -rw-r--r-- 1 root root 385 Oct 14 12:27 docker-compose.yml -rwxr-xr-x 1 root root 17063672 Oct 14 12:03 httpserver* root@Server218 /h/d/g/d/httpserver#
基本上,在docker中弹性部署自己的服务就结束了,基本上也能满足需要。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beginning Google Maps API 3
Gabriel Svennerberg / Apress / 2010-07-27 / $39.99
This book is about the next generation of the Google Maps API. It will provide the reader with the skills and knowledge necessary to incorporate Google Maps v3 on web pages in both desktop and mobile ......一起来看看 《Beginning Google Maps API 3》 这本书的介绍吧!