title | date | comments | categories | tags | permalink | |||
---|---|---|---|---|---|---|---|---|
docker十分钟上手
|
now
|
true
|
|
|
2.7
|
概述
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。这一点非常重要,有后台开发经验的应该都知道,配置各种依赖包真的非常烦人。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境配置问题了。
直观的感受,是可以把docker当做是一个特殊的虚拟机,跟我们常见的vmware、vitualbox很像,当然也有很大的不同,docker相比这些虚拟机非常的“轻”。主要是用来打包发布web应用的。
docker的优点
-
1、快速,一致地交付 Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
-
2、响应式部署和扩展 Docker 的可移植性和轻量级的特性,还可以帮我们轻松地完成动态管理的工作负担,并根据业务需求,实时扩展或删除应用程序和服务。
-
3、在同一硬件上运行更多工作负载 Docker 轻巧快速,为基于虚拟机管理程序的服务器提供了可行、经济、高效的替代方案,Docker 非常适合于高密度环境以及中小型部署,可以让我们用更少的资源做更多的事情。
重要概念
镜像:相当于我们在vmware中安装操作系统时候使用的.iso文件。相关常用命令run(run起来就是容器)。
容器:镜像运行起来就是容器,镜像相当于程序文件,容器是运行起来的程序(进程)。常用命令commit,创建新镜像。
仓库:存放打包好的镜像的服务器,可以直接拿来使用。常用相关操作指令 pull,push(和git一样)。
tar文件:镜像save之后就是tar文件,load一个tar文件就是镜像
DockerFile: 我们如何可以生成自己的镜像(image)文件?如果你要推广自己的软件,势必要自己制作 image 文件(方便别人安装使用)。这就需要用到 Dockerfile 文件。它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。
上手实例 docker hello world
用play with docker来玩一下,免得还要下载安装.国内速度很慢,最好科学上网,你懂得。
1、 先把镜像拉下来
docker image pull library/hello-world
也可以简省的写成
docker image pull hello-world
docker仓库默认是在library目录下,所以可以省略 看到pull complete字样,就代表拉取成功了
2、查看下载好的镜像文件
pull成功之后,镜像文件就保存在本机(这里我们用的在线的play-with-docker)了,通过下面命令查看镜像文件
docker image ls
运行结果如下图所示
3、运行镜像文件
docker container run hello-world
docker container run命令会从 image 文件,生成一个正在运行的容器实例。
注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。
如果运行成功,你会在屏幕上读到下面的输出。
$ docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
... ...
输出这段提示以后,hello world就会停止运行,容器自动终止。
有些容器不会自动终止,对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。
容器文件
image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
终止运行的容器文件,依然会占据硬盘空间,可以使用docker container rm命令删除。
$ docker container rm [containerID] 运行上面的命令之后,再使用docker container ls --all命令,就会发现被删除的容器文件已经消失了。
制作自己的image
以下步骤制作一个go语言的web服务 hello world 1、新建文件夹go-test,创建main.go,写入以下内容
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/hello", sayhelloName)
log.Fatal(http.ListenAndServe(":8081", nil))
}
func sayhelloName(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!") //输出到客户端的信息
}
2、创建Dockerfile,写入以下内容
#源镜像
FROM golang:latest
#设置工作目录
WORKDIR $GOPATH/src/github.com/go-test
#将服务器的go工程代码加入到docker容器中
ADD . $GOPATH/src/github.com/go-test
#go构建可执行文件
RUN go run .
#暴露端口
EXPOSE 8081
#最终运行docker的命令
ENTRYPOINT ["./go-test"]
3、创建镜像文件
使用如下命令
docker image build -t go-test .
上面代码中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,也就是当前路径,所以是一个点。
如果运行成功,就可以看到新生成的 image 文件go-test了。
4、启动容器
docker container run -p 8000:8081 -it go-test /bin/bash
上面命令的各个参数含义如下:
-p参数:容器的 3000 端口映射到本机的 8000 端口。
-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
go-test:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
5、启动web服务
go run main.go
如果一切正常,没有出错,就会看到如下界面
点击页面顶部的 8000端口,会打开一个新的页面,在新页面的url后面加上 "/hello",就能看到最终的结果了——如下图所示
至此,我们的第一个docker镜像成功运行起来。
特别提示 如上过程中,其实就是在容器内,构建了一个go开发环境 这种源镜像打包大概800M左右,比较大,一点也不像之前所说的docker容器非常———轻。
其实还有另外一种构建image的方法 alpine:latest 基础镜像 就是把Dockerfile第一句改成 "FROM alpine:latest" 使用此镜像大概过程就是,在linux机器,先把go程序打包成二进制文件,再丢到apine环境,执行编译好的文件。 默认情况下,Go的runtime环境变量CGO_ENABLED=1,即默认开始cgo,允许你在Go代码中调用C代码。通过设置CGO_ENABLED=0就禁用CGO了。所以需要执行:CGO_ENABLED=0 go build .即可。 此基础镜像打包只有13M,特别小。