docker官网
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker的主要目标是‘build ,ship and run any app,anywhere’,也就是说通过对应用程序组件的封装,分发,部署,运行等生命周期的管理。使用户的app(可以是一个web应用程序或者数据库应用等)及其运行环境能够做到‘一次封装,到处运行’。
Linux容器技术的出现解决了这个问题。而docker就是基于他的基础上发展过来的。将应用运行到docker容器上面,而docker容器在任何操作系统上都是一致的,这就是实现跨平台跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
Docker实际上就是一个虚拟化轻量级linux服务器,可以解决我们在开发环境中运行配置问题。
Docker:虚拟化容器技术
Docker主要解决我们开发环境配置迁移的问题。
我们现在开发了一个javaweb项目,需要依赖很多环境配置 比如:Tomcat、JDK环境、Nginx、Redis环境等。
本地需要安装这些环境Tomcat、JDK环境、Nginx、Redis环境等,在打war包给运维部署在linux服务器,运维人员也需要在linux服务器上安装Tomcat、JDK环境、Nginx、Redis环境。
但是有时候可能会发生这些问题:我在本地运行环境没有问题,但是打包到Linux服务器运行总是遇到很多错误,大多数由于一些版本冲突影响。
所以在这时候我们就可以使用docker部署和安装软件就非常方便,直接将该springboot项目制作成一个镜像文件,镜像文件中包含jdk版本 tomcat版本信息 直接部署linux即可,减少依赖冲突概率。
虚拟机: 在一台物理机器上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。
从下到上理解上图:
Docker : Docker是开源的应用容器引擎
特性 | Docker | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级别 |
硬盘使用 | 一般为MB | 一般GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 完全隔离 | 完全隔离 |
简单理解为就是一个安装包,里面包含容器所需要运行的的基础文件和配置信息,比如:redis镜像、mysql镜像等。
镜像的来源方式:
容器就是镜像运行的实例,容器状态分为:初创建、运行、停止、暂停、删除, 一个镜像可以创建多个不同的容器。
每个镜像文件都有自己独立ip信息—轻量级的linux服务器 虚拟化
比如:镜像就是类 容器就是实例对象
仓库可以简单理解为,专门存储镜像文件仓库, 类似于谷歌手机市场,统一在谷歌手机市场下载开发者的安装包。
Docker 公开仓库地址: Docker hub
hub
docker --help 帮助命令
docker -version 查看版本信息
docker images 查看本地images 镜像缓存
docker images -a
docker images -q ---只显示镜像的id
docker images --digests ---显示镜像的摘要信息
docker images --no-trunc ---显示完整镜像信息
docker rmi 镜像id 删除镜像文件根据id
docker rmi -f hello-world 删除镜像文件根据名称
docker search mysql 在仓库里面查找mysql镜像
docker pull mysql 默认拉取最新版本的mysql
latest代表最新的版本
docker run 镜像名
docker ps 查看正在运行的容器
docker ps -a 查看运行和已经运行关闭的容器(所有)
docker stop 容器id 关闭容器
docker start 容器id 启动容器
docker rm 容器id 删除容器
# 查看容器信息
docker ps 获取到容器id
docker inspect 1e07cc5cc78d 查看容器信息
docker运行镜像命令详解
docker run
-i(保持容器一直运行)
-t(给容器一个伪终端)
-d(后台运行,不直接进入容器)
–name=tomcat9.2(给启动容器起名字)
-p 8080:8080(宿主:docker容器)
tomcat:9.2(启动的容器) 【参数】(加入容器初始化命令)
docker run -dit --name 镜像名 -d -p 端口:端口 镜像名
从打包到运行再到停止删除流程
先docker ps查看,
然后docker stop 停止,
然后docker rm 删除,
然后docker images 查看镜像,
docker rmi 删除镜像,
上传文件 jar包,
然后docker build -t 自定义镜像名字 . #后面有逗号
然后运行镜像
#通过 -it 启动的容器有两个特点 一创建就进入容器 exit退出容器 容器就会停止运行 ---交互式容器
#通过 -id 创建的容器 docker exec -it tomcat9.2(--name起的名称)进入容器 exit退出容器 容器不会停止运行 ---守护式容器
docker exec 参数 进入容器
docker run mysql
简单描述:首先会先从本地获取获取mysql镜像文件,如果本地没有该镜像文件则会去阿里云仓库查找该镜像文件,如果阿里云仓库也没有该镜像文件,则会报错找不到镜像文件。
获取到镜像文件之后直接运行。
详细描述:
每个容器都有自己独立的网络 ip信息 运行成功 就是一个轻量级linux操作系统
# 首先使用下面的命令,查看容器ID(CONTAINER ID):
docker ps -a
# 然后用下面的命令进入容器,就可以使用bash命令浏览容器里的文件:
docker exec -it [CONTAINER ID] bash
# 有的镜像没有bash命令,可以用对应的shell,比如sh
docker exec -it [CONTAINER ID] sh
Linux文件系统由bootfs和rootfs两部分组成
Docker镜像底层实际上是有多个不同的联合文件系统组成的
最底层:bootfs,并使用宿主机的bootfs-复用
第二层:root文件系统rootfs,称为base image Union fs
然后再往上可以叠加其他的镜像文件
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,隐藏多层的存在,我们看来只是存在一个文件系统。
因为当我们安装的tomcat镜像大小是600多MB时是因为里面还包含了jdk和centos的镜像而centos镜像复用了宿主机的bootfs 下载的只有rootfs 所以小很多
因为tomcat -> jdk(父镜像)->centos 所以整个向外暴露就是600MB
镜像只读 当从一个镜像启动容器时, docker会在镜像上面加载一个可读可写的文件系统作为容器运行。
主要作用:根据当前容器制作为镜像文件
如:
docker commit 提交容器副本使之成为一个新的镜像
命令:
docker commit -m=“提交的描述信息” -a=“作者名” 容器ID 要创建的目标镜像名:[标签名]
操作:
docker run -p 8081:8080 tomcat:8
进入容器
docker exec -it 3a06b4c779a8 bash
打开文件夹
cd webapps
新建文件夹
mkdir test
新建文件
touch index.html
向文件里面追加内容
echo "test Docker Commit" >>index.html
构建镜像
docker commit -m="test Docker Commit" -a="tujr" 3a06b4c779a8 test-Docker-Commit:1.0
运行新镜像
docker run -p 8088:8080 test-Docker-Commit:1.0
数据卷就是宿主机上的一个文件或目录
当容器目录和数据卷(宿主机)目录绑定,双方修改会立即同步操作一个数据卷可以被多个容器同时挂载
数据卷作用: 容器数据的持久化,外部机器和容器间接通信容器之间数据交换使用 -v命令。
数据卷添加的方式
容器内与宿主机实现数据的共享
数据卷–添加两种方式
ps aux | grep 'docker'
一个镜像文件到底是如何创建?
下一篇单独讲解DockerFile
Docker Compose 容器编排技术
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
开发一个springboot项目—大工程
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
Compose 中有两个重要的概念:
Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
Docker-Compose分成两层
Portainer是一款Docker可视化管理工具,允许我们在网页中方便的查看和管理Docker容器。
要使用Portainer很简单,运行下面两条命令即可。这些命令会创建一个Portainer专用的卷,然后在8000和9000端口创建容器并运行
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer