参考:
1、Docker概述
1.1、参考资料
目的:开发部署上线,一套流程做完.
官网:https://www.docker.com
文档地址:https://docs.docker.com
仓库地址:https://hub.docker.com
1.2、Docker优点
容器化之后,开发测试环境都是高度一致的;
更高效的计算资源利用;
2、Docker的安装
2.1、Docker的基本组成
镜像(Image)
可理解为存放应用的地方;
容器(Container):
可理解为一个轻量级的沙箱,是一个镜像运行的实例;
仓库 (Repository):
是集中存放镜像文件的场所,仓库范围公开和私有两种;
2.2、安装Docker
参考博文:Docker安装
2.3、配置案例云镜像加速
2.4、Docker run流程分析
2.5、Docker为什么比VM快
1、Docker有着比虚拟机更少的抽象层;
2、Docker 利用宿主机的内核,vm需要是Guest OS
当心加一个容器的时候,docker不需要向虚拟机一样重新加载一个系统内核,而虚拟机是需要加载Guest OS,十分钟级的;而docker则是利用宿主机的操作系统,省了复杂的过程,秒级别的!
3、 Docker常用的命令
3.1、帮助命令
docker version # 查看版本
docker info # 显示docker系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
3.2、镜像命令
docker images 查看所有本地主机上的镜像
docker search 搜索镜像
docker search --filter=stars=4 php // 搜索收藏数超过4关键词包括php的镜像
docker search --filter=is-official=true nginx // 搜索官方带nginx关键字的镜像
docker pull 下载镜像
docker rmi 删除镜像
docker rmi -f 容器ID # 删除指定的容器
docker rmi -f 容器ID 容器ID 容器ID # 删除多个容器
docker rmi -f $(docker images -aq) # 删除所有镜像;$()意思是把$()中的值作为参数传过去
导出容器:
docker export -o tom.tar 容器ID
导入容器:
docker import .\tom.tar tom2:1.2
3.3、 容器命令
说明:我们有了镜像才可以创建容器
docker run 新建容器并启动
列出所有运行的容器:
退出容器
exit # 容器直接停止并退出
Ctrl + p + q # 容器不停止退出
删除容器
docker rm 容器的ID # 删除制定的容器,不能删除正在运行的容器,加-f 可强制删除
docker rm -f $(docker ps -aq) # 删除所有的容器
启动|重启|停止|删除 容器的操作
docker start | restart | stop | kill 容器的ID
3.4、常用的其它命令
查看日志
docker logs -tf --tail 10 容器的ID
-tf # 显示日志
--tail number # 显示日志条数
查看容器的进程信息
docker top 容器的ID
查看镜像的源数据
docker inspect 容器的ID
进入当前正在运行的容器
# 第一种方法:进入容器,开启一个新的终端
docker exec -it 容器的ID bashshell
# 第二种方法:进入当前正在执行终端,不会启动新的终端
docker attach 容器的ID
从容器内拷贝文件到主机上
# 在容器外部操作
docker cp 容器ID:容器内路径 目的主机路径
3.5、常见的问题
1、docker run -d centos 启动的镜像,docker ps 发现centos是停止的
原因:docker 使用后台运行,必须要有一个前台的进程,docker如果发现没有应用,就会立即停止。
3.6、命令小结
3.7、安装elasticsearch
问题:不限制内存的话会占用很大的内存
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# -e ES_JAVA_OPTS="-Xms64m -Xmx512m" 是限制内存的大小,最小64M,最大512M
3.8、可视化
portainer
rancher
4、Docker镜像加载原理
4.1、镜像原理
docker的镜像实际上是由一层一层的文件体统组成。
4.2、commit 镜像
提交一个自己的镜像
docker commit 提交容器成为一个新的副本
# 该命令和git类似
docker commit -m="提交的描述信息" -a=“作者” 容器ID 新镜像名:[TAG]
该镜像就好比是快照。
5、容器数据卷
5.1、 概念
服务器与容器之间可以实现数据同步。
将容器内的目录,挂载在到服务器上。
就是为了实现容器的持久化和同步操作。
5.2、使用数据卷
方法一:使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录 centos /bin/bash
查看容器挂载的情况:
docker inspect 容器ID
该过程是一个双向绑定的过程,容器在停止的时候也同步。
5.3、实战Mysql数据同步
# 过去镜像
docker pull mysql:5.7
# 运行容器,需要做数据挂载;需要配置密码
# 启动mysql
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名称
MYSQL_ROOT_PASSWORD mysql设置密码
navicate 远程连接Mysql:
5.4、具名和匿名挂载
# 匿名挂载,挂载的文件名称不好分别
-v 容器内陆路径
# 具名挂载
-v 卷名:容器内路径
# 指定路径挂载
-v /宿主机路径:容器内路径
5.5、数据卷容器
使用场景:多个mysql同步数据
6、Dockerfile
6.1、初识Dockerfile
Dockerfile 就是用脚本来构建docker的镜像;
1、首先得创建一个Dockerfile文件,建议使用dockerfile作为名称;
2、构建镜像
docker build -f dockerfile文件路径 -t centos .
-f dockerfile文件路径
-t 镜像的名称标识,版本号
3、查看卷挂载的情况
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
6.2、数据卷容器
# docker01
docker run -it --name docker01 centos
# docker02
docker run -it --name docker02 --volumes-from docker01 centos
--volumes-from 有继承docker01的意思,docker01也叫作数据卷容器
# docker03
decker run - it --name docker03 --volumes-from docker01 centos
通过--volumes-from
实现容器共享;删除docker01 其它的数据都还在,只要有继承者数据就好在可以实现共享,当共享到宿主机上,数据就可以永久保存了。
应用场景:
多个mysql实现数据共享
6.3、Dockerfile基础知识
6.3.1、Dockerfile构建基础知识
1、每个保留关键(指令)都必须是大写字母;
2、执行顺序从上到下顺序执行
3、# 表示注释
4、每一个指令都回创建提交一个新的镜像层,并提交。
Dockerfile 是面向开发的,逐渐成为企业交付的标准。
6.3.2、Dockerfile的指令
#查看docker的构建过程:
docker history 容器的ID
6.3.3、CMD 与 ENRTYPOINT 区别
CMD 在执行 docker run 后追的命令 CMD中的命令会被覆盖;
ENRTYPOINT 在执行 docker run 后追的命令会追加;
6.4、发布Dockerfile镜像
6.4.1、发布到Dockerhub
1、地址:hub.docker.com
2、docker login -u 用户名
3、docker push 镜像名称:版本号
6.4.2、发布到阿里云镜像上
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建镜像仓库
5、点击容器查看信息,阿里云有明确的上传镜像的方式
6.5、小结
7、Docker 网络
原理:我们每启动一个docker容器,docker就会给docker容器分配一个ip,我我只要安装了docker,就会有一个网卡docker0;桥接模式,使用的技术是evth-pair技术。
evth-pair 就是一对虚拟设备接口,他们收拾成对出现的,一段连着协议,一段彼此相连。
evth-pair 充当一个桥梁,连接各种虚拟网络设备。
模型图:
结论:tomcat01 和 tomcat02 是公用的一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0,docker会给我们的容器分配一个默认的可用的IP。
Docker中所有的网络都是虚拟的。虚拟的转发效率高,内网传递!
7.4.1、–link
用名字就可以进行容器间的访问,解决网络连接的问题。
docker run -d -p --name tomcat02 --link tomcat01 tomcat
原理:就是在/etc/hosts 配置了绑定关系
–link 方式不建议使用,方式不方便
7.4.2、自定义网络
7.4.2.1、创建自定义网络
容器互联
docker network [option]
rm 移除网络
ls 查看所有的网络
create 创建网络,使用docker network create --help 查看
docker network create --driver bridge --subnet 192.168.0.00/16 --gateway 192.168.0.1 mynet
--driver bridge 网络模式
--subnet 子网范围
--gateway 网关
inspect 查看网络配置
网络模式:
bridge :桥接模式 (默认使用)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(很少用,局限很大)
容器配置网络:
# 直接启动默认使用bridge
docker run --net bridge
自定义网络可以相互ping同,访问;不同的集群使用不同的网络,可以保证各集群的健康,但是各网络之间也是可以打通。
7.4.2.2、打通不同网段的网络
docker network connect mynet tomcat01
# 查看
docker network inspect mynet
结论:假设要跨网络操作别人,就要使用docker network connect 连通