链接: Docker常用命令
链接: Dockerhub
systemctl start docker.service
问题:项目能不能带上环境安装打包!
传统:开发jar,运维来做!
现在:开发打包部署上线,一套流程做完!
Docker给以上的问题,提出了解决方案!
java — jar(环境) ---- 打包项目带上环境(镜像)— (Docker仓库:商店) — 下载我们发布的镜像 ---- 直接运行即可!
Docker的思想就来自于集装箱!
JRE – 多个应用(端口冲突) ---- 原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。
Docker通过隔离机制,可以将服务器利用到极致!
本质:所有的技术都是因为出现了一些问题,我们需要去解决,才去学习 !docker:隔离,镜像(最核心的环境4m + jdk + mysql)十分的小巧,运行镜像就可以了! 小巧! 几个m 或者是kb 秒级启动!
开发人员都必须要学会Docker
相当于虚拟机技术
虚拟技术缺点
1.资源占用十分多
2.冗余步骤多
3.启动慢!
容器化技术!
容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机技术的不同:
传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互补影响。
DevOps(开发,运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker :打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!
项目打包为一个镜像,扩展服务器A!服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用:
Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
镜像( image ) :
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run ==> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器( container ):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统
仓库(reposItory ):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub(默认是国外的)
阿里云…都有容器服务器(配置镜像加速!|)
环境查看
查看centos版本
安装(CentOS7)
帮助文档:
测试尝试安装容器:hello-world
查看镜像
卸载docker
阿里云镜像加速
docker运行原理:
Docker是一个Client - Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker为什么比vm快?
1.Docker有着比虚拟机更少的抽象层
2.docker利用的是宿主机的内核,vm需要是GuestOS。
所以说,新建一个容器的时候,docker不需要想虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker 是利用宿主机的操作系统吗,省略了这个复杂的过程,秒级!
帮助命令
帮助文档地址:https://docs.docker.com/engine/reference/commandline/build/
dockerhub上搜索镜像
镜像命令
docker search 搜索镜像
docker pull 下载镜像
docker rmi 删除镜像!
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
新建容器并使用
列出所有的运行的容器
docker ps :列出当前正在运行的容器
docker ps -a :列出当前正在运行的容器+带出历史运行过的容器
docker ps -n=? :显示最近创建的容器
-q :只显示容器的编号
退出容器
删除容器
启动和停止容器的操作
常用的其他命令
后台启动容器
常见的坑: docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止nginx容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
查看容器中进程信息
查看镜像源数据
进入当前运行的容器
从容器内拷贝文件到主机上
拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现,自动同步 /home /home
Docker安装Nginx
1.搜索镜像 search
2.下载镜像 pull
3.运行测试
docker run -d --name nginx01 -p 3344:80 nginx
#-d后台运行
#–name给容器命名
#-p宿主机端口:容器内部端口
端口暴露
思考问题∶我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?-v数据卷!
官方的使用,我们之前的启动都是后台,停止了容器之后,容器还是可以查到docker run -it --rm,一般用来测试,用完就删除.
发现问题:1.linux命令少了,2.没有webapps,阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉。保证最小可运行的环境!
复制到webapps下,可以正常访问!
思考问题∶我们以后要部署项目,如果每次都要进入容器是不是十分麻烦﹖我要是可以在容器外部提供一个映射路径,webapps ,我们在外部放置项目,就自动同步到内部就好了!
docker stats 查看内存支援消耗情况!
限制es内存大小
Rancher(CI/CD再用)
Docker图形化界面管理工具!提供一个后台面板供我们操作!(访问ip+端口)
实战测试:
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比我们以前学习VM时候,快照!
需求:数据可以持久化!
MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上面!
容器的持久化和同步操作!容器之间也是可以数据共享的。
使用数据卷
方式一:直接使用命令来挂载 -v
touch测试,加入文件测试,绑定完成。
测试!
1.停止容器
2.宿主机上修改文件
3.启动容器
4.容器内的数据依旧是同步的!
mysql的数据持久问题 data
匿名挂载
查看所有的volume的情况
匿名:
具名挂载
具名:
查看卷的路径
拓展:
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
dockerfile1文件:
构建自己编写的脚本,生成镜像(挂载)
启动自己挂载的镜像
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载-卷名:容器内路径!
关键字:–volumes-from
多个mysql实现数据共享
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1.编写一个dockerfile文件
2.docker build 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(Dockerhub,阿里云镜像仓库!)
查看一下官方是怎么做的?
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
基础知识∶
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!Docker镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维…缺一不可
DockerFile:构建文件,定义了一切的步骤,源代码DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品,原来是jar warDocker容器:容器就是镜像运行起来提供服务器
以前的话我们就是使用别人的,现在我们知道了这些指令后,我们来练习自己写一个镜像!
Docker Hub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行的构建
创建一个自己的centos
1.在某个路径下编写Dockerfile文件
2.通过这个文件构建镜像(docker build)
命令:docker build -f dockerfile文件路径 -t 镜像名:[tag] .
3.测试运行
我们增加之后的centos与原生的不同,可以自己相应的增加功能。
我们可以列出本地进行的变更历史
docker history 镜像名id
平时拿到一个镜像,就可以研究一下它是怎么做的了?
CMD
指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT
指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
测试ENTRYPOINT
准备镜像文件 tomcat压缩包,jdk的压缩包
编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要 -f 指定了!
注意:配置jdk环境变量要正确,要不然访问不成功!
命令:构建镜像,在Dockerfile文件的目录下,包括jar和tomcat的压缩包。
启动镜像,运行自己编写的tomcat
进入容器,查看目录结构。
测试能不能正常的访问tomcat容器。
注意,路径对应上面解压的路径做挂载。
往test里放入WEN_INF和index.jsp就可以正常访问了,如下图:
部署一个项目,访问成功!
需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
1.首先拥有自己的dockerhub账号。
2.确定这个账号可以登录。
3.在我们自己的服务器上提交自己的镜像。
4.登录完毕后就可以提交镜像了,就是一步docker push。
这里必须注意:(第一步)docker tag 镜像id dockerhub注册名/镜像名称:1.0(第二步)docker push dockerhub注册名/镜像名称:1.0
提交的时候也是按照镜像的层级来进行提交的!
退出登录
发布到阿里云容器服务
1.登录阿里云
2.进入容器镜像服务
3.创建命名空间
4.创建容器镜像
5.控制台有详细的操作
linux查看本机ip
1.如果进入里容器没有ip addr命令。
进入容器执行:
2.ping容器id看看通不通。
3.我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡dockerO桥接模式,使用的技术是evth-pair技术! |
4.veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。
veth-pair充当一个桥梁的作用,连接各种虚拟网络设备
openstac,Docker容器之间的连接,ovs的连接,都是使用evth-pair 技术
5.测试容器之间可以正常ping通吗?
容器安装:apt-get install inetutils-ping ,可以正常ping。
测试完是可以正常ping通的。
结论: tomcat01和tomcat02是公用的一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
Docker使用的是Linux的桥接,宿主机中是一个Dokcer容器的网桥 docker0。
思考一个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以名字来进行访问容器?
查看相应的docker网络信息:
查看容器详细信息,可以看到信息。(docker inspect 容器id)
查看
本质探究︰–link就是我们在hosts配置中增加了一个172.18.0.3 tomcat02 312857784cd4
我们现在玩Docker已经不建议使用–link 了 !
自定义网络!不适用docker0 !
docker0问题:他不支持容器名连接访问!
网络模式
bridge:桥接docker (默认,自己创建也使用bridge模式)
none: 不配置网络
host: 和宿主机共享网络
container: 容器内网络(用的少,局限性大)
默认参数
我们可以自定义一个网络!
–driver bridge
–subnet 192.168.0.0/16
–gateway 192.168.0.1
mynet 自己定义网络名
查看自己创建的网络
docker network inspect mynet
测试
测试ping连接,ip和容器名
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
好处︰
redis -不同的集群使用不同的网络,保证集群是安全和健康的
mysql -不同的集群使用不同的网络,保证集群是安全和健康的
设置一个容器连通到一个网络。
docker network --help
docker network connect --help
测试打通
连通之后就是将tomcat01放到了mynet网络下.一个容器两个ip地址! 阿里云服务:公网ip 私网ip
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!…
1.架构springboot项目
2.打包应用
3.编写dockerfile
Dockerfile文件内容:
4.构建镜像(jar和Dockerfile复制到一个文件夹里,然后运行。)
5.发布运行
6.查看自动分配的端口映射
7.测试
以后我们使用了Docker之后,给别人交付的就是一个镜像即可!