docker
简介
什么是docker
docker是一个用来装应用的容器,就像杯子可以装水,我们可以将helloworld方法放到docker中,可以把网站放入docker中,可以把任何想要的程序放在docker中
docker解决的问题
系统环境不一致
CPU硬盘过载会杀掉对应进程
应对高并发的情景
镜像 image
从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件,既然是文件,那么是以什么样的格式在本地保存的呢?
说到存储格式,就要提到linux的一个存储技术,叫做联合文件系统,是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下
比如test1下有三个文件夹,test2下有两个文件夹,还有一个readme文件.联合文件系统就是可以在一个文件夹(test)中看到多个文件夹(test1,test2)中的内容.
通过这种方式可以实现文件的分层,test1可以把它看作第一层,test2可以把它看作第二层,每一层有每一层自己的文件,docker就是利用了这种分层的概念实现了镜像存储.
下图就是镜像的存储格式,这张图是分层的,最下面一层,上面也是一层层的好像集装箱罗列在一起.这就是镜像最直观的存储方式.下面是操作系统的引导,上面是linux操作系统,再上面是一些相关的软件,如果是我们自己的程序,就可以是tomcat,jdk,再往上是应用代码,每一层是我们自己都可以控制得,最上面一层先忽略不看,因为这是和容器有关的.注意一点,docker镜像系统的每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统.docker的这种文件系统被称之为镜像.
容器
每个虚拟机都有自己的文件系统,可以把上图整个一部分看成是文件系统,与虚拟机系统的区别是这里面的文件系统是一层一层的,并且最下面的n层都是只读的,只有上面一层是可写的.为什么要有可写的这层呢?大家的程序运行起来,势必会要写一些日志,写一些文件,或者对系统的某一些文件做一些修改,所以容器在最上面一层创建了可读可写的文件系统.
在程序的运行过程中,如果要写镜像文件时,因为镜像的每一层都是只读的,它会把文件的每一层拷到文件的最上层,然后再对它进行修改,修改之后,当我们的应用读一个文件时会从顶层进行查找,如果没有才会找下一层.
由于容器的最上一层是可以修改的,镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰
仓库
我们的镜像是要在其它机器上运行,如何进行传输呢?
这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程.
docker基本命令
镜像相关
查看镜像
sudo docker images
镜像搜索
sudo docker search xxx
下拉镜像
sudo docker pull 镜像名
sudo docker pull 镜像名:Tag
删除镜像
sudo docker rmi -f 镜像名/镜像ID
保存镜像
docker save 镜像名/镜像ID -o 镜像保存的位置与名字
容器相关
容器列表
sudo docker ps
sudo docker ps -a 查看所有容器,正在运行和已经停止
创建容器
docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置 镜像名:Tag /bin/bash
-it 表示 与容器进行交互式启动
-d 表示可后台运行容器 (守护式运行)
--name 给要运行的容器 起的名字
/bin/bash 交互路径
-p 将容器的端口映射到宿主机上,通过宿主机访问内部端口
-v 将容器内的指定文件夹挂载到宿主机对应位置
停止容器
sudo docker stop 容器名/容器ID
删除容器
删除单个
docker rm -f 容器名/容器ID
删除多个
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
删除全部
docker rm -f $(docker ps -aq)
进入容器
sudo docker attach 容器ID/容器名
离线拷贝方法
在Ubuntu环境下打包Docker容器
docker save -o container.tar container-image:tag
在目标服务器上离线安装Docker容器
首先加载tar文件
docker load -i container.tar
然后运行容器
docker run -d --name container -name -p host-port:container-image:tag
其中, container-name 是容器的名称, host-port 是主机端口, container-port 是容器端口, container-image:tag 是容器的名称和标签