Docker

docker · 浏览次数 : 72

小编点评

**Docker 是什么?** Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 **以下是 Docker 的一些关键特性:** * **容器化:**容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。 * **轻量级:**容器是比传统虚拟机更轻量级的,可以轻松部署到任何流行的 Linux 机器上。 * **可移植性:**容器可以轻松移植到任何支持 Docker 的 Linux 机器上。 * **虚拟化:**容器可以实现虚拟化,就像传统的虚拟机一样运行多个应用程序。 * **安全:**Docker 通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。 **使用 Docker 的优点:** * **简化运维成本:**Docker 可以帮助开发者降低运维成本,因为容器可以轻松部署和管理。 * **提高效率:**容器可以帮助提高应用程序的效率,因为它们可以并行运行多个应用程序。 * **降低风险:**容器可以帮助降低应用程序的风险,因为它们可以轻松隔离应用程序。 * **简化开发:**Docker 可以帮助简化应用程序开发,因为它可以提供一个标准化的方式来构建和部署应用程序。 **使用 Docker 的缺点:** * **容器大小可能很大:**容器的大小可能很大,因为它包含了所有应用程序和依赖包。 * **可能占用大量系统资源:**在运行应用程序之前,容器可能会占用大量系统资源。 * **可能缺乏资源隔离:**容器之间可能存在资源共享,这可能会导致资源争夺。

正文

Docker是什么?

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Dockert使你的运维成本降低,并且更容易管理您的项目,很多人可能对于Docker认为就是简化的虚拟机?但是其实不然,

容器(Docker)其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样把你的应用‘装’起来,这样,应用和应用之间就因为有了边界而不至于互相干扰;而且被撞到集装箱的应用也可以被到处搬来搬去;

与传统虚拟机特性对比:

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:

  • Docker 容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。
  • Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
  • Docker 通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。
  • Docker 通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。
  • Docker 容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。
  • Docker 利用Linux系统上的多种防护机制实现了严格可靠的隔离。从1.3版本开始,Docker引入了安全选项和镜像签名机制,极大地提高了使用Docker的安全性。
特性 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 一般为MB(最小容器2.67MB) 一般为GB
性能 接近原生 弱于原生
系统支持量 单机支持上千个容器 一般几十个

容器隔离进程原理

假设你已经有一个Ubuntu操作系统,并且运行了Docker

接下来创建一个容器:

docker run -it busybox /bin/sh

-it 参数告诉了Docker项目在启动容器后,需要给我们分配一个文本输入输出环境,即TTY,跟容器的标准输入相关联,这样我们就可以和这个Docker容器进行交互了。而 /bin/sh就是我们Docker容器中运行的程序。

这样,我的服务器就变成了宿主机,而一个运行着/bin/sh的容器就在这个宿主机里运行。

对于上面的例子和原理,如果你已经玩过Docker,相比不会陌生,此时,如果在容器中执行ps就会发现有趣的事情:

可以看到,在Docker里最开始执行的/bin/sh就是这个容器内部的第一好进程(PID =1),

而这个容器一共有俩个进程在运行,这就意味着,前面执行的/bin/sh以及ps,已经被Docker隔离在一个跟宿主机完全不同的世界。

本来,每当我们在宿主机上运行一个/bin/sh程序,操作系统都会给它分配一个PID(进程号),比如PID=100 。这个编号是进程的唯一标识,就像是你的身份证一样。

现在,我们要通过Docker在容器当中运行这个/bin/sh程序,这时,Docker就会在这个100号创建的时候给他施展一个'障眼法',让他永远看不到前面的99的进程,这样它就会误认为自己就是1号进程。

这种机制其实就是对被隔离的应用的进程空间动手脚,使得这些进程只能‘看到‘重新计算过的PID,比如PID=1,可实际上,在宿主机的操作系统里它还是100号进程。

这种技术技术Linux 中的 Namespace机制。Namespace的使用方式也很有意思:它其实只是Linux创建新进程的一个可选参数。

安装Docker

安装命令如下

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

或者使用国内 daocloud 一件安装

curl -sSL https://get.daocloud.io/docker | sh

注:如果存在旧版本请先卸载

 sudo apt-get remove docker docker-engine docker.io containerd runc

Docker 常用命令指南

