一起来学Docker(一)

前言

目前正在出一个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?

如何实现资源隔离

通过CgroupNamespace实现了资源的隔离,从而实现了轻量级的虚拟化;主机通过CgroupNamespace将整个服务器划分为多个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脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)

相关推荐
码农小旋风1 小时前
详解K8S--声明式API
后端
Peter_chq1 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml41 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~1 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616881 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
追风林2 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
睡觉谁叫~~~2 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
城南vision4 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge4 小时前
Docker篇(Docker Compose)
运维·docker·容器
2401_865854884 小时前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone