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"] 镜像打完要执行的脚本命令