容器现在应用的越来越多了,不懂这个都不好意思说自己是个程序员了。这篇文章就给大家带来一个简单易懂的Docker入门。
容器和虚拟机
大家可能用过虚拟机,Vmware之类的,感觉和容器差不多,都是“虚拟化一台机器”。那我们先解释下,Docker和虚拟机有啥区别,先上图:
虚拟机在被创建的时候,宿主机会模拟出一台真实机器所需要的所有资源,包括硬件。一旦开启,预分配给它的资源会被完全占用。每一台虚拟机都拥有一套完整的独立的用户操作系统。
容器就不一样了,它不是模拟一个完整的操作系统,而是对进程进行隔离。容器包含了应用和它所有的依赖包,可以让资源在受到隔离的进程中运行应用程序。容器和容器之间是共享内核的。
其实从上面的说明就可以看出来了,容器比虚拟机需要的资源更少,带来的优势包括更快的启动,同样硬件条件下能运行的实例数量远高于虚拟机等等。而Docker则是对容器技术进行的一种封装,它是目前最流行的容器解决方案。
Docker的一些概念
镜像(Image)
镜像是Docker容器的模板。它看起来像一个文件系统,提供了容器运行的时候所需要的程序、库、配置、环境变量等。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container)
容器是可以独立运行的一个或一组应用。
仓库(Repositry)
仓库是存放镜像文件的地方,概念类似Git。而仓库注册服务器(Registry)可以理解为代码仓库(Github)。
简单的说,我们把应用还有需要的环境配置等,“打包”成一个镜像,这个镜像就存在于本地的仓库中。需要运行应用的时候,将容器指定到对应的镜像去运行就可以了。 DockerHub上有不少基础镜像,都可以直接拿来用。
从零开始的Docker部署
Dockerfile
如果想从0开始构建自己的镜像,我们就需要自己编写Dockerfile了,下面贴了一个例子。
FROM golang:latest
WORKDIR $GOPATH/go-app
COPY . $GOPATH/go-app
RUN go build .
EXPOSE 8000
ENTRYPOINT ["./go-app"]
下面说说这几行都干了啥:
- FROM 指定了基础镜像,这是必须要有的指令,而且是第一条。
- WORKDIR <工作目录> 指定了工作目录。若目录不存在,会自动创建。
- COPY <源路径> <目标路径> 将构建上下文目录中的源路径里面的文件,复制到镜像的目标路径的位置。
- RUN 执行命令
- EXPOSE 声明运行时容器提供的服务端口。(只是一个声明,运行的时候不会开这个端口)
- ENTRYPOINT 指定容器启动程序和参数
构建镜像
有了这些命令,接下来我们就能通过docker build命令构建自己的镜像了。
"-t" 指定了镜像的名称 "." 表示当前构建的目录。现在我们可以通过docker images命令,查看已经构建完成的镜像。
运行容器
有了镜像,我们现在就可以用来运行容器了。
"-p port1:port2" 指定了端口映射,port1是宿主机,port2是容器端口。"go-app"是我们创建的镜像名称。
这个例子就完了,So easy~
综上
以上只是一个简单的入门,后续会带来更多Docker实战内容。