美文网首页Linux我用 LinuxMac优雅使用指南
如何快速正确使用Docker部署Go Web App

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

作者: SpiffyEight77 | 来源:发表于2018-09-15 20:11 被阅读87次
    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部署Go Web App

        本文链接:https://www.haomeiwen.com/subject/rkjziftx.html