docker 的基本学习资料:http://www.runoob.com/docker/docker-tutorial.html
什么是docker,定义
docker 是一个装应用的容器,比如:笔筒可以装笔,书包可以装书,你可以把Hello Wrod 放在docker里面,也可以把网站放在docker里面,你可以把任何你想得到的程序 放在docker里面;docker是软件容器化平台。
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
相关链接
Docker 官网:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
docker 的应用场景:
1、可以简化配置;
2、可以提高开发的效率;
3、应用的隔离;
4、服务器的整合;
5、快速的部署;
6、代码流水线的管理;
7、开发的调试的工作;
8、产品的发布模式;
理解docker思想:
集装箱:如果要将程序部署到另一台机器上面去,有可能会少拷一些东西,有了docker就不会因为少数据而发生错误,它可以保证程序不管放在哪里都不会缺东西;
标准化:
隔离性:比如你创建一个虚拟机可能需要几分钟,创建一个docker只需要1秒钟,它的最底层的技术是linux的一种内核的限制机制,叫做lxc;lxc是一种轻量级的容器虚拟化技术,他最大效益的隔离了进程和资源。
docker解决了什么问题?
例子:正常运行一个程序需要什么(如:java Web)?首先是一个操作系统,上面需要jdk,tomcat,依赖代码,依赖配置文件
docker解决了运行环境不一致导致的问题。
自己的程序挂了的原因:有可能是内存不够了,硬盘满了;突然发现某一个程序变慢了,敲终端也比较卡;如果用docker就解决了这个问题,他的隔离性就解决了这个问题,因为docker最开始就规定好了程序的最大内存,如果超出就会杀掉你;docker的标准化让快速扩展,弹性伸缩变得简单。
docker的核心技术:
镜像、仓库、容器
镜像就是集装箱,仓库就是码头,容器就是运行程序的地方;用docker运行一个程序的过程就是去仓库把镜像拿到本地,然后用命令把镜像运行起来,变成容器。
build:构建镜像;
ship:运输,从仓库到主机上面运输;
run:运行一个镜像成为一个容器。
docker镜像:本质上说:镜像就是一系列文件:包括应用程序的文件,运行环境的文件;docker保存文件后的格式:linux的存储技术(联合文件系统),它是一种分层的文件系统。
docker的文件系统就是一个镜像。
docker容器:它的本质就是一个进程;在上面那张图中,镜像是所有文件都是只读的,而容器最上层是可写的,一个容器会把镜像中可写的文件放在最上层;因为文件可写,所以一个镜像可以生成不同的容器独立运行,而他们之间没有干扰。
docker仓库:装镜像的地方,大家可以将镜像上传到仓库中,然后把镜像仓库运输到本地。
第一个镜像
docker语法 :
作用:从docker的远程仓库拉取一个镜像到本地,pull就是拉取的意思(和git命令有点像) ,NAME(必填)是镜像名称;TAG(选填)表示为镜像的版本,不填的话,默认为最新版本;OPTIONS为拉取的一些参数;
作用:查看本机有哪些镜像,也可以查看镜像是否pull成功了;REPOSITORY表示可以指定一个版本都名称。TAG 表示版本;一般只用docker images查看本机的镜像。
使用:
注意:当我们没有指定docker下载地址的时候他会默认从docker仓库里面找;
第一个容器:
将镜像运行起来就是一个容器;
运行镜像的命令:
IMAGE表示镜像的名字;TAG表示镜像的版本;COMMAND表示镜像运行起来的是时候执行什么命令;ARG表示所依赖的参数;OPTOINS表示运行起来的选项;
注意:如果想要容器在后台运行的话,就加一个 -d;
返回一个后台运行的 id;
进入一个容器内部命令:
退出命令,回到终端:
docker运行nginx
怎么制作一个docker?
1、第一个是dockerFile:是指要告诉别人怎样来制作docker镜像,我每一步制作的每一步是什么,
2、docker bulid :用来执行dockerfile里面所描述的每一件事情。最终会把我们的docker 镜像构建出来,
制作过程:
1、第一步我们要先写一个dockerfile
现在远程仓库里面下载一个tomcat、
这句话是想告诉docker我要做一个基础镜像是用tomcat作为起点
所有者的名字和地址
最后这个是一个copy命令:是将我们的项目复制到tomcat的webapps下面
第二步就是docker build 这个命令。后面可以跟一个dockerfile的一个目录,当前目录为一个【.】
给镜像取一个名字,并制定他的版本;
docker 命令
1、docker search + 名字 : 搜索哪些与名字相关的镜像名字;
2、docker pull + 镜像名字
3、docker images : 查看当前存在的镜
4、docker run + 镜像名字 :启动docker
5、docker run --name + 启动后的名字 -it(后台运行) + 镜像名字
6、docker start + 容器id
7、docker run -d(启动一个容器,并且让他直接在后台运行) --name + 新名字(容器的名字) + 镜像名字 (用哪个镜像来运行容器)
8、docker exec | docker attach
删除镜像: docker rmi 后面跟镜像的id
docker ps -a :查看容器 (运行和未运行的)
进入容器内部:
退出就是exit
docker 的网络访问
数据卷和数据卷容器
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。
数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。
1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享。数据卷可以在多个容器之间共享。
2)创建数据卷,只要在docker run命令后面跟上-v参数即可创建一个数据卷,当然也可以跟多个-v参数来创建多个数据卷,当创建好带有数据卷的容器后,就可以在其他容器中通过--volumes-froms参数来挂载该数据卷了,而不管该容器是否运行。也可以在Dockerfile中通过VOLUME指令来增加一个或者多个数据卷。
3)如果有一些数据想在多个容器间共享,或者想在一些临时性的容器中使用该数据,那么最好的方案就是你创建一个数据卷容器,然后从该临时性的容器中挂载该数据卷容器的数据。这样,即使删除了刚开始的第一个数据卷容器或者中间层的数据卷容器,只要有其他容器使用数据卷,数据卷都不会被删除的。
4)不能使用docker export、save、cp等命令来备份数据卷的内容,因为数据卷是存在于镜像之外的。备份的方法可以是创建一个新容器,挂载数据卷容器,同时挂载一个本地目录,然后把远程数据卷容器的数据卷通过备份命令备份到映射的本地目录里面。如下:
# docker run -rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
5)也可以把一个本地主机的目录当做数据卷挂载在容器上,同样是在docker run后面跟-v参数,不过-v后面跟的不再是单独的目录了,它是[host-dir]:[container-dir]:[rw|ro]这样格式的,host-dir是一个绝对路径的地址,如果host-dir不存在,则docker会创建一个新的数据卷,如果host-dir存在,但是指向的是一个不存在的目录,则docker也会创建该目录,然后使用该目录做数据源。
Docker Volume数据卷可以实现:
1)绕过“拷贝写”系统,以达到本地磁盘IO的性能,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
2)绕过“拷贝写”系统,有些文件不需要在docker commit打包进镜像文件。
3)数据卷可以在容器间共享和重用数据
4)数据卷可以在宿主和容器间共享数据
5)数据卷数据改变是直接修改的
6)数据卷是持续性的,直到没有容器使用它们。即便是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其他的容器使用数据卷,那么里面的数据都不会丢失。
Docker数据持久化:
容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。
如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。
存docker的数据的地方,属于两种存数据的方案
docker run -it --name volume-test -h nginx -v /data nginx
意思解释:
docker run :表示启动容器;
-i:让它的终端保持打开的状态;
-t:启动一个tty;
--name volume-test:给容器起一个别名;
-h nginx:指定主机名;
-v:使用数据卷的话,就使用-v
/date nginx :启动一个nginx的容器,创建一个data的数据卷;
ls /data :进入数据卷里面,表示存在这个目录;
上面这句话它会将这个容器和这个卷信息展示出来;在数据卷里面有一个物理机的地址,你在这个里面映射的地址,这个地址里面一切操作,都会在另一边看得到;
我想向指定一个目录,挂载到docker容器里面
前面的是原来物理机上的opt,冒号后面是容器的opt
你想在挂载上去的数据卷变为只读就加上上面的:ro
如果我想专门用一个容器来存数据,然后在其他的容器就不挂载了,然后就可以直接在上面去读;
将一根容器构建成一个镜像:在基本容器上面 装一个nginx,然后在打成一个镜像;
构建完之后会返回一个id。
总结:首先是将nginx让在一个容器里面,然后将容器打成一个镜像,在然后运行这个容器,这个时候发现容器启动不起来,重新运行了这个容器,然后删除,然后退出;在重新打镜像,再重新加上路径运行;最后解决的办法是启动命令后面跟上路径;