Docker实战系列文章,是自己在开发golang过程中对docker的业务应用的一个提炼和记录。关于docker详细原理的本系列文章将不会过多讲述,本系列着重在实际应用上,并在操作过程中会讲解部分难点。旨在让读者边看边操作,能在实现功能和解决问题中学会docker。
本人第一次写系列文章,如果讲解不正确和不清晰的地方欢迎指出。 – Razil
文章配套资源地址: https://github.com/DennisMao/docker
目标功能
- 使用go语言实现基本http服务
访问 localhost:8080 时能够返回 “hellodocker” - 将工程部署到docker,并在后台启动
环境介绍
docker:
golang:
host(宿主机环境):
Mac os 10.12
重点难点
- dockerfile结构
- docker网络结构
操作步骤
Go工程
1 在本机新建go工程,目录名为hellodocker
package main
import (
"fmt"
"net/http"
)
func indexHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello docker")
}
func main() {
http.HandleFunc("/", indexHandler)
http.ListenAndServe(":8080", nil)
}
2 编译和执行
3 打开浏览器输入 localhost:8080
当屏幕出现 “hellodocker”说明程序正常
制作docker镜像
1 在工程目录hellodocker下,新建dockerfile文件
FROM golang:latest
MAINTAINER Razil "raymond_2008@yahoo.com"
WORKDIR $GOPATH/src/hellodocker
ADD . $GOPATH/src/hellodocker
RUN go build .
EXPOSE 8080
ENTRYPOINT ["./hellodocker"]
FROM -> 母镜像
MAINTAINER -> 维护者信息
WORKDIR -> 工作目录
ADD -> 将文件复制到镜像中
RUN -> 执行操作(就跟在终端执行语句一样)
EXPOSE -> 暴露端口
ENTRYPOINT -> 程序入口
2 打开终端输入
docker build -t hellodocker .
语句的意思是
docker build ->构建镜像
hellodocker -> 名字为hellodocker
. (点号) -> dockerfile目录为当前目录
如果未使用镜像服务器,比如Daccloud,阿里云等,构建速度会需要较长时间
出现Successfully build …
说明构成成功。
3 查看docker镜像
在终端中输入
docker images
里面显示了本机所有docker的镜像与其基本信息
4 开启docker(前台方式)
在终端输入
docker run -p 8080:8080 hellodocker
语句意思:
docker run -> 运行docker镜像
-p 8080:8080 -> 将宿主机(也就是本机)的8080端口映射到容器的8080端口,此 处需要先确认本机的8080端口并未被占用,否则将无法开启
hellodocker -> 镜像名(也支持id)
5 开启docker(后台方式)
当在前台开启时候,终端无法进行其他操作,docker支持让容器在后台执行。
在终端输入
docker run -p 8080:8080 -d hellodocker
出现
说明开启成功。
我们可以查看本机当前后台正在开启的容器有哪些
在终端输入
docker ps
可以看到当前本机开启了 hellodocker和redis容器
6 停止docker
停止和退出docker有两种方法,一个是kill另一个是stop
两种的区别是
stop :系统先发送停止信号,有充分的时间(默认10s)完成清理后再发送kill信号让容器退出
kill : 系统直接发送退出信号,让容器强制退出
具体操作:
我们在上一步 docker ps 中看到后台容器的运行情况,里面每个容器都有其独立的container id。
复制需要关闭的容器id
当前hellodocker的id是
83f1e6dffbc2
在终端输入
docker stop 83f1e6dffbc2
或
docker kill 83f1e6dffbc2
即可
参考文章
1 getting-started-with-golang-on-docker
https://blog.tutum.co/2015/01/27/getting-started-with-golang-on-docker/
2 docker容器如何优雅的终止详解
http://www.jb51.net/article/96617.htm