【Docker】把 Go Web 应用部署到 Docker 容器

最近读了 (新加坡)郑兆雄写 Go Web 编程一书时,了解到可以把 Go Web 应用部署到 Docker 容器。

部署的方法是将应用 Docker 化(dockerized)为容器,然后将其部署到本地 Docker 服务器以及 DigitalOcean (云主机商家)的虚拟机上。

下面记录【如何将简单 Go Web 服务部署到本地 Docker 宿主机以及云端的 Docker 宿主机之上】的填坑之路。

1. 什么是 Docker

(一时半会没理解,觉得重要就摘抄下来了 ~~~ 暂时可跳过)

Docker 就是在容器中构建、发布和运行应用的一个开放平台。

容器并不是一项新技术——它在 Unix 初期就已经出现,Docker 最初基于 Linux 的容器就是在 2008 年引入的。

容器与虚拟机的不同之处在于,虚拟机虚拟的是包括操作系统在内的整个计算机系统,而容器只提供操作系统级别的虚拟化,并将计算机资源划分给多个独立的用户空间实例使用。这两种虚拟方式的差异导致容器对资源的需求比虚拟机要少得多,并且容器的启动速度和部署速度也比虚拟机快得多。

Docker 实质上就是一种管理容器的软件,它的存在使开发者可以更简单地使用容器。除 Docker 之外,市面上还存着 chroot、Linux containers(LXC)、Solaris Zones、CoreOS 和 Imctfy 等一系列同类软件,但 Docker 是其中名声最显赫的一款。

 2. 安装 Docker

访问 https://docs.docker.com/engine/install/ 

然后根据自己的系统以及想要使用的 Docker 版本,按照说明安装。

安装后,双击桌面的 Docker Desktop 后有弹窗出现

看懂了,这是第1个待解决的麻烦:需要更新 WSL 内核版本。

弹窗信息:

Docker Desktop - WSL kernel version too low
Docker Desktop requires a newer WSL kernel version.
Update the WSL kernel by running "wsl --update" or follow instructions at https://docs.microsoft.com/windows/wsl/wsl2-kernel.


弹窗信息翻译后:

Docker Desktop-WSL内核版本过低

Docker Desktop需要更新的WSL内核版本。

通过运行“WSL-Update”或按照https://docs.microsoft.com/windows/wsl/wsl2-kernel.


解决方式:

根据提示在 cmd 窗口中输入 wsl --update 命令更新 wsl 。

 此时出现了第2个麻烦:更新 WSL 内核版本时出现“灾难性故障”

解决方式:

又试了试弹窗中提示链接的方式 https://docs.microsoft.com/windows/wsl/wsl2-kernel

按照提示下载、按照、输入命令操作后,出现下面的信息,没看懂~~~

 然后试着双击桌面的 Docker Desktop ,刚才的弹窗不再出现,软件好像启动了。

3. Docker 的概念与组件

Docker 引擎(简称 Docker)包含多个组件。Docker 引擎由 Docker 客户端、Docker 守护进程以及不同的 Docker 容器组成,这些容器为 Docker 镜像的实例。Docker 镜像可以通过 Dockerfile 创建,并且镜像还能够存储在 Docker 注册中心(registy)中。

Docker 守护进程运行在宿主操作系统(host OS)之上,该进程会对客户端发送的服务请求进行应答,并对容器进行管理。

Docker 容器(简称容器)是对运行特定应用所需的全部程序(包括操作系统在内)的一种轻量级虚拟化。轻量级容器会让应用以及与之相关联的其他程序认为自己独占了整个操作系统以及所有硬件,但是实际上并非如此,多个应用共享同一宿主操作系统。

Docker 容器都基于 Docker 镜像构建,后者是辅助容器进行启动的只读模板,所有容器都需要通过镜像启动。有好几种不同的方法可以创建 Docker 镜像,其中一种就是在一个名为 Dockerfile 的文件里包含一系列指令。

Docker 镜像既可以以本地形式存储在运行着 Docker 守护进程的机器上(也就是 Docker 的宿主机之上),也可以被托管至名为 Docker 注册中心的 Docker 镜像资源库里面。用户既可以使用自己的私有 Docker 注册中心,也可以使用 Docker Hub (https://hub.docker.com/)作为自己的 registy。Docker Hub 同时提供公开和私有的 Docker 镜像,但私有的 Docker 镜像需要付费才能使用。

在 Window 系统上安装 Docker,那么 Docker 只会把客户端安装在操作系统里面,而守护进程则会被安装到其他地方,通常会是一个运行在该系统之上的虚拟机里面。

在此之后,用户只需要通过 Docker 镜像来运行 Docker 容器,并将其运行在 Docker 宿主之上就可以了。

在对 Docker 有了一个大体的了解之后,接下来是将 Web 应用部署到 Docker 容器。

4. Docker 化一个 Go Web 应用

Web 服务拥有对整个容器的完整访问权限,所以我们不需要对服务的代码做任何修改,只要使用 Docker 并进行相应的配置就可以了。

将一个 Web 应用 Docker 化并部署到本地以及云端的具体步骤:

部署到本地服务器

(1)创建 Dockerfile

(2)使用 Dockerfile 构建 Docker 镜像

(3)根据 Docker 镜像创建出 Docker 容器

部署到云端

(4)在云端创建 Docker 宿主

(5)连接远程 Docker 宿主

(6)在远程宿主中构建 Docker 镜像

(7)在远程宿主中启动 Docker 容器

如果使用 chitchat 作为 Web 服务的名字。 部署的第一步是在应用程序的根目录中创建一个 Dockerfile 文件。

简单 Web 服务的 Dockerfile 文件:


FROM golang    // 使用一个安装了 Go 并且将 GOPATH 设置为 /go 的 Debian 镜像作为容器的起点

ADD . /go/src/github.com/huangpengju/chitchat    // 把本地的包文件复制到容器的工作空间里面
WORKDIR /go/src/github.com/huangpengju/chitchat
RUN go get github.com/lib/pq    // 在容器内部构建 chitchat 命令
RUN go install github.com/huangpengju/chitchat

ENTRYPOINT /go/bin/chitchat    // 把 chitchat 命令设置为随容器启动

EXPOSE 8080    // 注明该服务监听的端口号为8080

这个 Dockerfile 文件的第一行告诉 Docker 使用 golang 镜像启动,这是一个安装了最新版 Go 并将工作空间设置为 /go 的 Debian 镜像。之后的两行会将当前目录中的本地代码复制到容器中,并设置相应的工作目录。在此之后,文件使用 RUN 命令指示 Docker 获取 PostgreSQL 驱动并构建 Web 服务的代码,然后将可执行的二进制文件放置到 /go/bin 目录中。在此之后,文件使用 ENTRYPOINT 命令指示 Docker 将 /go/bin/chitchat 设置为随容器启动。最后文件使用 EXPOSE 命令指示容器将 8080 端口暴露给其他容器。需要注意的是,这个EXPOSE 命令只会对同一宿主内的其他容器打开 8080 端口,但它并不会对外开放 8080 端口。

在编好 Dockerfile 文件之后,就可以使用以下命令来构建镜像了:

docker build -t chitchat .

这条命令将执行 Dockerfile 文件,并根据文件中的指示构建一个本地镜像。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值