Docker基础
docker概述
从开发到上线,两套环境,版本不同导致软件不可用,开发与运维有差距!部署配置环境费时费力
原:jar——-redis,mysql,jdk,项目能不能带上环境安装打包?跨平台,隔离,
docker容器技术也是一种虚拟化技术
官网:https://www.docker.com/
文档:https://docs.docker.com/
仓库地址: https://hub.docker.com/
镜像(image):模板,通过这个模板来创建容器服务,可创建多个容器(最终服务或者项目运行在容器中)
容器(container):一个或一组应用,可以启动,停止,删除,基本命令
仓库(repository):存放镜像(公有私有),docker hub(默认) 阿里云(国内镜像加速)
安装
start
卸载旧版本
|
|
查看镜像
|
|
阿里云镜像加速
|
|
hello-world流程
sudo docker run hello-World–>本机寻找镜像–No–>仓库地址下载—>是否找到—>下载镜像到本地—>使用镜像创建容器运行
docker常用命令
帮助命令
|
|
镜像命令
|
|
删除镜像docker rmi -f
|
|
容器命令
拉取镜像
|
|
创建容器并启动
|
|
退出容器
|
|
删除容器 rm -f
|
|
启动停止容器
|
|
常用的其他命令
后台启动
|
|
日志命令
|
|
查看容器中的进程信息
|
|
查看镜像源数据
|
|
进入当前正在运行的容器
|
|
从容器拷贝文件到主机 cp
|
|
作业一:部署nginx
|
|
|
|
作业二:部署tomcat
|
|
but
原因:官方镜像最简化,所以找不到资源文件:
|
|
作业三:部署es+kibana
|
|
|
|
使用kibana连接ES:
可视化工具
-
portainer(不是最佳选择,先用)
1 2 3
# -v /var/run/docker.sock 挂载,里面数据挂载到本机 # --privileged=true 授权,本机可访问 docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
测试访问:8088
-
Rancher(CI/CD)
docker镜像原理
UFS 联合文件系统,分层轻量,分层下载,分层加载,多镜像共用 公共内核(bootfs)
对于一个OS,rootfs可以很小,只需要包含基本的命令、工具和程序库就可以了,因为底层直接用host的kernel,自己只需要提供rootfs就可以了,由此可见,不同版本的Linux发行版,bootfs是相同的,只是rootfs不同罢了。
bootfs引导启动非常慢,rootfs库启动非常快,所以虚拟机启动分钟级别,docker启动秒级。
分层理解:
如何打包一个自己的镜像:commit
|
|
容器数据卷
如果数据都在容器中,容器删除之后,数据就会丢失,需求:数据可持久化,
MySQL,容器删除了,MySQL数据就没了,MySQL可以保存在本地吗?
数据共享技术,docker容器中产生的数据同步到本地,
卷技术,?目录挂载,将容器内的目录挂载在宿主机上,持久化与同步操作,容器间数据可以共享
|
|
|
|
部署MySQL
mysql数据持久化问题
|
|
链接成功:
数据挂载成功:(conf)
即使删除容器,本地的数据卷依旧没有丢失,这就达到了数据持久化
具名和匿名挂载
|
|
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/jumingfs/_data
我们通过具名挂载可以方便找到我们的一个大卷,大多数情况下使用的是具名挂载
如何区分是具名挂载还是匿名挂载还是指定路径挂载
|
|
扩展
|
|
Dockerfile:构建docker的文件
一段命令脚本
|
|
|
|
多个docker同步数据
|
|
|
|
docker02 volumesfrom docker01
docker03 volumesfrom docker01
如果把1删除了,2,3还在吗??? 发现还在,只要有一个容器使用,就依旧存在,共享备份机制,双向拷贝的概念
|
|
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,
但是一旦持久化挂载-v到本地,本地不会被删除!!!!
dockerfile
命令参数脚本
1、编写一个dockerfile文件
2、docker build 一个镜像
3、docker run 运行容器
4、docker push 发布镜像(dockerhub,阿里云镜像)
查看一下官方这么做的:
|
|
构建过程
从上到下顺序执行,指令大写,每个指令就会创建一个新的镜像层
企业交付的标准!!!!!
dockerfile指令
dockerHub 80% 来自FROM scratch
|
|
自己写一个dockerfile:::::::::
|
|
|
|
|
|
|
|
CMD与ENTRYPOINT区别
|
|
|
|
|
|
|
|
|
|
实战:tomcat镜像
1、准备镜像文件:tomcat jdk
2、编写dockerfile文件
|
|
3、构建镜像
|
|
4、启动镜像
|
|
5、访问测试
6、发布项目(由于实现了卷挂载,所以我们就直接在本地写项目发布就可以了)
jps页面
|
|
web.xml文件
|
|
发布镜像
dockerHub镜像
1、注册账户:https://registry.hub.docker.com/
2、客户端提交镜像
|
|
|
|
3、发布镜像
|
|
|
|
阿里云镜像
1、登录阿里云https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、浏览页面信息
- 登录阿里云Docker Registry
|
|
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
- 从Registry中拉取镜像
|
|
- 将镜像推送到Registry
|
|
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
小结:
Docker网络
docker网络核心docker0:
两个容器之间如何访问?????
|
|
|
|
现在能不能ping通容器???linux可以ping通容器内部
原理:
1、我们每启动一个docker容器,docker就会给容器分配一个IP,我们只要安装了docker,就会有一个网卡docker0(桥接模式–evth-pair)
2、再启动一个docker容器,发现又多了一对网卡:
|
|
3、测试两个tomcat能不能互通:
网络模型
结论:tomcat01和tomcat02 共用一个路由器docker0,
所有的容器不指定网络,都是docker0路由的,docker会给容器分配一个默认可用IP
255.255.0.1/16 : 能用IP;255*255-0.0-255.255=255*255-1-1
255.255.0.1/24 : 能用IP;255*255-0.0-255.255=255-1-1
–link(基本不用)
场景:微服务或者springboot中database.url配置怎么写??IP一直变
项目不重启,数据库IP变了,我们希望可以通过名字来访问容器
|
|
|
|
探究inspect:
|
|
|
|
|
|
容器02:
|
|
但是现在docker已经不建议使用–link技术了,自定义网络,不用docker0,
docker0问题:他不支持容器名链接访问! !
自定义网络
|
|
网络模式:
bridge : 桥接模式(默认),自己创建也是使用bridge模式
none: 不配置网络,
host: 和Linux主机共享网络
container: 容器网络连通(用的少,局限性很大)
测试
|
|
|
|
用自己创建的网络模式创建容器
|
|
好处:
|
|
自定义网络已经维护好了对应关系,推荐使用自定义网络
redis集群,mysql集群使用不同的网络,保证集群的隔离性与数据安全 ,网络互相隔离
网络互通
测试
|
|
|
|
连通之后就是将tomcat01放在了mytestnet网络下
其实就是一个容器两个IP
|
|
tomcat02依旧不同
加入需要跨网络操作容器,就需要使用dockers network connect mytestnet tomcat-sjvbk
部署redis集群
分片+高可用+负载均衡
|
|
|
|
测试
|
|
|
|
springboot项目部署
1、构建项目
2、打包应用
3、编写dockerfile
|
|
4、构建镜像
|
|
|
|
|
|
win本机因为处于局域网,docker容器可以访问192.168.1.104树莓派,所以可以运行成功
5、发布运行