目录
是什么
Docker就是虚拟化的一种轻量级替代技术,基于容器的虚拟化,是阉割后的操作系统,仅包含应用程序所需要的运行时环境。
镜像
- Docker镜像一次构建,到处运行,可以理解为运行环境的打包封装。
- 也可以理解为是一个只读的模板。
- Docker镜像可以用来创建Docker容器,一个镜像可以创建多个容器。
容器
- Docker容器就是将软件运行所需的所有资源打包到一个隔离的容器中。
- 它是用Docker镜像创建的运行实例,每个容器都是相互隔离的。
- Docker自己本身是一个容器运行的载体或者叫做管理引擎。
Docker hub
Docker hub就是用来存Docker镜像的仓库。
镜像和容器的关系
- 镜像文件包含了应用程序所需要的运行时环境,然后通过镜像文件生成Docker容器。
- 所以镜像就是容器的模板,Docker可以根据镜像生成容器实例。
- 同一个镜像文件,可以生成多个容器。
优势
Docker利用的是宿主机的内核,不需要和虚拟机一样重新加载一个操作系统的内核,而是直接利用宿主机的操作系统。
Docker和虚拟机的区别
- Docker镜像小,没有额外的性能损失,虚拟机镜像庞大,有额外的CPU和内存消耗。
- Docker更加轻便,灵活,而且共享CUP的内核,虚拟机太过于笨重。
联合文件系统
- 联合文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来 一层一层的叠加,同时还可以将不同目录挂载到同一个虚拟文件系统下面。
- 联合文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具 体的应用镜像。
- 联合文件系统可以一次同时加载多个文件系统,但是从外面来看,只能看到一个文件系统,联合加载 会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
镜像加载原理
- Docker的镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统叫做联合文件系统。
- bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootts 文件系统,在Docker镜像的最底层是bootfs。当boot加载完整个内核都在内存中,此时内存的使用权 已由bootfs转交给内核,此时系统也会卸载bootfs。
- rootfs,在bootfs之上,包含Linu系统标准目录和文件。就是各种不同操作系统发行版,比如Ubuntu, CentOS等等。
分层的镜像
- Docker的镜像是一层一层的在下载。好处是共享资源。比如多个镜像都从相同的基础镜像构建,宿主 机只需要在磁盘保存一份基础镜像,同时内存中也只需要加载一份基础镜像,就可以为所有的容器服 务,镜像的每一层都可以被共享。
- Docker的镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层是容器层, 容器层下面的都叫做镜像层。
- docker commit命令可以从容器中创建一个新的镜像。
数据卷
是什么
- Docker的数据卷指的是容器目录和主机目录的映射。
- 就是把容器内的数据进行备份然后持久化保存到主机目录上。
- docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
特点
- Docker的数据卷可在容器之间共享或者重用数据。
- 数据卷中的更改可以实时的生效。
- 但是数据卷中的更改不会包含在镜像的更新中。
- 而且数据卷的生命周期一直持续到没有容器使用它为止。
数据卷容器
如果把某个容器挂载上了数据卷,其它的容器都可以通过挂载数据卷的这个容器来实现数据共享,挂载数据卷的容器就是数据卷容器。
Dockerfile
是什么
Dockerfile就是用来构建Docker镜像的文件。
构建镜像
- 可以指定Dockerfile文件的具体目录路径来构建Docker镜像:
docker build -f /mydocker/dockerfile2 -t mycentos:1.3 .
- 也可以在Dockerfile文件的当前目录下面直接构建Docker镜像:docker build -t mycentos:1.3 .
虚悬镜像
- 虚悬镜像就是仓库名,标签都是<none>的镜像,也叫做dangling image。
- 查看:docker image ls -f dangling=true
- 删除:docker image prune。
网络
是什么
- Docker网络可以让容器之间相互通信还可以进行端口映射。
- 如果容器的IP地址有变化,就可以通过Docker的服务名来直接进行网络通信。
网络模式
bridge
- bridge指的是Docker的网桥。
- Docker的服务默认会创建一个叫docker0的网桥,它将所有的容器和本地的主机都放到同一个物理网 络中。
- Docker默认指定了docker0的IP地址和子网掩码,所以才能让主机和容器之间可以通过docker0网桥 来相互通信。
host
host指的是可以直接使用宿主机的IP地址与外界进行通信,不再需要进行额外的NAT转换。
none
none指的是禁用网络功能。
container
container指的是新建的容器和已经存在的某个容器共享同一个网络配置而不是和宿主机的配置进行共享。
docker compose
是什么
docker compose可以对容器进行批量编排。
两要素
- 在docker compose中,每一个service就是一个应用容器的实例。
- 当一组相互关联的应用容器组成一个完整的业务单元时,就是一个project。
三步骤
- 编写Dockerfile文件定义各个微服务应用并构建出对应的镜像文件。
- 使用docker-compose.yml定义一个完整的业务单元,编排好各个容器的实例。
- 执行docker compose config -q检查配置,有问题会输出。
- 执行docker compose up -d启动并在后台运行整个应用程序。
停止并删除所有容器
docker stop $(docker ps -aq) & docker rm $(docker ps -aq) #停用并删除全部容器。
项目发布
cd /root/devops #cd到docker compose目录下
docke compose config -q #检测一下配置,有问题会输出。
docker compose build #重建服务。
docker compose down #停止并删除容器,网络,卷,镜像。
docker compose up -d #启动所有docker compose服务并后台运行。
docker logs gis_protocolmapping -f #输出日志,看服务是否报错。
集群中查询日志
sudo su -
docker service ls
docker exec -it 040be64b4fda sh
cd /etc/envoy/logs
less request_log | grep -in ERROR
systemctl restart 4gms-CAD_DispatchSrv.service