Docker 概述
Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
容器是与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
docker容器与虚拟机的区别?
docker容器 | 虚拟机 |
所有容器共享主机的内核 | 有自己的独立的操作系统和内核 |
通过namespace实现资源隔离 通过cgroup实现限制资源的最大使用量 | 完全隔离的 每个虚拟机都有自己独立的硬件资源分配 |
秒级启动 | 分钟级启动 |
容器相当于宿主机的进程,性能几乎没有损耗 | 需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问,会有一定的性能损耗 |
一个宿主机可以启动成百上千个容器 | 最多几十个虚拟机 |
Linux 六大 namespace
- MNT文件系统隔离
- NET网络资源隔离
- PID进程的PID隔离
- IPC进程间通信隔离
- UTS主机名隔离
- USER用户隔离
docker的三大核心概念
镜像:是创建容器的基础,是一个只读的模板文件,里面包含运行容器中的应用程序所需要的所有资料(比如应用程序执行文件、配置文件、动态库文件、依赖包、系统文件和目录等)
容器:是用镜像运行的实例,容器可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的
仓库:是用来集中保存镜像的地方,有公有仓库和私钥仓库之分
操作:
docker version 查看docker版本信息
docker info 查看docker详细信息
镜像操作
docker search 关键字 根据仓库或镜像的关键字搜索镜像
docker pull 镜像名:标签 下载镜像,如果不指定标签则默认使用 :latest
docker images 查看镜像列表,-q 表示仅显示镜像ID
docker ipspect 镜像名/id 查看镜像的详细信息
docker tag 旧镜像名:旧标签 新镜像名:新标签 添加新的镜像名或标签
docker rmi 镜像名或者镜像id -f 强制删除 删除镜像
docker save -o 文件路径 镜像名或者id 将镜像导出为文件
dokcer load -i 文件路径 将镜像文件导入docker
docker load < 镜像文件 从定向输入的方式将镜像文件导入docker
dokcer login 仓库地址 登录镜像仓库
docker push 仓库名/镜像名:标签 #上传镜像到仓库
演示:上传镜像倒仓库
先登录仓库
再修改标签 tag
再用push 上传到阿里云的vcdvd的命名空间中 叫myapp1:v1
docker push registry.cn-hangzhou.aliyuncs.com/vcdvd/myapp1:v1
将镜像导出为文件 再用文件恢复
docker save -o 文件路径/文件名 镜像名:标签
恢复
docker load < cat 文件名、
docker load -i 文件路径文件名
容器操作
docker create --name 名称 [-it] 镜像名:标签 [容器启动命令] 创建容器
docker start 容器名或容器ID 启动容器
docker ps -a 查看容器列表
docker ps -q 查看启动容器列表的id号
docker inspect 容器名/容器id 查看容器的详细信息
docker stop 容器名/容器id(-t 等待时间) 优雅停止容器,发送 SIGTERM 信号,默认等待10s
docker kill 容器名/容器id 停止容器,默认发送 SIGKILL 信号
docker rm 容器名或容器ID [-f 强制删除] 删除容器
docker exec -it 容器名或容器ID sh|bash 登录容器
docker logs 容器名/id
docker cp 宿主机目录 容器名/id:绝对路径 复制宿主机文件到容器中
docker cp 容器名/id:绝对路径 宿主机目录 复制容器文件到宿主机中
创建并启动容器
docker run [-i -d] [--name 容器名] 镜像名:标签 [容器启动命令] #创建并启动容器
docker run 的启动过程:
1.检查本地是否有指定镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器
2.在只读的镜像层上再挂载一层可读可写的容器层
3.从docker网桥给容器分配一个虚拟接口和IP地址
4.使用镜像的默认启动命令或docker run 指定的命令来启动容器,直到容器中的PID=1的主进程退出为止