Docker镜像
1.概述
- 镜像是轻量级、可执行的独立软件包
- 打包软件运行环境与基于运行环境开发的软件
- 包含运行某个软件所需要的所有内容(代码+运行时的依赖+库+环境变量+配置文件)
2.联合文件系统UnionFS
- 支持文件系统的修改作为一次提交来层层叠加,同时可将不同目录挂载到统一虚拟文件系统下
- 文件系统是Docker镜像的基础,基于基础镜像(没有父镜像)可通过分层来继承
3.镜像加载原理
- 镜像由一层层文件系统组成
4.分层理解
- pull镜像时发现是一层一层在下载
- 通过docker image inspect redis:latest查看
- Docker镜像都始于一个基础镜像层,修改或增加内容时,会在当前镜像层之上创建新的镜像层
- 在添加额外镜像层的同时,镜像始终保持当前所有镜像层的组合
- pull的镜像层不能改变,容器启动时加载新的可写层到镜像顶部成容器层
5.发布镜像命令
- docker commit
docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:[版本]
数据卷容器
1.引入
- docker将数据和环境打包成镜像
- 但产生的数据存哪里呢?
- 若数据存于容器中,但容器容易被删除,造成数据丢失
- 提出新需求数据持久化,此时就出现卷!
- 卷可理解为docker产生的数据自动同步到本地,就是目录挂载,将容器目录挂载到Linux上
- 卷是容器的持久化和同步操作!容器间也可以数据共享
2.使用
- 直接用命令挂载
- DockerFile挂载,下面介绍
3.优点
- 挂载后修改本地,容器会自动同步
4.练习mysql数据卷
- 搜索mysql镜像
- 拉取mysql的镜像
- 查看mysql镜像是否下载好
- 利用镜像创建mysql的容器
- 从本地测试连接
- 删除容器后,本地数据任然存在
5.具名和匿名挂载
- 区分
- 扩展
6.实现容器间数据同步
- 启动docker01
- 启动docker02
- 在docker01中创建文件
- 在docker02中查看
- docker03同样可以继承父容器实现数据共享
- 删除docker01后,文件任然存在
DockerFile
1.概述
- DockerFile用来构建Docker镜像的文件的命令参数脚本
- 每个指令都必须大写
- 从上到下的执行顺序
- 每个命令都会创建提交一个新的镜像层
- #表示注解
2.命令
3.实战
- 编写DockerFile文件
- 运行DockerFile文件构建镜像
- 测试运行
4.了解其他镜像
发布镜像
1.发布到DockerHub
- 注册账号 https://hub.docker.com/
- 登录docker
- 提交镜像
2.发布到阿里云
- 登录阿里云,找到容器镜像服务
- 创建命名空间
- 创建容器镜像
- 阿里有操作指南
流程总结
Docker网络
1.Docker0理解
- 主机 ip addr
- docker ip addr
- 再次 ip addr
- 再启动一个容器
- ping两个容器
- 总结网络模型
- 测试
- docker0不支持自定义互连
2.link
- 直接通过容器名无法ping
- link后可以解决
- 但是反过来不行
- 看容器hosts文件配置
- 此方式太笨,不支持双向绑定
3.网络模式
- bridge:桥接(默认,推荐)
- none:不匹配网络
- host:与宿主机共享网络
- container:容器内网络互连(局限大)
- 桥接往下看
桥接模式bridge
1.概述
- 启动docker时(不另外配置)自动创建默认bridge网络,新建的容器都会自动连接这个网络
2.作用
- 隔离各个容器,使每个容器的端口号都是隔离的,防止容器与宿主机,容器与容器间发生端口占用的情况
- 桥接网络用于同一主机上容器间相互通信(连接到同一网桥的容器可以相互通信)
3.常用命令
- docker network ls:查看所有网络
- docker network create -d bridge 网络名:创建bridge网络
- docker network inspect 网络名:查看网络详情
- docker network remove 网络名:删除网络
4.两个容器通过网桥互连
- 查看镜像
- 创建两个mysql容器
docker run -p 3308:3306 --name ycmysql8 -e MYSQL_ROOT_PASSWORD=a -d mysql:8 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
-----------------------------------------------------------
docker run -p 3310:3306 --name testmysql -e MYSQL_ROOT_PASSWORD=a -d mysql:8 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
- 查看容器是否启动,未启动先启动
- 创建网桥
docker network create -d bridge ycnetwork
- 查看网桥是否创建
- 容器与网桥建立连接
docker network connect ycnetwork ycmysql8
docker network connect ycnetwork testmysql
- 查看网络详情,发现两容器连接到同一网络下
- 进入容器,远程登录ycmysql8 ,查看ycmysql8中创建的库,可看到则成功
docker exec -it testmysql /bin/bash
mysql -h 172.20.0.3 -uroot -pa