docker tag <image> <repository>:<tag>                                               # 标记镜像
docker pull <repository>:<tag>                                                      # 从docker hub下载镜像
docker rmi <image>                                                                  # 删除镜像
docker images                                                                       # 查看镜像
docker run -d -p 8080:8080 <image>                                                  # 启动容器
docker ps                                                                           # 查看容器
docker exec -it <container> bash                                                    # 在容器中执行命令
docker stop <container>                                                             # 停止容器
docker rm <container>                                                               # 删除容器
docker rmi <image>                                                                  # 删除镜像
docker images -a                                                                    # 查看所有镜像
docker images -f "dangling=true"                                                    # 查看未使用的镜像
docker images -f "dangling=true" -q                                                 # 查看未使用的镜像id
docker images -f "dangling=true" -q | xargs docker rmi                              # 删除未使用的镜像
docker images -f "dangling=true" -q | xargs docker rmi -f                           # 强制删除未使用的镜像
docker images -a | grep <image>                                                     # 查看镜像是否存在
docker images --help                                                                # 查看docker images命令帮助
docker image prune                                                                  # 删除未使用的镜像
docker iamge                                                                        # 查看镜像
docker ps                                                                           # 查看正在运行的容器
docker ps -a                                                                        # 查看所有容器(包括未运行的容器)
docker stop  容器名称|容器id                                                         # 停止容器
docker rm    容器名称|容器id                                                         # 删除容器
docker rmi   镜像名称|镜像id                                                         # 删除镜像
docker run -d -p 80:80 --name=nginx nginx                                           # 启动容器
docker exec -it 容器名称|容器id /bin/bash                                            # 进入容器
docker system prune -f 								    # 强制删除build缓存 

与Docker 相似的内容:

从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“

本文为从零开始写 Docker 系列第十八篇,利用 linux 下的 Veth、Bridge、iptables 等等相关技术,构建容器网络模型,为容器插上”网线“。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实

Docker部署深度学习模型

Docker部署深度学习模型 基础概念 Docker Docker是一个打包、分发和运行应用程序的平台,允许将你的应用程序和应用程序所依赖的整个环境打包在一起。比如我有一个目标检测的项目,我想分享给朋友,那么他首先需要在自己的电脑上配置好显卡驱动、CUDA、CuDNN,在拿到我的项目后,还需要安装各

从零开始写 Docker(十七)---容器网络实现(中):为容器插上”网线“

本文为从零开始写 Docker 系列第十七篇,利用 linux 下的 Veth、Bridge、iptables 等等相关技术,构建容器网络模型,为容器插上”网线“。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实

从零开始写 Docker(十六)---容器网络实现(上):为容器插上”网线”

本文为从零开始写 Docker 系列第十六篇,利用 linux 下的 Veth、Bridge、iptables 等等相关技术,构建容器网络模型,为容器插上”网线“。

Docker 必知必会4----容器之间的通信

前面几篇文章,我们聊了docker的基本概念,以及基本的操作手段: https://www.cnblogs.com/jilodream/p/18177695 初识dockerhttps://www.cnblogs.com/jilodream/p/18184687 基本操作https://www.cn

Docker 必知必会3----使用自己制作的镜像

前面的两篇文章分别讲了,docker的基础概念,设计思路以及docker的基本操作。感兴趣的同学可以查阅: https://www.cnblogs.com/jilodream/p/18177695https://www.cnblogs.com/jilodream/p/18184687 本文我们将介绍

Docker 必知必会2----跟我来一步步执行基本操作

通过前文(https://www.cnblogs.com/jilodream/p/18177695)的了解,我们已经大致明白了什么是docker,为什么要用docker,以及docker的基本设计思路是什么。今天来看下,docker的基本操作有哪些? 1、linux下安装docker 首先我们来安装

Docker 必知必会----初识

什么是Docker?Docker 是一个开源的容器管理引擎。开发者可以通过Docker直接管理应用程序所需要的容器。它的logo如下: 为什么需要Docker使用Docker主要有两个原因,1、屏蔽不同环境的硬件差异,减轻开发人员在不同环境上,为了适配环境差异所需要做的工作。如各项系统配置、环境变量

使用 Docker 自建一款怀旧游戏之 - 扫雷

1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷。每个方块上都标有数字,表示周围 8 个方块中包含的地雷数量。玩家需要根据这些数字来推断哪些方块是安全的,以

使用 Docker 自建一款怀旧游戏之 - 超级马里奥

1)超级马里奥 简介 《 超级马里奥 》(Super Mario)是任天堂公司创造的一款经典游戏系列,是世界上最知名、最成功的游戏之一。这个系列由日本设计师宫本茂于 1985 年创造,最初的游戏名为《超级马里奥兄弟》(Super Mario Bros.),推出后风靡全球。 2)在线部署 2.1)安装