1 定义

docker 是一种 Linux Container ,基于 Golang 开发,但与传统的LXC有所不同,特点主要包括版本控制,传输镜像等。
LXC:https://www.redhat.com/zh/topics/containers/whats-a-linux-container#%E5%AE%B9%E5%99%A8%E5%8E%86%E5%8F%B2
docker:https://www.redhat.com/zh/topics/containers/what-is-docker
它使用到了非常多的一些 Linux Kernel 本身的特性,比如:
使用 overlay UFS 实现镜像的多层级间的联合包括可写层的联立
使用 Bridge 与 VETH 联通了容器间的网络
使用 SNAT、DNAT 解决了容器对外,以及外部访问容器的网络方案
使用 NameSpace Network 进行容器的网络隔离,当然其他级别也在规模化使用,比如:IPC、User 等
使用 chroot 进行伪根模拟
使用 CGroup 进行容器的资源限制

2 和传统虚拟化的区别

docker

1、内核方面:容器内的应用进程直接运行于宿主机的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便
2、进程隔离:每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源,Docker通过Namespaces和Cgroups实现对应用程序的进程之间的隔离
3、启动时间:Docker启动属于秒级启动
4、性能损耗:Docker属于操作系统级别的虚拟化,通过Docker守护进程直接和内核进行交互,几乎没有性能损耗
5、轻量级:Docker更轻量,占用内存小,在同样的硬件环境下,Docker运行的镜像数量要远多于虚拟机数量

传统虚拟化

1、内核方面:传统虚拟机技术是虚拟出一套硬件后,在其运行一个完整操作系统,在该系统上再运行所需要应用程序
2、进程隔离:虚拟机从操作系统层面实现隔离,所以虚拟机的隔离性更强、安全性更好
3、启动时间:虚拟机启动需要几分钟去进行启动
4、性能损耗:虚拟机是硬件级别的虚拟化,需要通过Hypevisor层,性能损耗比较大

3 docker组成

Docker client:客户端
Docker daemon:守护进程(服务端)
Docker Image:镜像
Docker Container:容器
Docker Registry:仓库
image.png

  • docker客户端其实是一个命令行工具,用于和docker守护进程连接并通话。
  • 守护进程其实就是docker服务端,是运行在宿主机上的一个服务,作用:
    • 1.守护进程提供了REST API,docker命令行就是就是通过REST API与守护进程进行交互。image.png
    • 2.守护进程绑定在服务端一侧,默认安装docker后就启动,主要包括docker.socket:持续监听unix socket(client通过socket与服务器连接);docker.service:docker相关配置(设置镜像,启动容器等)。

docker笔记 - 图3

4 存储方式

为了实现数据的持久性,不建议docker采用默认存储方式,即容器内存储。而是采用宿主机存储方式,即通过将宿主机目录绑定或挂在到容器中使用,容器停止后数据也能持久化。

  1. docker run -it -v 宿主机目录:容器目录 --name .. ubuntu /bin/bash

宿主机目录和容器目录没有的话会默认自动生成

  • 容器间共享存储

首先运行一个容器
运行另一个容器时加入选项—volumes-from

问题记录