Docker是一个开源的应用容器引擎,基于GO语言并遵从Apache2.0协议开源
Docker基本概念:
docker是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面只介绍CentOs的安装,Windows提供安装连接,但是不提供安装步骤,可以在官网中自己看。以下都是社区版。
CentOS是Linux的发行版之一,关于Linux发行版可以看Linux发行版特色
首先来了解一下什么是Linux的包管理工具,可以查看Linux的包管理工具:
简单来说,Linux软件包管理工具是一组命令的集合,其作用是提供在操作系统中安装,升级,卸载需要的软件的方法,并提供对系统中所有软件状态信息的查询。在GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和DPT为最常见的两类软件包管理工具,他们分别应用于基于 rpm 软件包的
版本 | 前端 | 后端 | 包格式 |
---|---|---|---|
Debian, Ubuntu(优班图)等 | dpkg-deb/apt-get | DPT管理器 | deb |
RedHat,SUSE等 | yum | RPM管理器 | rpm |
Linux 发行版本和基于deb软件包的 Linux 发行版本
各个发行版之间最大的不同通常就在于包管理器,所以想玩的话可以集中玩几个代表性的就行:
- apt系,当然选最纯正的Debian
- yum系,选最具代表性的CentOS
- YaST,最主要的就是openSUSE
- Pacman,当然是Manjaro、ArchLinux
本人仅接触过CentOS,其他的包管理工具不知道。下面介绍的系统为CentOS6和7版本,因此安装使用的下载安装命令也是yum
docker的默认安装路径在/var/lib/docker/
下图是docker在Linux中的文件路径及文件夹
其中image是镜像,containers是容器,overlay2是docker官方推荐使用的存储驱动,其他的暂时不知道
安装步骤如下:
参考官网安装
安装完成后配置Docker为开机自启动 systemctl enable docker
参考阿里云镜像加速
注意这里因为Docker版本的不同,配置文件也不同,有/etc/sysconfig/docker和/etc/docker/daemon.json两个,具体参考上方阿里云镜像加速。
ContOS6版本的Docker镜像加速配置,在/etc/sysconfig/docker文件中添加"DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=<从阿里云获取的专属加速连接>\""
ContOS7版本的Docker镜像配置在/etc/docker/daemon.json(没有时新建该文件)中添加
{ "registry-mirrors": ["
。
重启Docker:service docker restart
验证是否生效:ps -ef|grep docker,如果打印出来的Docker进程中显示了配置的镜像地址,则表示成功(另ps命令解释)
相比于虚拟机,Docker去掉了虚拟机的操作系统部分,虚拟机是在主机上新开一个虚拟机的时候会加载一个完整的操作系统内核,而Docker不需要,docker上云行的容器都是只与docker引擎交互,因此在加载和内存大小 方面都要 优于虚拟机。
docker run 命令option说明:
--name
表示在运行这个容器的时候给起一个名字,如果不指定,则docker默认给生成一个随机名字,建议自己制定
-d
表示后台运行容器,并返回容器id,也就是启动守护式容器,与下面两个命令-i -t
对比来看,使用了-i -t
则表示进入这个启动的容器内进行操作,例如启动Tomcat命令docker run -it --rm -p 8888:8080 tomcat:9.0
中-it
,使用此命令后将进入Tomcat的黑窗口
-i
以交互模式运行容器,交互模式的意思就是要去操作这个容器,,容器启动成功后会返回一个命令窗口来供我们与该容器进行交互。如果这个容器是CentOs这样的操作系统,则会进入这个系统,这个系统就是这个容器,与登录虚拟机一样,默认root目录?
-t
为容器分配一个伪输入终端,通常与-i
一起使用
-p
-P
这两个命令都是指定端口,大写P表示随机端口,小写p表示以指定的方式映射端口
-it
指令运行Tomcat后,会返回一个与Tomcat交互的命令行窗口,而exit就表示Tomcat 停止,并且退出当前交互窗口;ctrl+P+Q表示仅退出交互窗口,不停止Tomcat容器服务。
docker logs 命令参数说明 -t 表示time
上面两个命令都可以实现,区别是attach命令只能进入容器并返回该容器id标识的命令行窗口,而exec命令后面可以追加一些操作,当有操作的时候是不需要进入容器,而是直接返回操作后的结果。总结一下就是exec比attach命令功能强大一些。
docker镜像就是联合文件系统(UnionFS)
提交容器副本使之成为一个新的镜像 docker commit -m=‘提交的描述信息’ -a=‘作者’ 容器id 要创建的目标镜像名:[标签名]
,这个命令是将本地容器进行自定义后重新commit到本地仓库中,使之成为一个新的镜像。
docker容器数据卷可以让容器之间共享数据,也可以让容器与主机之间共享数据,当容器关闭或者退出后,保留容器内的数据。
docker run -it -v /宿主机聚堆路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer centos
,该命令表示,在启动centos容器的时候,在容器内增加根目录下的DatavolumeContainer文件夹,在主机增加根目录下的myDataVolume文件夹,这两个互相对应的文件夹就是给该容器添加的容器卷docker inspect
后查看json串中Volumes项即可发现该容器卷文件夹对应,HostConfig项中的binds也标明了两个文件夹对应,VolumesRM表示读写。docker exec -it centos /bin/bash
)进入DataVolumeContainer文件夹后发现该文件夹内也存在host.txt文件,然后我们使用命令vi或vim更改host.txt文件后再touch container.txt新建一个文件,退出容器后进入myDataVolume文件夹后发现host.txt文件内容已经被容器修改,并且增加了一个名叫container.txt文件。由此可以说明,这俩文件夹相当于同一个文件夹。docker start centos
启动容器,使用命令docker attach 容器id
打开centos的命令窗口,进入datavolumecontainer文件夹后发现,host.txt文件的内容已经被主机修改过,并且也有新建的host02.txt.docker run -it -v /宿主机聚堆路径目录:/容器内目录:ro 镜像名
docker inspect 容器id
查看VolumesRM项发现值为false,表示不能写。DockerFIle相当于是对Doker image 的描述。如下图,使用Tomcat举例,在docker.hub上搜索Tomcat镜像,下拉到下图
翻译过来就是支持标签和相应的dockerfile连接,当我们点击某个版本的Tomcat后,跳转到git.hub上的dockerfile,如下图(展示部分图片)
出于可移植和分享的考虑,使用***-v 主机目录:容器目录*** 这种方式不能够直接在Dockerfile中实现,由于宿主机目录是依赖特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
添加步骤:
# volume test
FROM centos
VOLUME [“/dataVolumeContainer1”,“/dataVolumeContainer2”]
CMD echo “finished,--------success1”
CMD /bin/bash
这个dockerfile文件的意思就是,使用centos这个镜像,设置容器卷目录为“/dataVolumeContainer1”,“/dataVolumeContainer2”这两个容器内部的文件夹,打印Finnish这句话,表示程序运行成功,最后这句表示打开交互窗口
docker build -f dockerfile所在目录 -t 标签/新镜像的名字 .
(最后这个点表示在当前目录下,这一段不是很清楚)docker images
查看当前镜像是否有新生成的镜像docker inspect 容器id
命令查看VOLUME 映射,在这个步骤当中我们没有指定主机的容器卷文件夹路径,因此,docker会默认给我们生成一个路径,具体映射在inspect命令打印出来的Volumes项中当我们需要启动多个例如Tomcat容器时,这些容器都是用某一个
docker run -it --name dc02 --volumes-from dc01 镜像id或名字
这个命令的意思就是使用镜像id指向的镜像启动第二个容器,名字叫dc02,并且该容器的容器卷来此dc01。如果我们在不指定读写权限的情况下在dc02容器中给容器卷添加或修改,那么不论是dc01还是在主机,都能看见dc02的修改。以此达到共享的目的。
总结:容器之间配置信息的传递,在整个数据卷的生命周期一直持续,也就是说我们不论是dc01还是02、03、04…任何一个容器在修改了容器卷后都是所有容器生效,并且无论其中任何一个容器删除或者停止都不会影响其他容器访问容器卷,直到没有容器使用容器卷为止。
=================================================
Docker如何将软件打包成一个镜像并发布出去?