如何快速正确使用Docker部署Go Web App
2018-09-15 本文已影响87人
SpiffyEight77
index
Docker架构图
localhost:3000
目录
- 快速入门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