Docker 是一个开源的商业容器产品,方便软件的统一生产环境和开发环境的安装部署,它有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。本文使用CE版
1.mac docker的安装
(1)下载mac docker客户端
https://hub.docker.com/editions/community/docker-ce-desktop-mac
下载安装后,通过如下命令测试是否安装成功
➜ ~ docker --version
Docker version 18.09.2, build 6247962
➜ ~ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
docker run hello-world会先从本地找hello-world的image文件,如果找不到就会到docker hub上pull下来
其他操作系统如Ubuntu的安装,请参考
https://docs.docker.com/install/linux/docker-ce/ubuntu/
2.image的查看和删除
image 文件可以看作是容器的模板。Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
(1)列出本机的所有image文件
docker image ls
(2)删除image文件
docker image rm [名称或id]
如果出现错误,无法删除,可以加上 -f 强制删除image
docker rmi -f b99
image 文件是通用的,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库
3.拉取远程image文件
docker image pull [image名称]
4.编写dockerfile文件
(1)新建main.go文件
package main
import (
"fmt"
"log"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
// Set a lower memory limit for multipart forms (default is 32 MiB)
// router.MaxMultipartMemory = 8 << 20 // 8 MiB
r.POST("/upload", func(c *gin.Context) {
// single file
file, _ := c.FormFile("file")
log.Println(file.Filename)
// Upload the file to specific dst.
c.SaveUploadedFile(file, "/go/src/app")
c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
})
r.Run(":8080") // listen and serve on 0.0.0.0:8080
}
(2)新建Dockerfile文件
在笔者的工作目录/Users/hufox/go/src/github.com/puma007/gindocker 下新建Dockerfile文件
FROM golang:1.11
ENV PATH=$PATH:$GOPATH/bin:$GOROOT/bin
RUN mkdir -p $GOPATH/src/golang.org/x/
WORKDIR $GOPATH/src/golang.org/x
RUN git clone https://github.com/golang/net.git
RUN git clone https://github.com/golang/sys.git
RUN git clone https://github.com/golang/tools.git
RUN git clone https://github.com/golang/text.git
RUN git clone https://github.com/golang/crypto.git
RUN go install ./...
RUN go get -u github.com/gin-gonic/gin
RUN echo $HOME
RUN echo $GOPATH
RUN mkdir /go/src/app
COPY . /go/src/app
WORKDIR /go/src/app
EXPOSE 8080
#RUN go run main.go 这个命令会挂起,导致无法生成image文件,应该用cmd
CMD go run main.go
(3)生成image文件
docker image build -t gindocker:1.0 .
上面代码中,-t
参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest
。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。
5.运行容器文件
docker run 命令会从 image 文件,生成一个正在运行的容器实例
例如docker run hello-world
docker container run --rm -p 8080:8080 -it -v /upload:/go/src/app -w /go/src/app 6c86
如果你的映射文件出错在macos系统下执行该命令会出错
docker: Error response from daemon: Mounts denied:
The path /upload
is not shared from OS X and is not known to Docker.
在网上查到如下解释
Docker for Mac volume mounts behave differently than the base Docker system. This is mostly because Docker tries to comply with Apple's filesystem sandbox guidelines.
mac系统只有/Users,/Volumes,/private,/tmp四个目录以及子目录可以挂载,打开docker for mac desktop-》perference-》file sharing 只有列出的目录及其子目录可以挂载,将命令修改为
docker container run --rm -p 8080:8080 -it -v /Users/hufox/go/src/github.com/puma007/gindocker:/go/src/app -w /go/src/app 6c86
docker run命令用于从一个image上启动一个容器
-it 标签以交互的方式启动容器;
--rm 标签在容器终止运行后自动删除容器文件;
--name gogin-instance 将容器命名为 gogin-instance;
-p 8080:8080 标签允许通过外部8080端口访问该容器的8080;
-v /Users/hufox/go/src/github.com/puma007/gindocker:/go/src/app 它将主机的/Users/hufox/go/src/github.com/puma007/gindocker映射到容器中的/go/src/app 。这将使得开发文件在容器的内部和外部都可以访问,并且在容器关闭后文件要会在主机保留,否则容器关闭后文件会丢失;
6c86 代表imageid,声明了用于容器的image;
-w 指定容器的工作目录为/go/src/app
如果要在容器启动进入shell命令行,加上 /bin/bash 例如
docker container run -p 8000:3000 -it image名称:tag /bin/bash
6.测试访问
在宿主机上我们可以通过
http://localhost:8080/ping
访问get请求
在命令下通过:
curl -F "[email protected]/Users/hufox/data/test.png" localhost:8080/upload
发送post请求
参考资料:
[1]https://docs.docker.com/docker-for-mac/
[2]https://docs.docker.com/install/linux/docker-ce/ubuntu/
[3]http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
[4]https://semaphoreci.com/community/tutorials/how-to-deploy-a-go-web-application-with-docker?spm=a2c4e.11153940.blogcont225570.22.73731da27kbD5S