前言
目前正在出一个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
命令拉取镜像
shell
docker pull hello-world
2.查看是镜像列表
shell
docker images
- 输出
shell
docker.io/hello-world latest feb5d9fea6a5 2 years ago 13.3 kB
3.启动容器
shell
docker run hello-world
- 输出
shell
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
命令~
本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注
鼓励一下呗~
Shell脚本编程相关文章
- 一起来学Shell脚本编程(一)
- 一起来学Shell脚本编程(二)
- 一起来学Shell脚本编程(三)
- 一起来学Shell脚本编程(四)
- 一起来学Shell脚本编程(五)
- 一起来学Shell脚本编程(六)
- 一起来学Shell脚本编程(七)
往期Linux相关文章
- 一起来学Linux命令(一)
- 一起来学Linux命令(二)
- 一起来学Linux命令(三)
- 一起来学Linux命令(四)
- 一起来学Linux命令(五)
- 一起来学Linux命令(六)
- 一起来学Linux命令(七)
- 一起来学Linux命令(八)
- 一起来学Linux命令(九)
- 一起来学Linux命令(十)
往期面试题相关文章
- 查漏补缺第一期(Redis相关)
- 查漏补缺第二期(synchronized & 锁升级)
- 查漏补缺第三期(分布式事务相关)
- 查漏补缺第四期(Mysql相关)
- 查漏补缺第五期(HashMap & ConcurrentHashMap)
- 查漏补缺第六期(京东一面)
- 查漏补缺第七期(美团到店一面)
- 查漏补缺第八期(阿里一面)
- 查漏补缺第九期(阿里二面)
- 查漏补缺第十期(网易实习一面)
- 查漏补缺第十一期(网易实习二面)
- 查漏补缺第十二期(网易实习三面)
- 查漏补缺第十三期(滴滴实习一面)
- 查漏补缺第十四期(滴滴实习二面)
- 查漏补缺第十五期(华为一面)
- 查漏补缺第十六期(华为二面)
- 查漏补缺第十七期(华为三面)
- 查漏补缺第十八期(你了解class文件吗)
项目源码(源码已更新 欢迎star⭐️)
往期设计模式相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
- 一起来学设计模式之中介者模式
- 一起来学设计模式之备忘录模式
- 一起来学设计模式之观察者模式
- 一起来学设计模式之状态模式
- 一起来学设计模式之策略模式
- 一起来学设计模式之模板方法模式
- 一起来学设计模式之访问者模式
- 一起来学设计模式之依赖注入模式
设计模式项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看