由于微服务的兴起,docker技术也变得火爆起来,docker作为一种容器技术主要用来替代虚拟机作为应用部署的解决方案。
容器与虚拟机对比三个基本概念
1.镜像
docker镜像是一个特殊的文件系统,能够提供容器运行时所需的资源。如果接触过dockerfile的同学应该知道,我们构建镜像时都会选择一个基础镜像(没接触过别担心下面会讲),这说明docker镜像是一层层进行构建的,一个镜像往往由多层文件系统组成。
2.容器
镜像是静态的,镜像运行起来的时候就变成了容器。容器相当于一个完整的操作系统,他可以有自己的文件系统,自己的网络配置。假如我们使用一个mysql容器进行存储数据,这时数据会存储在当前容器的存储层,存储层的生命周期和容器一样,容器消亡时,其存储层也不在了,所以我们在使用这种需要存储数据的容器时,往往都需要指定数据卷Volume(挂载一个宿主机的文件目录),这样即使容器删除,数据也不会消失。
3.仓库
顾名思义,docker仓库即为存储镜像的地方,我们可以将镜像上传至仓库,也可以从仓库下载镜像。这个比较简单,没什么好说的。
docker安装
这里说一下Mac下docker的安装。我们可以直接搜索Docker for Mac进行下载安装,但是下载的时候好像需要进行注册个账户啥的,需要翻墙。也可以直接使用homebrew进行安装,不过我没试过。安装好了之后就会出现该应用图标
然后我们直接打开终端就可以使用docker命令了。由于官方docker的仓库下载较慢,我们配置一个镜像加速。依次选中Perference》Daemon》Registry mirros,填写docker官方的中国加速地址“https://registry.docker-cn.com”即可。
基本操作
这里简单说一下一些比较基本的操作。
1.获取镜像:
如果我们不是用的私有仓库,中间的都可以不填,比如直接使用 docker pull nginx,则是直接从中央仓库拉取标签为latest的nginx镜像。
2.运行镜像:
调用以上命令即可运行之前pull的nginx镜像。我们访问http://localhost即可看到nginx已经启动成功。-d代表在后台运行而不把执行命令的结果输出在当前宿主机下,-p代表映射的宿主机与容器端口,name用于指定容器名。
运行后当我们想要进入容器的终端时,我们使用“docker exec -it 容器id bash”
3.查看镜像:
我们可以使用 docker image ls查看我们系统中的镜像。这里有个问题,ls命令的size列会列出镜像的大小,这里的size要比我们pull时显示的size要大的多,这是因为pull时的size显示的是压缩后的体积,ls的size显示的是展开后的大小。
如果我们使用ls后出现列名均为none的镜像,该镜像成为虚悬镜像,这是由于新旧镜像同名,导致旧镜像名称被取消,我们可以使用 docker image prune 删除虚悬镜像。
Dockerfile中几个重要命令
除了使用官方镜像外,我们也可以使用dockerfile来定制自己的镜像。
1.FROM:
该文件的第一句一定是FROM意为指定基础镜像,当我们不需要基础镜像时我们可以from于一个空白镜像“FROM scratch”(这种情况可能性几乎为0)。
2.RUN
run用来执行命令行命令的,类似于shell脚本。但是我们不要在文件中执行多个RUN,因为每个run都会建立一个新镜像,执行多个run意味着创建了多层无用镜像。
需要执行多个run命令的话要按照上图的格式进行编写,利用&&进行串联起来。图中的最后一行用于清理无关文件。
3.COPY
copy命令用于将上下文中的目录复制到镜像的指定目录中,格式如下
如果未指定相应权限的话,copy的时候源文件的各种权限都会保留。
4.ADD
该命令为COPY的升级版,最常用的功能是自动解压缩。有可能的话尽量使用COPY命令。
5.CMD
CMD与RUN类似,也有两种形式
该命令用于指定容器主进程的启动命令,docker不是虚拟机,容器相当于宿主机上的一个进程,那么在容器启动的时候需要指定所运行的程序以及参数。这里贴一个比较容易犯错的地方。
6.ENTRYPOINT
和CMD目的一样,用于指定容器启动程序与参数,我们一般在ENTRYPOINT指定需要运行的脚本文件。这个脚本会将接到的参数(即<CMD>)作为命令,在脚本最后执行。
7.ENV
用来设置环境变量,有俩种形式
设置完之后,后面的命令如RUN等可以使用该环境变量
8.VOLUME
该命令用于挂载数据卷,如"VOLUME /data",这样容器中向data写入的数据将会存储在主机中,容器删除后不会消失。所绑定的主机目录可以使用“docker inspect”命令查看
构建
编写完dockerfile之后,在dockerfile所在目录执行 “docker build -t 镜像名 .”,其中的“.”为上下文路径,当我们使用COPY /opt/xx/xx时是访问不到该文件的,我们需要将其拷贝到dockerfile所在目录中,即上下文目录。需要注意的是我们的dockerfile所在目录一般为空目录,因为docker会将其所在目录所有文件都打入镜像,会造成镜像臃肿。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。
网友评论