一,什么是Docker? 【官方説明】
①、Docker是一个开源的应用容器引擎,基于Go 语言 并遵从Apache2.0 协议开源.
②、Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的Linux 机器上,也可以实现虚拟化。
③、容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone 的app),更重要的是容器性能开销极低。是容器技术的代表,可以理解为一个粗糙的轻量级的虚拟机。
④、随着大数据越来越成熟,应用越来越多,使用RDD(Resilient Distributed Dataset)越来越多,分布式,微服务,大数据云计算等,Docker就必不可少了。
二,Docker解决了什么问题?
① 我本地运行没有问题啊
答:Docker可以解决生产环境和测试环境的运行环境不一致会导致的问题!
② 系统很卡,那个哥们又写死循环了?!
答:一台服务器之中,可以解决不同容器之间的服务干扰问题!
③ 双11来了,现在的服务器撑不住了
答:临时拓展性高,弹性拓展方便,只需要下载Docker,Load镜像到拓展的虚拟机!直
接可运行。
三,Docker的思想:
可以在同一个主机上运行多个应用程序,而应用程序的运行环境彼此隔离,互不干扰,可以充分利用主机的计算和存储资源,新机器只需要安装搬运工并导入构建好的镜像就可以完成程序部署,免去了繁琐的安装和配置工作,维护成本大大降低。
Docker一个容器只做一件事的核心思想!
四,Dokcer安装
4.1,安装要求
Linux CentOS和Ubuntu
64位数操作系统,并且内核版本为3.10以上
查看系统要求
Uname -r
Docker是在Ubuntu操作系统上开发,所以对Ubuntu系统支持是最好的
4.2、Ubuntu安装Docker
第一步: 切换root 用户
su root
第二步: 保证系统是最新版本
apt-get update
第三步: 安装Docker
apt-get install –y docker.io
上述安装是系统自带的Docker 安装包,可能不是最新的!
curl –s https://get.docker.com |sh
安装完成 Docker version
需要启动Docker服务进程
Service docker start
再次执行Docker version
看到上述即安装成功
4.3、CentOS的安装Docker
如果没有wget 需要安装 yum install wget
sudo wget -qO- https://get.docker.com | SH
说明:-q标识输出要简单,O-标识标准输出,而不是输出到文件
sudo usermod -aG docker用户名
例如:sudo usermod -aG docker root
默认情况下不能使用非根用户直接运行多克尔命令,将当前用户(your_user)加入搬运工用户组
Docker版安装完成,查看Docker版本
上述可知道Docker Client启动,但是Docker Server并未启动
Service Docker启动运行Docker Server服务
Docker版本查看服务版本
看到上述即安装和启动成功。
五, Docker的三大核心概念:
Docker 的三大核心:镜像[images] ,容器[Container] ,仓库[Repository]
三大核心概念的关系,用户去仓库拉取镜像,运行在容器中!
5.1、镜像[images]:
镜像是创建搬运工容器的基础,Docker镜像类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读的文件,包含文件系统创建镜像有三种方法:
①:基于已有镜像的容器创建【就是在当前现有容器中进行操作,然后提交成新的镜像】。主要是利用docker commit命令。
②:基于本地模板导入推荐利用OpenVZ的提供的模板来创建。
③:基于Dockerfile创建。首先按照Dockerfile的格式,编写好Dockerfile文件,之后通过docker build命令来创建镜像.docker构建会取得制定的dockerfile,由Dockerfile务来创建镜像文件。
5.2、容器[Container]:
Docker 容器类似一个轻量级的沙箱,Docker 利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动,开始,停止,删除,而这些容器都是相互隔离,互不可见的。可以把容器看做一个简易的Linux 系统环境(这包括根用户权限,进程空间,用户空间和网络空间等),以及运行在其中的应用程序打包而成的应用盒子,镜像本身是只读。容器从镜像启动的时候,Docker会在镜像的最上层建一个可写层,镜像本身保持不变。可以利用docker create命令创建一个容器,创建后的的容器处于停止状态,可以使用docker start 容器ID,命令来启动它。也可以直接利用docker run命令来直接从镜像启动运行一个容器.docker run = docker creat + docker start当利用docker run创建并启动一个容器时,docker在后台的标准操作包括:
①,检查本地是否存在指定的镜像,不存在就从公有仓库下载
②,利用镜像创建并启动一个容器
③,从宿主机配置的网桥接口中桥接一个虚拟的接口到容器中
④,从地址池中配置一个IP地址给容器
⑤,执行用户指定的应用程序
⑥,执行完毕后容器终止
备注:当你在容器内部的操作配置,容器停止运行,所有的操作还是会存在!Docker ps -a查看找到容器ID,提交之后,可生成新的镜像!如果你不提创建新的镜像,之前的操作就会丢失!容器内部操作为一次性的,Docker commit容器ID镜像名提交生成新的镜像用来保存操作的配置
5.3、仓库[Repository]:
仓库是存放Docker images [镜像]的地方。仓库和注册服务器还是有区别的。注册服务器是存放仓库的地方,在其中存放了很多仓库,每个仓库存放一类镜像文件。仓库分为公有仓库和私有仓库,DockerHub是目前最大的公有仓库。可以通过docker push / pull命令从仓库中上传和下载镜像,docker search命令来搜索镜像。
网易云镜像中心:c.163.com
在保证Docker服务启动成功的前提下,黏贴回车即可!
六,Docker的使用
6.1、Docker 所有的运行都是需要镜像文件作为基础的
Docker images 查看所有的镜像
6.2、Docker ps 查看正在运行的容器
6.3、Docker ps –a 查看所有结束运行的容器信息
备注:当Linux操作系统重启之后,docker服务会停止,正在运行的所有容器都会停止,docker ps 查不到任何正在运行的服务,docker ps –a 可以查询到历史所有的运行服务,直接docker start ‘容器ID’,可以重启容器服务,保证所有服务和Linux关机之前状态是一样的!【可以设置开机自启】
七、容器生命周期管理
docker run运行镜像文件,生成服务容器
-d:后台运行容器,并返回容器ID;
-i:以交互模式运行容器,通常与-t同时使用;
-p:端口映射,格式为:主机(宿主)端口:容器端口
-t:为容器重新分配一个伪输入终端,通常与-i同时使用;
--name ="Mynginx":为容器指定一个名称;
--dns 8.8.8.8:指定容器使用的DNS服务器,默认和宿主一致;
-m:设置容器使用内存最大值;
--net ="bridge":指定容器的网络连接类型,支持bridge / host / none / container:四种类型
docker run -p -itd -v /root/software/ : /mnt/software/05115a755af0/bin/bash
-p 端口映射 外部端口:内部端口
-v 文件路径 映射宿主机目录:容器目录
-d 后台运行
-P 随机映射对外所有端口
docker build 创建镜像,命令用于使用Dockerfile 中
system prune 删除所有已经运行结束的容器docker
rm '容器ID' 删除容器【此容器必须为未运行状态】
docker cmmit '容器ID' 新镜像名 提交当前容器,保存为新的镜像文件
docker start '容器ID' 启动一个或多少已经被停止的容器docker
docker stop '容器ID' 停止一个运行中的容器
docker restart '容器ID' 重启容器
docker kill 杀掉一个运行中的容器
例如:docker kill -s Kill '容器ID'
docker rm 删除一个或多少容器
例如:docker rm -f '容器ID1' '容器ID2' 删除两个容器
docker create 创建一个新的容器但不启动它
例如:docker镜像nginx: 最新创建一个容器,并将容器命名为myrunoob docker
create --name myrunoob nginx:latest --name是重命名容器
八,容器相关操作
docker ps
-a:显示所有的容器,包括未运行的
-l:显示最近创建的容器
-n:列出最近创建的n个容器
-q:静默模式,只显示容器编号
-s :显示总的文件大小
docker ps -n 5 显示最近创建的5个容器
docker ps -a -q 列出所有创建的容器ID
docker inspect 获取容器/镜像的元数据docker、包括IP
inspect mysql:5.6获取mysql:5.6 数据的原信息
docker top '容器ID' 查看容器中运行的进程信息,支持ps命令参数
docker exec -it '容器ID' bash 切入到容器内部【交互式】,退出后,容器还会在运行docker
docker attach '容器ID' 切入到容器内部【非交互式】,exit后,容器停止运行
docker logs '容器ID' 获取容器的日志
例如:docker logs --since ="2016-07-01"--tail = 10'容器ID'
查看容器mynginx从2016年7月1日后的最新10条日志
docker port 列出指定的容器的端口映射
例如:docker port'容器ID'
docker load <web.tar 加载导出的镜像文件到Docker容器中
例如:docker load <导出的镜像文件名.tar
九、容器rootfs命令
docker commit: 从容器创建一个新的镜像
-a:提交的镜像作者
-c:使用Dockerfile指令来创建镜像
-m:提交时的说明文字
-p:在commit时,将容器暂停
docker commit -a "root" -m "my apache" a404c6c174a2 mymysql:v1
docker cp用于容器与主机之间的数据拷贝
例如:docker cp'本地全路径'容器ID:'容器内部ID'
docker cp /root/AAAA.war 2a501f61a426:/usr/java/tomcat/apache-tomcat- 20170508/webapps/
十、镜像仓库docker
Docker pull '镜像名' 从镜像仓库中拉取或者更新指定镜像docker
Docker search '镜像名' 从镜像中心查找镜像
十一、本地镜像管理
码头图像列出本地镜像
docker rmi '镜像ID' 删除本地一个或多少镜像【前提是此镜像不被其他镜像依赖】
docker build 命令用于使用Dockerfile创建镜像文件
docker history 查看指定镜像的创建历史
docker save -o javaweb.tar '镜像ID' 将docker中的镜像导出
例如:docker save -o '存储本地的镜像名字'.tar 'docker中的镜像ID'
上述存储语法有一个缺陷根据镜像ID存储的为镜像文件,当加载到其他机器上的码头工人容器中会丢失镜像名称和没有名称
docker save -o javaweb.tar 镜像名称.Tar 将docker中的镜像导出
例如:docker save -o '存储本地的镜像名字':tag 'docker中的镜像名称':镜像tag
当前存储语法,会保存当前镜像的名称和镜像文件的Tag,当加载到其他机器上的Docker容器中不会丢失镜像名称和Tag名称
十二,info 版本
docker info显示Docker系统信息,包括镜像和容器数docker
version显示Docker版本信息
上述所有使用镜像ID、和容器ID、的所有操作都可以使用镜像名称、容器名称、镜像标签、容器标签替换
备注、Docker使用的注意事项
注意事项①
当一个镜像文件已经运行后,停止在Docker容器中,(Docker ps -a)可以查看,如果想要再运行相同的shell命令启动这个服务,必须要先删除掉容器中的进程,才能重新运行!
报错信息如下:
docker: Error response from daemon: Conflict. The container name "/liuwunan-es" is already in use by container "6b7cbf12d49242bdaebf2cae9e0a3bcdfb3bd0623c39a5e2d1068048e00c451b". You have to remove (or rename) that container to be able to reuse that name.
请参阅'docker run --help'。
(docker system prune 删除停止的所有容器)
重新运行Shell启动这个服务就可以了
注意事项②
当修改了一个容器内部的配置之后,如果需要当前修改配置永久生效需要重新提交当前容器,生成新的镜像文件,否则当下次删除了已经停止运行的容器,配置会重新还原,之前所有的修改配置文件都会丢失!为保证下次删除容器,配置不丢失最好的办法是重新提交容器生成新的镜像文件
(docker commit 容器id镜像名:tag标签)镜像名:标签都必须为小写