什么是Docker
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
Docker通常用于如下场景
- web应用的自动化打包和发布
- 自动化测试和持续集成、发布
- 在服务型环境中部署和调整数据库或其他的后台应用
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境
golang为什么使用Docker作为容器
多数Go应用程序时简单的二进制文件。这就引发一个问题为什么使用Docker运行一个Go应用程序?一些使用Docker运行Go的理由包
括:
- Web应用程序通常都有模版和配置文件。
- Docker有助于保持这些文件与二进制文件的同步
- Docker确保了在开发或生产中完全相同的配置。
- 很多时候当应用程序可以在开发环境中正常工作时,在生产环境去无法正常工作。使用DOcker则把你从对这些问题的担心中解放了出来。在一个大型的团队中主机、操作系统及所安装的软件可能存在很大的不同。Docker提供了一种机制来确保一致的开发环境配置。这将提升团队的生产力并且在开发阶段减少冲突和可避免问题的发生。
安装Docker
我的电脑是Windows10,所以我在官网下载了windows版本的docker安装包,下载好了以后,一直安装就可以了。有其他需求的同学可参考windows下安装docker有更多的说明。
实战
- 创建一个项目为hellodocker
- 创建一个main.go(没什么特别)
package main
import (
"net/http"
"fmt"
)
func main() {
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
fmt.Fprint(writer,"hello docker")
})
http.ListenAndServe(":8080",nil)
}
- 在项目的根目录创建一个叫dockerfile的文件
# 得到最新的 golang docker 镜像
FROM golang:latest
# 在容器内部创建一个目录来存储我们的 web 应用,接着使它成为工作目录。
RUN mkdir -p /go/src/go-mgox
WORKDIR /go/src/GoMgo
# 复制 web-app 目录到容器中
COPY . /go/src/GoMgo
# 下载并安装第三方依赖到容器中
RUN go-wrapper download
RUN go-wrapper install
# 设置 PORT 环境变量
ENV PORT 8080
# 给主机暴露 8080 端口,这样外部网络可以访问你的应用
EXPOSE 8080
# 告诉 Docker 启动容器运行的命令
CMD ["go-wrapper", "run"]
- 构建镜像(这里可以使用镜像服务器,不然有点慢,但是我是没用上)
docker build -t go-mgox .
// . 是不能省略的
build的时候出现了Successfully build才表示成功
- 查看docker镜像
docker images
- 开启docker(前台方式)
在命令行输入
docker run -p 8080:8080 hellodocker
- docker run :运行docker镜像
- -p 8080:8080 :将宿主机(也就是本机)的8080端口映射到容器的8080端口,此处需要先确认本机的8080端口并未被占用,否则将无法开启
- hellodocker :镜像名(也支持id)
- 开启docker(后台方式)
docker run -p 8080:8080 -d hellodocker
说明开启成功,在浏览器中输入http://localhost:8080/,即可看到我们的返回内容
- 停止docker
停止和退出docker有两种方法,一个是kill另一个是stop
- stop :系统先发送停止信号,有充分的时间(默认10s)完成清理后再发送kill信号让容器退出
- kill : 系统直接发送退出信号,让容器强制退出
docker stop id
或
docker kill id
删除镜像
镜像删除是一个比较复杂的操作
- 查询镜像
docker images
现在想删除第一个,ID为 ad981e05699d 的镜像。
从上面看出,需要先停到ID为 e4ebfe6be8d8 的容器。
- 查询容器
docker ps -a
- 先删除容器
docker rm 容器id
- 删除镜像
docker rmi 镜像id
注意点:
- 删除前需要保证容器是停止的 stop
- 需要注意删除镜像和容器的命令不一样。 docker rmi ID ,其中 容器(rm) 和 镜像(rmi)
- 顺序需要先删除容器
尾声
本人也作为一个初学者,很多docker的只是还有待提高。