1、Docker发展原因:
(1)以前开发人员开发项目,环境由运维部署,现在有开发人员开发并打包环境上传
(2)很多集群环境很难配置
Docker过程:
java-jar(环境)-打包项目带上环境镜像-Docker仓库(商店)-下载发布的镜像-直接运行即可
2、Docker是基于Go语言开发的。(可以把它看做一个简易的虚拟机,linux系统下)
3、虚拟机技术的缺点:
资源占用十分多、冗余步骤多、启动很慢。
4、Docker和虚拟机技术的不同:
(1)传统虚拟机:虚拟出一条惊险、运行一个完整的操作系统,然后在这个系统上安装和运行软件。
(2)容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件,所以就轻便了
(3)每个容器是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
5、DevOps(开发、运维)优点:
(1)应用更快速的交付和部署
传统:一堆帮助文档,安装程序;Docker:一键运行打包镜像,发布测试
(2)更便捷的升级和扩容
项目打包为一个镜像,扩展 服务器A、B
(3)更简单的系统运维,在容器化之后,我们的开发测试环境都是高度一致的
(4)更高效的计算资源利用:
Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例,服务器的性能可以压缩到极致。
6、docker的基本组成
(1)镜像(image):相当于模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器(最终服务运行或项目运行都是在容器中的)
(2)容器(container):Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建,启动停止删除基本命令,目前就可以把这个容器理解为一个简易的linux系统。
(3)仓库(repository):仓库就是存放镜像的地方,仓库分为公有和私有,Docker Hub,阿里云…都有容器服务
7、安装Docker:CentOS,使用Xshell连接远程服务器进行操作。
8、docker镜像操作命令
docker version#显示版本信息
docker info #显示系统信息,包括镜像和容器的数量
docker 命令 --help #万能命令
docker images#查看所有本地的主机上的镜像
#REPOSITORY 仓库的镜像源
#TAG 镜像的标签
#IMAGE ID 镜像的ID
#CREATED 镜像的创建时间
#SIZE 镜像的大小
可选项
-a --all #列出所有镜像
-q --quiet #只显示镜像的ID
docker search搜索镜像
可选项
–filter=STARS=3000#搜索出来的镜像就是STARS大于3000的
docker pull 镜像名[:tag]
#下载镜像,如果不写tag,默认就是下载最新版的
docker rmi -f 容器ID
#删除镜像
docker rmi -f $(docker images -aq)
docker ps -a -q|xargs docker rm
#删除全部的容器
9、docker常见命令
(1)新建容器并启动
docker pull cenos
docker run [可选参数] image
#参数说明
–name=“Name” 容器名字Tomcat01 Tomcat02 ,用来区分容器
-d 后台方式运行
-it 使用交互式方式运行,进入容器查看内容
-p 主机端口:容器端口 指定容器的端口,-p 8080:8080
-p 随机指定端口
#测试,启动并进入容器
docker run -it centos /bin/bash
ls查看容器内的centos
#exit退出容器并停止
#ctrl+P+Q容器不停止退出
#列出运行的容器
docker ps
-a 列出当前正在运行的容器,带出历史运行过的容器
-n=数字 显示最近创建的容器
-q 只显示容器的编号
#启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stopt 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
#后台启动容器
docker run -d 镜像名
#查看日志
docker logs -f -t --tail
#显示日志
-tf #显示日志
–tail number #显示日志条数
#查看容器的进程信息
docker top 容器ID
#查看镜像的元数据(显示很多它支持的命令)
docker inspect 容器id
#容器通常使用后台运行,需要进入容器,修改一些配置
docker exec -it 容器id /bin/bash
docker attach 容器id
区别:
docker exec 进入容器后开启一个新的终端,可以再里面操作(常用)
docker attach 进入容器正在执行的终端,不会启动新的进程
#从容器内将文件拷贝到主机上
docker cp 容器ID:/home/test.java/home
10、docker中的Nginx镜像(念法:ngks),nginx是一个代理,端口默认是80
docker run -d -p 80:80 --name nginx nginx#启动
11、docker中的es镜像,ES是一个高度可伸缩的开源的全文检索和分析引擎,它允许你以近实时的方式快速存储、搜索、分析大量数据,ES是基于Lucence开发,隐藏其复杂性,提供了简单易用的restful api接口、Java api接口 为什么是近实时,是因为从写入数据到数据可以被搜索到有一个小延迟(大概1秒),基于es执行搜索和分析可以达到秒级”,es非常耗内存。
12、portainer:Docker图像化界面管理工具,提供一个后台面板供我们使用。
13、镜像:一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容。
如何得到镜像:
(1)从远程仓库下载
(2)朋友拷贝
(3)自己制作一个镜像DockerFile
14、commit镜像
docker commit提交容器作为一个新的副本
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名,[TAG]
15、容器数据卷:容器的持久和同步操作,容器间也可以数据共享
(如果数据都在容器中,那么容器删除,数据就会丢失,所以docker容器中产生的数据,要同步到本地,即卷技术)
每次改nginx配置文件,都需要进入容器内部,所以可在在容器外提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改,-v数据卷,挂载起来,以后修改只需要在本地内修改即可,容器会自动更新。
16、mysql的数据持久化问题,
#获取镜像
docker pull mysql:5.7
#运行容器,需要做数据挂载
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-p -d mysql:tag
#解释
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
–name 容器名字
17、具名挂载、匿名挂载
#匿名挂载(-v 只写了容器内的路径,没有容器外的路径)
docker run -d -p --name nginx01 -v /etc/nginx ngnix
#具名挂载:能够很方便的找到这个卷
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx nginx
指定路径挂载、具名挂载和匿名挂载的区别:
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
#ro rw改变读写权限(ro只读,只能通过宿主机概念,容器内部无法改变)
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
18、多个mysql实现数据共享
–volumes-from
20、dockerfile 是用来构建docker镜像的文件,命令参数脚本
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个一个的命令,每个命令都是一层
构建步骤:
(1)编写一个dockerfile文件
(2)docker build 构建成为一个镜像
(3)docker run 运行镜像
(4)docker push 发布镜像(dockerhub、阿里云仓库)
21、dockerfile构建过程
创建一个dockerfile文件
FROM centos
VOLUME[“volume01”,“volume02”]
CMD echo “----end----”
CMD /bin/bash
22、dockerimages:通过dockerfile构建成的镜像,最终发布和运行的产品,原来是jar war
docker容器:容器就是镜像运行起来提供服务器
24、CMD和ENTRYPOINT区别
CMD 指定这个容器启动时要运行的命令,只有最后一个会生效
ENTRYPOINT 指定这个容器启动时要运行的命令,可以追加命令
25、发布自己的镜像:
docker push kuangshen/diytomcat:01
26、Docker0网络
#查看容器内部网络地址 ip addr ,发现容器启动时候回得到一个eth0@if262 的ip地址,docker分配的。
每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的是evth-pair技术。
evth-pair就是一对虚拟设备接口,它们都是成对出现的,一端连着协议,一段彼此相连。所以它充当着桥梁,连接各种虚拟网络设备。