1.docker产生的原因
开发和运维人员之间因为操作系统,运行环境和配置的不同,容易造成误解。
允许将代码/配置/系统/数据这一套全部迁移--搬楼
使用场景:代码上环境,集群情况下的镜像(image,类似于Java编译一次构建处处运行)
理念:将应用运行在docker容器上,而docker容器在任何操作系统上都是一样的,实现跨平台,服务器;只需一次配置好环境,到别的机器上都可以一键部署好,大大简化了操作
2.docker是什么
解决了环境和配置问题的容器,方便做持续集成并有助于整体发布的容器虚拟化技术
3.能干什么
虚拟机就是带环境(含硬件)安装的一种解决方案,缺点:资源占用多,步骤多,启动慢
linux发展出了一种容器技术:linux容器技术
linux容器不是一个完整的操作系统,而是对进程进行了隔离,只需要软件运行所需要的库资源和设置
传统虚拟机和docker容器的差异:
传统虚拟机是虚拟出一套硬件后,其上运行一个系统,在系统上再运行所需进程
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,也没有自己的硬件,所以容器比虚拟机更轻便
每个容器之间相互隔离,都有自己的文件系统,容器之间的进程不会相互影响,能区分计算资源。
docker官网和docker-hub(和github很像,存放docker镜像的地方)
4.三要素
镜像:一个只读的模板,可以创建多个docker容器 -----类
容器:镜像的一个实例,独立运行的一个或一组应用;可以启动开始停止删除;相互之间隔离
可以看作简易版本的linux环境(root权限,进程,用户)和运行其中的应用程序
容器和镜像基本一样,也是一堆层的统一视角,不同的是容器的最上一层可读可写
仓库:存放镜像文件,分为公共库和私有库;如hub.docker.hub;国内的基本用阿里云和网易云上的仓库
5.安装docker
yum install -y epel -release
yum install -y docker -io
/etc/sysconfig/docker:配置文件修改,
service docker start:启动docker
docker version查看安装
6.阿里云镜像加速器配置
设值aliyun镜像地址:/etc/sysconfig/docker中的args,restart docker接口,检查是否成功
7.docker命令
docker run hello-world:本机寻找镜像实例hello-world,么有去本地找,没有去阿里云找,有就下载并运行。
docker version:docker版本等信息
docker info:查看容器数量,镜像数量等等更详细的信息
docker --help:
8.docker运行底层原理
cs架构,docker运行在服务器上,有一个守护线程运行,通过客户端来访问守护线程,管理运行在服务器上的容器;容器,是一种运行时环境
docker比虚拟机好处:无硬件模拟和更少的抽象层所以更轻量;公用一个内核所以更快;秒级--分钟级
9.镜像命令
docker images 查看本地的镜像,repository(镜像的仓库源)/tag(镜像的标签)/image_id(镜像的唯一id)/virtual_size -- 一个镜像的仓库源可以有多个标签
docker search image_name:在dockerhub上搜索镜像数;-s 30点赞数超过30 --automated 自动构建的
docker pull image_name:tag_name :下载镜像,从repository下载到本机;默认是最新版本的latest
docker rmi image_name:tag_name image_name:tag_name :删除某个镜像,默认删除最新版本的;-f强制删除 docker rmi -f ${docker images -qa}删除所有的镜像
10.容器命令
有镜像才能启动容器
docker run image_name:根据镜像新建一个实例 -it:打开当前容器的一个伪终端 --name:启动的容器的别名 -d:以守护线程的方式在后台运行,不打开伪终端 -p docker_port:tomcat_port -P随机分配端口
docker ps :列出当前所有正在运行的容器
exit :容器停止退出容器 ctrl+p+q:容器不停止退出
docker start container_id:启动容器
docker restart container_id:重启容器
docker stop container_id:停止容器
docker kill container_id:强制停止容器
docker rm container_id:删除已停止的容器
docker rm ${docker ps -qa}:删除多个已停止的容器
docker logs container_id :记录docker的日志,-t 时间 ,-f追加, -tail 显示多少条
docker top container_id:查看容器内运行的进程
docker inspect container_id:查看容器内部的细节
docker attach container_id:进入正在运行的容器并以命令行交互 ctrl+p+q之后进来
docker exec -t contailner_id +commond:在外部就执行容器内部的命令
docker cp container_id:/源文件路径 目标路径:从容器内拷贝文件到主机上
11.镜像原理
镜像是一种轻量级的可执行的独立软件包,用来打包软件运行的环境和基于环境运行的软件。它包含软件运行时所需的所有东西,包括软件代码,运行时环境,库,环境变量,配置的等
union file system:联合文件系统,分层,轻量级高性能的文件系统,支持对文件的修改作为一次提交来一次次叠加。ufs是docker镜像的基础。
docker的镜像加载原理:一层一层的文件系统叠加而成。bootsfs(最顶级,加载器和内核)-->rootsfs(二级,包含linux中的/dev /bin /etc等)
为何采取分层结构:方便共享;base镜像加载一次,之后就方便多了
12.镜像commit
在本地生成自定义的镜像 --docker images 即可查看
docker commit -a 'lcc' -m '新镜像' container_id image_new_name:new_version
13.容器的数据卷
做持久化,类似于移动硬盘
运行伴随着容器,但是数据希望是持久化的,而且希望容器之间可以共享数据
数据可以随着容器生成一个新的镜像保存下来,也可以使用数据卷来完成数据的持久化
作用:容器间共享数据,数据卷中的更改可以直接生效,数据卷的生命周期是一直没有容器使用它为止,数据卷的更改不会包含在镜像的更新中
docker run -it -v /宿主机绝对路径:/容器路径:ro(加了这个设置,容器只可以看,不可以写和建) iamage_name:生成一个容器,且容器与主机之间文件夹挂载成功;容器退出后,主机修改文件容器重启依然会加载这些修改内容
volume['file1','file2']:生成两个数据卷,处于可移植和分享的角度,我们使用dockerfile配置的方式进行挂载 方法:容器中dockerfile构建,build成镜像,启动;主机默认挂载位置
容器到容器之间的挂载:--volumes -from container_name 父子和主机互相共享,修改立即生效
14.DockerFile
dockerfile:就是docker镜像的构建文件,由一系列参数和命令构成
每个docker语法保留字必须是大写且后百年必须跟参数,指令从上到下执行
每条指令都会创建一个新的镜像层,并对镜像进行提交
from image_name:image_tag(scratch是顶级镜像)
maintainer xxx 作者加邮箱
run 容器构建时需要执行的命令
expose 容器对外暴漏的端口
workdir 容器启动后,终端进来默认的工作目录
env 环境变量,可以在之后的run中使用也可以在其他指令中使用;亦可在容器中使用
add xxx.jar /a/ 在构建过程中将文件放到某个目录下,并解压
copy 构建过程中将文件复制到某个目录下
volumes 创建容器的数据卷
cmd 容器构建时要运行的命令,多个cmd命令会被最后一个覆盖,只有最后一个生效;docker run参数会覆盖cmd(docke run tomcat ls-l,会导致最后一个cmd启动catelina.sh不成功导致tomcat启动不成功)
entrypoint 和command一样,docker run参数会追加entrypoint(案例curl加-i参数返回请求头等细节信息)
onbuild 子镜像build后,父镜像会触发这个命令,并做些工作
command-entrypoint/onbuild/tomcat/centos案例
docker exec -it container_id /bin/bsh:进入到容器的终端中
15.推送镜像到阿里云
sudo docker login --username 仓库名
sudo docker tag image_id 仓库名/版本号
sudo docker push 仓库名/版本号
16. centOs上安装和启动docker
17.使用docker用dockerfile来将jar包打成镜像
docker build -t path/url .
docker push path/url
DockerFile:
FROM 父镜像地址 MAINTAINER 作者 ADD 源jar包地址,可以是和dockerfile在统一路径下 镜像中的jar包地址 COPY ./src/main/resources/importFile /usr/importFile/ EXPOSE 镜像对外暴露的端口 ENTRYPOINT ["java","-jar", "xxx.jar"] 镜像打完要执行的脚本命令