目录
一、为什么要用Docker:
针对于大型项目部署时,我们会发现
1、尽管每一台服务器的内核都是基于Linux,但是上层版本可能不同,比较常见的有Ubuntu、CentOS。
2、当我们想将现在的微服务项目部署上在服务器上就需要进行大量的依赖配置。
3、由于需要解决负载均衡问题,所以需要将多个功能相同的应用部署到不同的服务器上,这使得我们就需要对每一台服务器进行十分繁琐的配置。
针对上述问题我们在想能不能将一个程序写好直接打成包,然后直接安装在另一台服务器上就能直接使用。此时Docker就为我们实现了这一功能。我们只需要将软件在任一台服务器上配置好后直接打包,然后在其他服务器直接将这个包进行部署无需其他配置就可以使用。
二、Docker实现的原理
一)、为什么不能实现跨平台
Linux的不同版本中差异性体现在函数库依赖等,例如我们使用Ubuntu进行配置了一个程序,此时SQL依赖于Ubuntu的A函数库,此时我们将该SQL程序部署到CentOS中,在运行SQL程序时就会调用A函数库,但CentOS中并没有A函数库,此时程序就会报错无法运行,这就是不能跨平台的原因。
二)Docker如何实现的:
针对上述问题Docker采取了下述做法:
1、Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像。即之所以运行不起来是因为不同版本的依赖、函数库、配置不同,Docker直接将这些信息打包封装起来。
2、•Docker应用运行在容器中,使用沙箱机制,相互隔离。不同程序运行互不干扰
三、Docker与虚拟机:
1、虚拟机是相当于在自己的电脑上创建了一个新的操作系统,虚拟机的应用与这个虚拟操作系统进行交互并依附于虚拟操作系统,只有虚拟操作系统启动了虚拟机上的应用才会启动,然后虚拟操作系统与本地的操作系统进行交互,形成了这种多层调用,所以性能不是很高。
2、而Docker不同,Docker相当于一个原操作系统的一个系统进程,直接运行在我们本地的操作系统上,只要本地操作系统启动,Docker程序就能运行,无需依赖虚拟操作系统,因此无论是运行速度,还是启动速度都会远高于虚拟机。
四、Docker镜像命令
当虚拟机关闭之后重启之后,请先输入systemctl start docker启动docker才能执行相关命令,docker并没有设置开机自启。
0、设置 docker开机自启:
1、设置自启:
systemctl enable docker
1、docker pull:
从Docker Hub上搜素要拉取的应用,然后执行pull拉取命令。
2、docker images:
查看本地仓具中有的镜像。
3、docker save -o :
将镜像保存到本地:
4、docker rmi:
删除仓库中的某一个镜像。
再次查看仓库已无此镜像:
5、docker load -i:
将本地的文件打包成docker镜像:
五、Docker容器
一、docker run创建并运行一个容器 :
docker run --name 创建的容器名称 -p 虚拟机端口:docker程序的端口 -d nginx
- docker run :创建并运行一个容器
- --name : 给容器起一个名字,比如叫做mn
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器。左侧的端口虚拟机可以不存在,右侧的镜像端口必须与里面应用的端口对应。
- -d:后台运行容器
- lnginx:镜像名称,例如nginx
1、查看一下本地拥有的镜像: (以端口默认为80的nginx为例)
2、创建nginx的容器:
下面输出的是每一个镜像的唯一id。
上述中nginx的端口是80,但用户直接访问的是服务器的端口地址,并不能直接访问docker内的端口,所以我们必须将服务器的端口与容器内的端口进行映射。
3、查看镜像是否运行成功: docker ps
有一个名为containerName的nginx镜像正在运行,虚拟机的80端口正在与nginx的80端口对应。
4、测试是否运行成功:
打开浏览器输入自己的ip地址:端口 就可以访问啦。
出现上述页面表示运行docker容器成功。
5、查看日志: docker logs 容器名
二、查询与运行现存容器:
1、查看现存容器的名称:
该命令查看所有容器的name属性:之后想运行这些容器就要知道它的名称
docker ps -a
2、运行现存容器:
通过name来运行某一容器:
docker start 容器名称
例:我要运行elasticsearch,通过docker ps -a 查询到它的名称是es,所以执行docker start es 运行
三、删除特定容器:
根据name值来删除指定容器,例:我要删除上面的testContainer:
docker rm 容器name
四、数据卷:
一)什么是数据卷
在操作docker容器时有如下问题:
1、文件修改困难。docker修改文件需要进入docker内部,然而docker内部没有vim/vi这种编译工具,所以想修改文件内容十分困难。
2、数据不可复用。在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的。
3、升级维护困难。数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了。
针对上述问题,我们在想:
1、能不能将docker内部的文件关联到Linux的某个目录下,因为Linux的目录下的文件可以通过vim或VSCode这种高级开发工具修改,这样就解决了修改困难问题。
2、当新docker被创建时,想实现数据共享,直接将Linux下已经书写的目录文件进行关联,既可以完成数据共享。
3、进行数据升级时,只需要将之前的容器删除即可,因为配置在Linux下,没在Docker内,我们只需要将新的docker与Linux下已经写好的文件进行关联即可。
针对上述问题,以及解决方法数据卷出现了,数据卷的出现就是为了解决上面的三个问题。
数据卷实现了:
1、docker内conf下有什么文件,/volumes/conf下就有什么文件
2、docker内的conf文件修改会同步到/volumes/conf,同时/volumes/conf文件修改也会同样同步。
3、container1删除之后/volumes/conf下的文件不会删除,即配置保存
4、新docker可以只关联conf不关联html,实现了数据的共享。
二)数据卷常用命令
docker volume [COMMAND]
create | 创建一个volume |
inspect | 显示一个或多个volume的信息 |
ls | 列出所有的volume |
prune | 删除未使用的volume |
rm | 删除一个或多个指定的volume, rm后加数据卷的名称 |
1、创建数据卷:
2、查询现存的数据卷:
3、查询数据卷的详细信息:
三)将数据卷挂在到容器中
我们在创建docker容器时通过-v命令来将数据卷与docker内部的文件相关联。
案例演示:
创建一个nginx容器,修改容器内的html目录内的index.html内容
需求说明:将docker内部的nginx的html文件(所在位置/usr/share/nginx/html )挂载到testVolume这个数据卷上,方便操作其中的内容。
1、创建testVolume数据卷:
2、创建容器并将其挂在在testVolume数据卷上:
3、查看testVolume所在位置:
4、进入数据卷所在位置:(_data是自动创建的,内容都在那个里面)
5、修改内容:
通过ls我们发现,数据卷目录下的文件竟然和容器内nginx的html目录下的文件是一样的,这表明我们关联成功,所以就可以为所欲为的修改了。
1、通过vim修改:
2、在FinalShell中找到文件,然后右键用外部编辑器打开:
三、DockerFile自定义镜像:
一)镜像结构:
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
我们需要对自己搭建的镜像进行分层,因为分层之后后期升级镜像会变得很容易,不需要的层直接删除或替换掉即可。
未完待续....