本地镜像发布到阿里云:
镜像云发布流程:
镜像生成方法:
- 容器commit提交
- 云服务拉取
- Dockerfile
容器数据卷:
卷就是一个目录或者文件 存在于一个或多个容器中 由docker挂载到容器 但不属于联合文件系统 因此能够绕过union file system 提供一些用于持续存储或共享数据的特性
卷的设计目的:
数据的持久化 完全独立于容器的生存周期,因此docker不会在容器删除时 删除其挂载的数据卷
容器卷是什么?
有点类似于redis里的rdb和aof文件 将docker容器内的数据保存进宿主机的磁盘中 运行一个带有容器卷存储功能的容器实例
容器数据卷可以干嘛?
将运用与运行的环境打包成镜像 run后形成容器实例运行 但是我们对数据的要求希望是持久化的 docker容器产生的数据如果不备份,那么当容器实例删除后,容器内的数据自然会删除 为了能保存数据在docker中我们使用卷
特点:
- 数据卷可以在容器之间共享或者重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
容器卷与主机互通互连:
宿主机 容器之间映射添加容器卷:
直接命令添加
- docker run -it --privileged=true -v /宿主机绝对路径:容器内目录 镜像名(--name u ubuntu)
- docker修改 主机同步获得 主机修改 docker同步获得 docker容器停止 主机修改 docker容器重启看数据是否会同步(成功同步)
读写规则映射添加说明
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 (默认是rw)
当然有时候的需求是只读:
容器实例内部被限制 只能读取不能写
docker -run -it --privileged=true -v /宿主机绝对路径目录:容器内目录 :ro 镜像名
卷的继承和共享
容器1完成与宿主机的映射
容器中创建文件会同步更新到主机中
容器2继承容器1的卷规则
docker run -it --privileged=true --volumes-from u1(父类) --name u2 ubuntu
实现主机共享 容器数据的相互传递
父类容器u1暂停退出 子类容器会退出吗?
继承规则 但仍然独立 父类暂停子类不会暂停
u1恢复 数据会有嘛? 仍然会有
docker下常规软件的安装:
tomcat(成功后,访问页面可能是404 ???
解决办法:可以检查防火墙或者映射端口 删除webapps 这个目录 将webapps.dist 改为webapps就可以)
mysql
redis
软件跑在容器引擎上:
总体步骤:
搜索镜像docker search imagename
拉取镜像
查看镜像
启动镜像(服务端口映射)
停止容器
移除容器
Dockerfile
- 是什么?用来构建docker镜像的文本文件 是用一条条构建镜像的指令和参数构成的脚本
本镜像需要一次添加(功能的需求)
独立于docker 直接构建一个新的镜像功能更强大
构建三部曲:
编写Dockerfile文件----->docker bulid构建镜像----->docker run 镜像运行容器实例
- Dockerfile的构建过程
- Dockerfile基础知识:
保留字====关键字 必须为大写 且至少跟随一个参数
docker执行Dockerfile大致流程:
dockerfile(开发)是原材料 docker镜像(交付)是软件的交付品
docker容器(部署运维)是软件镜像的运行态
Dockerfile:定义了进程所需要的一切东西 包括执行代码或者是文件,环境变量,依赖包,运行时环境等
docker镜像:使用dockerfile定义一个文件之后 dokcer build会产生一个docker镜像 当运行docker镜像时就会真正的提供服务
docker容器 是直接提供服务的
Dockerfile保留字指令
虚悬镜像
在创建或者删除的时候 出现错误 导致 仓库名和标签名都是<none>的镜像
查看虚悬镜像命令:docker image ls -f dangling=true
虚悬镜像:本身就是一个错误的镜像并且还会占用空间,没有任何价值,查到虚悬镜像就可以删除掉 ======> docker image prune
1.编写Dockerfile 文件
2.构建镜像:docker build -t imagename:tag .
3.运行(微服务一般后台运行)docker run -d -p port imageid
docker的机制一般是运行失败后,若需要关闭防火墙:
关闭后需要重启一下docker systemctl restart docker
网页测试主机IP➕对应端口
docker网络(network)
docker 不启动,默认网络的状况:ens33 lo virbr0三种网络
docker启动,网络的状况 增加了名为docker0的虚拟网桥
查看docker网络模式命令:
docker network ls查看网络(安装完docker后会默认创建三大网络模式)
主要使用的网络模式是 bridge
1.docker network 相关命令
prune:删除所有无效或者不再用的网络
创建一个网络默认是网桥模式
2.docker network 能干些什么?
(1).可以做 容器之间的互联和通信以及端口的映射
(2).容器IP变动(容器重启导致容器IP变动 可以调用服务名)可以通过服务名直接进行网络通信并且不会受到影响(可以不用写死IP 当然 也有些特殊的会用特定地址的IP供特定服务使用 服务名:IP 类似于键值对 可以直接调用key就OK)
docker网络管理和容器调用之间的规划
-
网络模式
bridge:每一个容器都会被分配 host:容器的网卡IP等都共用于宿主机
四种模式:
- 容器实例内默认网络IP的生产规则
(因为底层网络会变动) docker容器内部的IP是有可能发生改变的 所以我们需要通过网络服务规划好自己的服务
(bridge)创建后默认为桥接
docker 服务会默认创建一个docker0网桥 (上边有一个docker0内部接口)
桥接网络名为docker0 在内核层连通了其他的物理或者虚拟网卡 将所有容器和本地主机都放到同一个物理网络 docker默认指定了docker0接口的IP和子网掩码 让主机和容器之间可以通过网桥相互通信。
EG:
查看bridge网络的详细信息并通过grep获取名称项:
ifconfig |grep docker
docker使用Linux桥接 在宿主机虚拟一个docker容器网桥(docker0) docker启动一个容器会根据docker网桥的网段分配给容器一个IP地址 称为container-IP同时docker网桥是每个容器的默认网关 因为在同一宿主机内的容器都接入同一个网桥 这样的话 容器就能够通过容器的container-IP进行通信
docker run的时候 没有指定network的话默认使用网桥模式是bridge 在宿主机ifconfig 就可以看到docker0和自己的create的网络
整个宿主机的网桥模式都是docker0 就是类似于一个交换机有一堆接口, 每个接口叫veth 在本地主机和容器内分别创建一个虚拟接口 并且让他们连通(这样一对接口叫做veth pair)
每个容器实例内部也有一块网卡 每个接口叫eth0
docker0上边的每个veth匹配某个容器实例内部的eth0 两两配对 一一匹配
将宿主机上的所有容器 都连接到这个内部网络上 两个容器处在同一个网络下 会从这个网关下给拿到分配的IP 此时的两个容器网络互通
(host)是什么?
直接使用宿主机的IP地址和外界进行通信 不需要额外进行nat转换
容器不会获得一个独立的network namespace 而是和宿主机共用一个network namespace 容器不会虚拟出自己的网卡,而是使用宿主机的IP和端口 不会有自己的网关啥的
(none)禁用网络功能 只有lo标识:就是 127.0.0.1 表示本地回环
none模式下 并不会为docker容器进行任何网络配置 也就是说 docker容器没有网卡 IP,路由等信息 只有一个lo 需要我们自己为docker 容器添加网卡配置IP等
(container)
新建的容器和一个已经存在的容器共享一个网络IP配置而不与宿主机进行共享 新创建的容器 不会创建自己的网卡 配置自己的IP 而是和一个指定的容器共享自己的IP端口范围等 同样: 两个容器除了网络方面 其他的入文件系统 进程列表等还是隔离的。
!!!注意只共享网络
目录
(none)禁用网络功能 只有lo标识:就是 127.0.0.1 表示本地回环
- 没有使用自定义网络之前:
将网络的IP地址定义好 可以ping通 但是容器只要变化 内部的IP也会变这个时候ping服务名也是ping不通的
(不能将IP写死 只能用服务名去ping 所以我们要将服务名写死,就可以ping通)
自定义网络本身就维护好了主机名和IP的关系 IP和域名都能通