zoukankan      html  css  js  c++  java
  • 使用DockerFile构建运行GoWeb

    安装docker

    # 安装一些必要的系统工具
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    # 添加软件源信息
    # docker 官方源
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
    # 阿里云源
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      
    # 安装前可以先更新 yum 缓存:
    sudo yum makecache fast
    
    # CentOS7安装 Docker-ce
    yum -y install docker-ce        # CentOS 中安装
    apt-get install docker-ce       # Ubuntu 中安装
    pacman -S docker                # Arch 中安装
    emerge --ask docker             # Gentoo 中安装
    
    # 如果想安装特定版本的Docker-ce版本,先列出repo中可用版本,然后选择安装
    yum list docker-ce --showduplicates |sort -r
    Loading mirror speeds from cached hostfile
    Loaded plugins: fastestmirror
    Installed Packages
    docker-ce.x86_64            3:19.03.4-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.4-3.el7                    @docker-ce-stable
    docker-ce.x86_64            3:19.03.3-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.2-3.el7                    docker-ce-stable
    docker-ce.x86_64            3:19.03.1-3.el7                    docker-ce-stable
    
    yum install docker-ce-<VERSION STRING>
    # 选择安装 docker-ce-18.06.1.ce
    yum install docker-ce-18.06.1.ce
    
    # Docker镜像加速
    # 没有启动/etc/docker目录不存在,需要自己创建,docker启动也会自己创建
    # 为了期望我们的镜像下载快一点,应该定义一个镜像加速器,加速器在国内
    mkdir /etc/docker
    vim /etc/docker/daemon.json
    {
    "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    
    # 启动Docker后台服务
    systemctl start docker && systemctl enable docker
    systemctl daemon-reload                 # 守护进程重启
    
    # 通过运行hello-world镜像,验证是否正确安装了docker,或者通过查看版本
    docker run hello-world
    docker version
    Client: Docker Engine - Community
    Version:           19.03.4
    API version:       1.40
    Go version:        go1.12.10
    Git commit:        9013bf583a
    Built:            Fri Oct 18 15:52:22 2019
    OS/Arch:           linux/amd64
    Experimental:      false
    
    下载golang的Docker镜像
    docker pull golang:alpine
    
    使用golang镜像
    [root@go-demo ~]# docker run -it golang bash
    root@d38b34f9c603:/go# go version
    go version go1.14.7 linux/amd64
    

    首先,如果我们把文件直接写在 Docker 容器里面的话,那么数据是无法持久化的。 即使可以使用 docker cp 命令这样的方式把我们的文件复制到容器内部, 或者把文件从容器中复制出来,但是在操作的时候仍会有很多不方便的地方。

    而且,在 golang 的镜像中进行 build 操作的时候,程序依赖的第三方包, 会被下载到容器的 /go 目录下面。如果每次容器都删除, 或者每次创建新的容器的时候,都需要从网络上拉取一次第三方包。 如果网速快的话还好,否则时间浪费的有点儿严重。

    所以,我们要把主机的目录映射到容器中,这样就可以把文件进行持久化了。

    我们可以使用 docker 命令的 -v 参数,把主机的目录映射到容器中。 不过只使用 -v 参数的话,在容器内部操作目录会有权限限制, 所以还需要增加 --privileged 参数给容器放权。

    [root@go-demo golang]# pwd  # 查看当前所在的目录
    /root/golang
    
    [root@go-demo golang]# ls -l
    total 8
    drwxr-xr-x 2 root root 4096 Aug  9 23:53 code
    drwxr-xr-x 2 root root 4096 Aug  9 23:53 go
      
      
    [root@go-demo golang]# docker run -it -v /root/golang/go:/go -v /root/golang/code:/code --privileged golang bash
    

    docker打包gin框架并运行

    编写程序代码
    [root@go-demo go]# cat main.go 
    package main
    
    import "github.com/gin-gonic/gin"
    
    func main() {
    	r := gin.Default()
    	r.GET("/ping", func(c *gin.Context) {
    		c.JSON(200, gin.H{
    			"message": "pong",
    		})
    	})
    	r.Run("0.0.0.0:8080") 
      // docker里面服务服务不能配置127.0.0.1,否则宿主机将无法访问
    }
    
    docker运行容器暴露端口
    [root@go-demo golang]# docker run -it -p 8080:8080 -v /root/golang/go:/go -v /root/golang/code:/code --privileged golang bash
    
    root@e0aeee18307f:/go# go get github.com/gin-gonic/gin
    root@e0aeee18307f:/go# go run main.go 
    [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.main.func1 (3 handlers)
    
    
    访问容器内暴露web应用
    [root@go-demo go]# curl localhost:8080/ping
    {"message":"pong"}
    
    // 查看日志
    [GIN-debug] Listening and serving HTTP on 0.0.0.0:8080
    
    [GIN] 2020/08/09 - 16:00:30 | 200 |      99.894µs |      172.17.0.1 | GET      "/ping"
    
    DockerFile构建docker镜像
    FROM golang:alpine
    MAINTAINER JiangHongJie "jhj767658181@gmail.com"
    # docker中的工作目录
    WORKDIR $GOPATH/src/gin_docker
    # 将当前目录同步到docker工作目录下,也可以只配置需要的目录和文件(配置目录、编译后的程序等)
    ADD . ./
    # 由于所周知的原因,某些包会出现下载超时。这里在docker里也使用go module的代理服务
    ENV GO111MODULE=on
    ENV GOPROXY="https://goproxy.io"
    # 指定编译完成后的文件名,可以不设置使用默认的,最后一步要执行该文件名
    RUN go build -o gin_docker .
    EXPOSE 8080
    # 这里跟编译完的文件名一致
    ENTRYPOINT  ["./gin_docker"]
    
    构建docker镜像
    sudo docker build -t gin_docker .
    
    启动容器
    docker run --name gin_docker -p 8080:8080 -d gin_docker
    
  • 相关阅读:
    androidimage: load large bitmap Efficiently
    display log information in terminal
    黑客人物介绍
    Linux 基础入门学习
    网络攻防 第四周学习总结
    网络攻防 第二周学习总结
    网络攻防 第三周学习总结
    SpringBoot入门Demo(Hello Word Boot)
    jquery的json对象与字符串之间转换
    Intellij IDEA导入web项目详解(解决访问的404)
  • 原文地址:https://www.cnblogs.com/you-men/p/13467271.html
Copyright © 2011-2022 走看看