Docker介绍
Docker是一个开源的容器引擎,它有助于快速交付应用,Docker可将应用程序和基础设施层隔离,使用Docker能够快速打包测试以及部署应用程序,缩短编写到部署运行代码的周期
看下Docker架构图
Docker Damemon—Docker守护进程,Docker daemon运行在宿主级的后台进程,通过Docker client与之通信。
Docker Client—Docker客户端接受用户命令和配置标识,与Docker daemon通信,比如图中接受docker pull,docker build等命。
Images—Docker镜像是一个只读模板,用于创建容器,好比我们的iso文件安装虚拟机。
Container—容器是镜像运行的实例,镜像和容器就好象类和实例一样。
Registry—Docker Registry是一个集中存储和分发镜像的服务,构建完Docker镜像之后想在其他机器与性,需要手动复制,但是有了Docker Registry就可以避免复制,类似Maven仓库,官方有Docker Hub,也可以自己搭建私有Registry。
VM和Docker的区别
虚拟机:虚拟机模拟整台机器包括硬件,虚拟机需要自己的操作系统,虚拟机开启分配给他的资源全部被他占用,每个虚拟机包括应用和必要的二进制库,以及一个操作系统。
Docker:容器技术和宿主机共享操作系统和硬件资源实现资源动态分配。
首先来看看VM和Docker的架构图
vm与docker框架,直观上来讲vm多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化(Hypervisor会带来性能消耗),docker直接使用硬件资源,所以资源利用率相对docker低也是比较容易理解的。
用个类比来简单说明一下
1.物理机是这样的
2.虚拟机是这样的
3、容器是这样的
对比
1.docker启动属于秒级,虚拟机通常需要几分钟。Docker的快速迭代性,决定无论开发、测试、部署都可以节约大量时间。
2.docker需要的资源少,docker容器和内核交互,几乎没什么性能消耗,性能肯定比通过Hypervisor与内核交互的虚拟机。
3.docker更加轻量级,因为容器共用一个内核和共享应用程序库,所占内存小,同样硬件情况下,运行的Docker容器数量远多于虚拟机数量。
4.docker属于进程间的隔离,虚拟机可以实现系统级别的隔离,所以隔离性不如虚拟机。
5.docker的租户root跟宿主级root等同,一旦容器内用户从普通用户提升为root,它就直接具备宿主级root权限,可以随意操作,虚拟机的root和宿主级root完全隔离,而容器目前至今还没任何形式的硬件隔离,所以容器的安全性弱于虚拟机。
6.交付部署方面,虚通机通过镜像实现环境交付的一致性,但是镜像分发无法体系化,Docker在Dockerfile记录容器构建过程,可以在集群中实现快速分发和部署。
基本概念
- docker image:docker镜像,其中包含有需要运行的文件,镜像用来创建container,一个镜像可以创建成多个container,镜像就像我们下载的iso文件一样,镜像可以在docker hub上下载或者使用docker pull
- docker container:容器是docker的运行组件,run一个镜像就是启动了一个新的容器,启动以前的容器用start,容器是一个隔离环境,多个容器之间互不影响。
- docker hub:共享和管理docker镜像,用户可以把自己的diy自己的容器打包成image并且上传到docker hub上。https://registry.hub.docker.com/。
安装和使用docker
对应到不同的平台安装过程不太一样,lz使用arch系使用yaourt安装,使用systemctl start 来启动Docker Daemon
常见命令使用
1.搜索docker registry(默认DockerHub)中的镜像,查询结果中第一列为镜像名字,二三列标识是否未官方镜像。
2.拉去镜像仓库的镜像到本地,不指定标签拉去最新的latest,就像我们maven仓库的jar包版本一样
配置镜像加速,配置 /etc/docker/daemon.json文件1
2
3{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
3.启动postgres容器
使用如下命令我们就能启动一个postgres容器,并且指定数据库密码,指定暴露给宿主记得端口
1 | docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres |
4.查看启动的容器,-a参数查看所有的容器
5.进入一个启动的容器,使用容器ID或者容器的名称1
docker exec -ti 1d58db94039f /bin/bash
6.导入导出镜像1
2
3
4
5docker save image_name(container) > /xxx/xxx.tar
docker load -i xxx.tar
docker export -o xxx.tar container
docker import xxx.tar image_name:image_tag
两种导入导出的区别
- docker save保存的是镜像(image),docker export保存的是容器(container)
- docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像
- docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称
7.数据卷
Docker中的数据卷是一个特殊目录,可以多容器共享,就像VirtualBox虚拟机的共享挂载目录。数据卷一直存在跟容器是否存在没有关系。
两种方式1
2
3
4
5
6
7
8
9
10-v 模式
docker run -d -name nginx_111 -v 宿主机挂载目录:容器挂载目录 nginx:latest
-Mount模式
先创建一个volume
docker volume create test_volume
使用如下,启动一个nginx容器,挂载容器下的/usr/local/nginx目录
docker run -d --mount source=test_volume,target=/usr/local/nginx nginx
docker inspect test_volume查看挂载详情
常见命令列表
1 | docker pull image_name:tag (docker pull hello-world 拉取最新的) 拉取最新docker镜像的命令 |