前言
目前正在出一个Docker
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
Docker
大家应该都听说过,特别是在当今云原生爆火的时代,更值得我们去学习,下面会带大家系统性的认识一下Docker
,并结合一些例子,让大家快速上手~
好了, 废话不多说直接开整吧~
什么是Docker
Docker
是一个开源的应用容器引擎,基于Go
语言 并遵从 Apache2.0
协议开源。我们可以将应用以及依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux
机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口, 容器性能开销极低。
我们知道发布一个应用到服务器上,要考虑到很多环境问题,但是使用Docker
之后,我们就不用担心环境问题了,可以非常方便的交付应用,只需要在对应的机器上运行我们打包好的容器即可。
Docker
其实是在LXC
的基础上(1.5之后不再默认使用LXC
)提供了一个高层的容器引擎,主要优势:
- 轻量级资源使用、资源隔离。容器在进程级别隔离并使用宿主机的内核,而不需要虚拟化整个操作系统。容器可以使用自己的
cpu、memory
等。 - 可移植性。跨主机部署,
Docker
镜像屏蔽了不同OS
差异,它可以将环境配置进行抽象和应用打包,保证在不同的硬件机器上都可以部署。 - 以应用为中心、自动构建、版本管理、组件重用、镜像共享。
与VM相比
传统VM
的镜像只是基础镜像
,docker
镜像是基础加应用
,是一个软件从最顶层一直到最底层系统库的完整依赖栈。有了这样一个完整的依赖栈,再加上容器技术的隔离性,就能在任何地方把应用启动起来,且保证行为一致,只要内核在docker
要求的最低版本之上就行【并不是模拟一个完整的OS】。
虚拟机的缺点:需要Hypervisor
实现硬件资源虚拟化,内存资源占用高;启动慢,需要加载OS;
容器的实质是进程
,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。 容器销毁
,数据随之被删除。任何保存于容器存储层的信息都会随容器删除而丢失
。
安装Docker
Docker
是一个C/S
架构的程序,Docker Client
是客户端,Docker daemon
是服务端。 我们可以通过[官网下载](https://www.docker.com/get-started/)
,来进行安装(根据你系统选择安装),安装步骤很简单,直接点就完了
首次启动可能会有点慢,要等待一会时间~
终端执行docker ps
,如果没启动会报服务没启动的错误 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
如何实现资源隔离
通过Cgroup
和Namespace
实现了资源的隔离,从而实现了轻量级的虚拟化;主机通过Cgroup
和Namespace
将整个服务器划分为多个bins/libs
,每个应用程序
运行在独立的bins/libs
中,每个bins/libs
相当于从服务器中划分出的独立的资源
Docker/libcontainer
:前者基于后者,前者处理上层业务,后者与内核交互,管理namespaces、cgroups、capabilities
以及文件系统,为前者提供处理容器的创建(Factory
)、容器生命周期管理(Container
)、进程生命周期管理(Process
)等一系列接口
当需要为Docker
创建网络环境时,通过网络管理驱动networkdriver
创建并配置Docker
容器网络环境;当需要限制Docker
容器运行资源或执行用户指令等操作时,则通过execdriver
来完成。而libcontainer
是一项独立的容器管理包,networkdriver
以及execdriver
都是通过libcontainer
来实现具体对容器进行的操作。
镜像
Docker
通过把应用的运行时环境和应用打包在一起,解决了部署环境依赖的问题; 通过引入分层文件系统这种概念,解决了空间利用率的问题; 不同的容器可以共享底层的只读镜像,通过写入自己特有的内容后添加新的镜像层,新增的镜像层和下层的镜像一起又可以作为基础镜像被更上层的镜像使用。这种特性可以极大地提高磁盘利用率。
Docker
镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker
会加载只读镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker
容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker
中,只读层及在顶部的读写层的组合被称为Union File System
(联合文件系统)。 【对文件系统的修改作为一次commit
来一层层地叠加】Union FS
包括bootfs
(引导文件系统)和rootfs
。如centos
镜像很小的原因(完整版4G,镜像200M
),即与宿主机共用了bootfs
,仅自己打包了rootfs
部分。
光速入门
下面带着大家快速体验一下,Docker
如何运行一个应用,主要分为以下几个步骤:
1.需要准备一个打包好的镜像,这里我们直接从docker hub
远程仓库拉取,当然镜像也可以本地进行制作,这个后边教大家
- 使用
docker pull image
命令拉取镜像
docker pull hello-world
2.查看是镜像列表
docker images
- 输出
docker.io/hello-world latest feb5d9fea6a5 2 years ago 13.3 kB
3.启动容器
docker run hello-world
- 输出
Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
这个是容器运行过程中输出的日志,说明我们应用成功被运行了~
结束语
本节到这里就结束了,docker
命令很多,大家不要去背,如果忘了可以使用docker -h
进行查看,下节给大家讲解一些常用的docker
命令~
本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注
鼓励一下呗~