如何快速正确使用Docker部署Go Web App

96
SpiffyEight77
2018.09.15 20:11* 字数 495
index

目录

  • 快速入门Docker使用
  • 编写 Go Web App
  • 编写 Dockerfile 把App打包进镜像
  • 运行容器

Docker概述

什么是Docker?Docker是码头工人的意思,在这里可以理解为软件容器平台,Docker容器类似于虚拟机,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用。
什么是Docker容器?Docker容器虚拟化是指操作系统而不是硬件,容器之间共享同一套操作系统资源,但是相比于虚拟机,容器的隔离级别会稍微低一些。


Docker架构图

Docker CE 安装

Docker常用命令

#查找Docker Hub上的镜像
$ docker search imageName/ID

#获取Docker Hub上的镜像
$ docker pull ImageName/ID

#显示本地主机上的镜像列表
$ docker images 

#运行本地主机上的镜像
$ docker run ImageName/ID

#列出正在运行的容器
$ docker ps 

#查看正在运行容器的网络端口映射情况
$ docker port ContainerID 

#查看正在运行容器的内部正在进程运行
$ docker top ContainerID 

#查看正在运行容器的内部底层信息
$ docker inspect ContainerID 

#停止正在运行容器
$ docker stop ContainerID/ 

#重启已经停止的容器
$ docker start ContainerID 

#删除不需要的容器(必须在容器已经停止的情况下)
$ docker rm ContainerimageID

#移除本地镜像,移除前需要把该镜像下所有的容器删除
$ docker rmi ImageName/ID

#登录docker
$ docker login

#运行ubuntu:16.04镜像并创建容器和启动bash终端
$ docker run -t -i ubuntu:16.04 /bin/bash 

#重命名容器名
$ docker rename wonderful_kepler Ubuntu16.04 

#构建镜像
$ docker commit -m="has update" -a="SpiffyEight77" ff5d623e2d61 spiffyeight77/ubuntu:16.04

#提交镜像到docker hub 需要登录
$ docker push spiffyeight77/ubuntu 

部分参数说明

-d: 守护模式 后台运行
-p: 是容器内部端口绑定到指定的主机端口
-P: 是容器内部端口随机映射到主机的高端口
-f : 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出
-l : 查询最后一次创建的容器
-t : 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-i : 则让容器的标准输入保持打开
-m:提交的描述信息
-a: 指定镜像作者
--rm: 停止容器后移除容器
ff5d623e2d61: 容器ID
spiffyeight77/ubuntu:16.04: 指定要创建的目标镜像名

编写一个简单的Go Web App

如果不知道如何配置Go运行环境的话可以参考这里

package main

import (
    "net/http"
    "fmt"
    "log"
)

func main() {
    http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
        fmt.Fprint(writer, "Hello World")
    })
    log.Fatal(http.ListenAndServe(":3000",nil))
}

Go Build 注意事项

编译应用的时候记得带上参数,否则的话下文使用的alpine镜像在部署时动态编译Go会出现Bug
CGO_ENABLED=0 go build -o main

编写Dockerfile

不会写Dockerfile的话请自行Google

FROM alpine:latest #使用了镜像大小体积只有5MB的alpine镜像

WORKDIR / #设置工作路径

ADD main / #把上文编译好的main文件添加到镜像里

EXPOSE 3000 #暴露容器内部端口

ENTRYPOINT ["./main"] #入口

构建镜像

docker build -t main:v1 .

Sending build context to Docker daemon  6.576MB
Step 1/5 : FROM alpine:latest
 ---> 11cd0b38bc3c
Step 2/5 : WORKDIR /
 ---> Running in f87408e1724d
Removing intermediate container f87408e1724d
 ---> 335c50f34490
Step 3/5 : ADD main /
 ---> 9b9ae9e73cdf
Step 4/5 : EXPOSE 3000
 ---> Running in e28604a8d906
Removing intermediate container e28604a8d906
 ---> 524119daa0ff
Step 5/5 : ENTRYPOINT ["./main"]
 ---> Running in 0bedccb7785b
Removing intermediate container 0bedccb7785b
 ---> 59fe986c210e
Successfully built 59fe986c210e
Successfully tagged demo:latest

-t: 参数为指定镜像标签名

运行容器

docker run --rm -it -d -p 3000:3000 main

本机打开localhost:3000 端口进行访问


localhost:3000
Docker
Web note ad 1