目录
1.容器与镜像
1.1 如何编写一个镜像文件
FROM golang:1.12-alpine【表示镜像是基于golang进行构建的】
WORKDIR /go/src/app 【WORKDIR表示相应的构建步骤都是在对应目录下做的,WORKDIR和Linux下的cd很相似】
COPY . . 【表示将宿主机上的文件拷贝到镜像内】
RUN go get -d -v ./... 【执行获取所有的依赖的命令】
RUN go install -v ./... 【表示会首先go build,然后将产生的二进制文件移动到可检索的目录下(移动到/usr/bin目录下)】
【以上执行完就会得到一个golang的Application】
CMD ["app"]
【表示使用一个镜像之后默认的程序的名字是什么,这里取名为app】
当我们有一个dockerfile之后,就可以通过docker build这样一个简单的命令构建出我们需要的一个Application.
1.2 镜像如何运行在测试环境和生产环境上
但是这个构建是存储在本地的,一般情况下,镜像构建会在打包机或者其他隔离环境下完成的,那么镜像如何运行在
测试环境和生产环境上呢?
此时我们需要一个中转站,就是一个中心存储,我们将这个中心存储称为"Docker Registry",就是镜像仓库,它负责
我们所有产生的镜像数据,我们只需要docker push就能把本地的镜像推送到镜像仓库中,这样测试环境和生产环境
就可以从镜像仓库中获取数据并运行.
以上是构建镜像,下面介绍如何得到一个容器并运行呢?
编写 Dockerfile - app:v1
$ docker build . -t app:v1
docker registry - 镜像数据的存储和分发
$ docker push app:v1
2.如何运行容器?
如何运行容器?
(1) 从docker registry下载镜像,从远端的镜像仓库docker registry中下载镜像到本地,命令如:docker pull busybox:1.25;
(2) 下载完毕后会用docker image命令查看本地Cache中的镜像列表,会给出一个完整的列表,在这个列表中选中我们想要的镜像busybox:1.25;
(3) 选择相应的镜像之后就可以开始运行,命令是docker run [-d] --name demo busybox:1.25 top,分析一下docker run需要指定的内容:
-name demo是指定这个名字为demo,使用的容器的镜像是busybox:1.25,这个top的指令是要运行的程序名称.
镜像只是提供一个文件系统,我们需要指定的是这个容器所对应的进程到底是什么,这个示例中需要运行的程序是top.
我们可以通过docker run来运行我们放在容器中的程序,一个镜像像一个模板,一个容器是一个具体的运行实例,
镜像就具有一次构建到处运行的特点.
容器:和系统其他部分隔离开的进程集合,其他部分包括进程,网络资源,文件系统等.
镜像:容器所需要的所有文件集合,具备Build once,Run anywhere的特点.
2.容器生命周期
单进程模型
① Init 进程生命周期 = 容器生命周期
② 运行期间可运行 exec 执行运维操作
数据持久化
① 独立于容器的生命周期
② 数据卷 - docker volume vs bind
docker run [-d] --name demo busybox:1.25 top
在使用docker run的时候会选择一个镜像来提供独立的文件系统以及指定相应的运行程序,我们所指定的运行
程序被称为Initial进程,使用进程的时候,这个Initial进程启动的时候,容器也随之启动,当这个Initial进程
退出的时候,容器也随之退出,我们可以认为容器的生命周期和Initial进程是一致的,当然一个容器中一般不会只有
一个Initial进程,这个Initial进程本身可以产生其他子进程或者通过docker exe产生的运维操作也属于这个Initial进程
管理的范围,当Initial进程退出的时候,它所负责的所有子进程也随之退出,这样可以防止资源的泄露.
不过这样也会有问题,一个应用里的程序可能是有状态的,它可能产生了一些非常重要的数据,比如说Redis和Mysql,
当一个容器退出,被删除之后,数据也就丢失了,这对于应用方而言,这个是不能接受的,所有我们需要将容器产生的重要数据进行持久化.
容器可以将数据持久化到指定的目录,我们将这个目录称为数据卷,数据卷的特点:
数据卷的生命周期独立于容器的生命周期,容器的创建,运行,停止,删除都与数据卷没有关系,因为它是一个特殊的目录,是用来帮助容器进行持久化的.
我们该如何使用数据卷呢?
简单来说会将数据卷mount到容器内,这样容器就可以将数据写到相应的目录里面了,容器的退出不会导致数据的丢失.我们有两种方式,
(1)mount的方式,将宿主机上的目录直接mount到容器内,可以通过-v加参数的方式进行挂载,左边表示宿主机的目录,右边表示容器内的目录.
这样busybox:1.25可以将允许的时间写到/tmp目录下来,当这个命令执行完毕之后,我们可以看见宿主机上的目录和文件,这种方式比较简单
但是会有一定的运维成本,因为它依赖于宿主机的目录,我们需要对所有的宿主机进行统一的管理.
(2)与1类似,只是把对目录的管理交给容器的运行引擎了,也就是moby demo,首先用
docker create volume demo来创建一个数据卷,这个数据卷是由docker来管理的,也是采用一样的方式,不过命令的左边变成
卷的名字了,运行结果与上面的是一样的,我们发现数据卷是独立于容器的运行时存在的,它可以帮助我们快速地进行数据的持久化.
3.容器项目架构的介绍
moby容器管理引擎,目前最流行的管理引擎.
4.容器 VS VM