了解【Docker】从这里开始

1、环境配置的难题


软件开发最大的难题之一就是环境配置的问题。如今用户环境纷乱复杂,而且因为开源社区的进一步推广和许多开源项目不停地迭代更新,项目可能会有愈来愈多的依赖以及愈来愈难管理的依赖版本,如何保证编写的程序能不仅是在“个人电脑上能运行”(It works on my machine)成了一个复杂麻烦的事情。html

因而就有人提出:能不能从根本上解决问题,让软件能够自带环境安装?也就是说,安装的时候,把原始环境如出一辙地复制过来。linux

虚拟机

虚拟机(virtual machine)就是一种自带环境安装的解决方案。它能够在一个操做系统里面运行另外一个操做系统,好比在 Windows 系统里运行一个 Linux 的操做系统。git

应用程序对虚拟机是毫无感知的,由于虚拟机看上去跟真实的操做系统如出一辙,并且对于底层的系统来讲,虚拟机就是一个普通文件,不须要了就删除,对其余部分毫无影响。github

虽然用户能够经过虚拟机还原软件的原始环境。可是,该方案有如下的几个缺点:docker

1. 资源占用多shell

虚拟机会独占一部分本属于操做系统的内存和硬盘空间。它运行的时候,其余程序就不能使用这些资源了。哪怕你想在虚拟机里面使用的应用程序它实际只会占用 1MB 的内存,虚拟机仍然须要几百 MB 的内存才能运行。macos

2. 冗余步骤多ubuntu

虚拟机是完整的操做系统,一些系统层面上的操做步骤,每每没法调过,好比用户登陆。segmentfault

3. 启动慢api

启动操做系统须要多久,启动虚拟机就须要多久。可能要等几分钟,才能让应用程序真正的运行起来。

Linux 容器

因为虚拟机存在上述的这些缺点,Linux 提出了另外一种虚拟机化技术:Linux 容器(Linux Containers,缩写 LXC)。

Linux 容器不是模拟一个完整的操做系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来讲,它接触到的各类资源都是虚拟的,从而实现与底层系统的隔离。

因为容器是进程级别的,相比虚拟机有不少优点。

1. 启动快

容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。因此,启动容器至关于启动本机的一个进程,而不是启动一个操做系统,速度就快不少。

2. 资源占用少

容器只占用须要的资源,不占用那些没有用到的资源;虚拟机因为是完整的操做系统,不可避免要占用全部资源。另外,多个容器能够共享资源,虚拟机都是独享资源。

3. 体积小

容器只要包含用到的组件便可,而虚拟机是整个操做系统的打包,因此容器文件比虚拟机文件要小不少。

总之,容器有点像轻量级的虚拟机,可以提供虚拟化的环境,可是成本开销小得多。

2、什么是 Docker?


Enterprise Container Platform for High-Velocity Innovation
Securely build, share and run any application, anywhere

译:
企业高速容器平台
在任何地方安全的建造、分享、运行你的应用程序

官方对 Docker 的定义是一个容器平台。简单来讲,Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。开发人员能够利用 Docker 来消除协做编码时 “在个人电脑上能够正常工做” 的问题。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行同样。有了 Docker,就不用担忧环境问题。

整体来讲,Docker 的接口至关简单,用户能够方便地建立和使用容器,把本身的应用放入容器。容器还能够进行版本管理、复制、分享、修改,就像管理普通的代码同样。

为何要使用 Docker?

Docker 是一个为开发者和运维者去开发、发布和在容器中运行应用的平台。使用 Linux 容器来部署应用程序被称为容器化。 容器不是新的概念,它的优点在于很容易发布一个应用。

容器化变得很是的流行,由于容器化具备如下的优势:

  • 灵活:即便最复杂的应用也可以被容器化。
  • 轻量:容器最大化利用和分享主机的内核。
  • 可互换:你能够即时部署更新和升级应用。
  • 便捷:你能够在本地构建应用,并部署到容器云,并在任何地方运行。
  • 可扩展:你能够增长和自动分发容器的个数。
  • 可堆叠:您能够垂直堆叠服务并即时堆叠服务。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽可能小。传统虚拟机方式运行 10 个不一样的应用就要起 10 个虚拟机,而Docker 只须要启动 10 个隔离的应用便可。

具体说来,Docker 在以下几个方面具备较大的优点。

1. 更快速的交付和部署

对开发和运维(devop)人员来讲,最但愿的就是一次建立或配置,能够在任意地方正常运行。

开发者可使用一个标准的镜像来构建一套开发容器,开发完成以后,运维人员能够直接使用这个容器来部署代码。 Docker 能够快速建立容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其余成员更容易理解应用程序是如何建立和工做的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

2. 更高效的虚拟化

Docker 容器的运行不须要额外的 hypervisor 支持,它是内核级的虚拟化,所以能够实现更高的性能和效率。

3. 更轻松的迁移和扩展

Docker 容器几乎能够在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、我的电脑、服务器等。 这种兼容性可让用户把一个应用程序从一个平台直接迁移到另一个。

4. 更简单的管理

使用 Docker,只须要小小的修改,就能够替代以往大量的更新工做。全部的修改都以增量的方式被分发和更新,从而实现自动化而且高效的管理。

Docker VS VM

容器和虚拟机对资源的隔离和分配有相同的优点,但不一样的是容器虚拟化操做系统而不是硬件,这使得容器更加的方便和高效。

一个容器是在 Linux 服务本地运行,并和其余的容器共享主机的内核。它运行在一个独立的进程中,相对于其余可执行的进程(好比虚拟机)来讲,容器的内存占用空间更小,更加的轻量化。

相比之下,虚拟机(VM)运行一个完整的“客户”操做系统,经过虚拟机管理程序虚拟访问主机资源。 通常来讲,虚拟机提供的环境比大多数应用程序须要的资源更多。

因为 Docker 轻量、资源占用少,使得 Docker 能够轻易的应用到构建标准化的应用中。但 Docker 目前还不够完善,好比隔离效果不如 VM,共享宿主机操做系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。

Docker 的用途

Docker 的主要用途,目前有三大类。

1. 提供一次性的环境。好比,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

2. 提供弹性的云服务。由于 Docker 容器能够随开随关,很适合动态扩容和缩容。

3. 组建微服务架构。经过多个容器,一台机器能够跑多个服务,所以在本机就能够模拟出微服务架构。

3、Docker 基本概念


下面这张图很是的经典,很形象地展现了,什么是容器,什么是镜像,什么是仓库,以及三者之间的联系。

接下来咱们来解释一下这张图。如今咱们要造一间厨房,在造以前咱们首先要干的一件事,就是先列举出咱们造厨房须要的东西。咱们可能须要一个通了水电煤的房子以及一些必需的厨房用具诸如锅碗瓢勺、煤气灶、冰箱、水槽等等这些东西。如今咱们知道须要了什么东西以后,咱们就去找这些东西。首先咱们先去京东购买一些厨房用具,这些用具就比如咱们的Docker镜像,咱们厨房的用具到了以后得找个地方把它们放在,不可能随处丢吧,否则后面用的时候就找不到它了,那么咱们Docker镜像也是这样,须要一个Docker仓库去存储这些镜像。如今咱们有了这些厨房用具以后就能够作饭了吗?答案固然是不能,没水没电没火啊!这时候咱们得把厨房用具给装到一个通了水电煤的房子才行,那么Docker镜像也是这样,单纯的Docker镜像是不能用的,它得装到Docker容器中通了水电煤才能使用。等咱们装好了厨房用具以后咱们就能够开始作饭,那么咱们的Docker镜像装到Docker容器以后,咱们应用就能够跑起来了。

概念详解

Docker是CS架构,主要有两个概念:

  • Docker daemon: 运行在宿主机上,Docker守护进程,用户经过Docker client(Docker命令)与Docker daemon交互
  • Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通讯并将结果返回给用户,Docker client也能够经过socket或者RESTful api访问远程的Docker daemon

了解了Docker的组成,再来了解一下Docker的三个主要概念:

  • Docker image: 镜像是只读的,镜像中包含有须要运行的文件。镜像用来建立container,一个镜像能够运行多个container;镜像能够经过Dockerfile建立,也能够从Docker hub/registry上下载。
  • Docker container: 容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
  • Docker hub/registry: 共享和管理Docker镜像,用户能够上传或者下载上面的镜像,官方地址为https://registry.hub.docker.com/,也能够搭建本身私有的Docker registry。

镜像就至关于打包好的版本,镜像启动以后运行在容器中,仓库就是装存储镜像的地方。

4、Docker 安装


安装过程都大同小异,这里就不细说了,详细的能够参考这里:https://www.runoob.com/docker/macos-docker-install.html

惟一须要注意的就是因为国内网络问题,须要给 Docker 镜像加个速(详细的能够戳上面连接,最后有...)

5、Docker Hello World


首先,运行下面的命令,将 image 文件从仓库抓取到本地。

$ docker image pull library/hello-world

上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。

因为 Docker 官方提供的 image 文件,都放在library组里面,因此它的是默认组,能够省略。所以,上面的命令能够写成下面这样。

$ docker image pull hello-world

抓取成功之后,就能够在本机看到这个 image 文件了。

$ docker image ls

如今,运行这个 image 文件

$ docker container run hello-world

docker container run 命令会从 image 文件,生成一个正在运行的容器实例。

注意,docker container run 命令具备自动抓取 image 文件的功能。若是发现本地没有指定的 image 文件,就会从仓库自动抓取。所以,前面的 docker image pull 命令并非必需的步骤。

若是运行成功,你会在屏幕上读到下面的输出。

$ docker container run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

... ...

输出这段提示之后,hello world 就会中止运行,容器自动终止。

有些容器不会自动终止,由于提供的是服务。好比,安装运行 Ubuntu 的 image,就能够在命令行体验 Ubuntu 系统。

$ docker container run -it ubuntu bash

对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。

$ docker container kill [containID]

6、经常使用命令


  • 杀死全部正在运行的容器
    docker kill $(docker ps -a -q)
  • 删除全部已经中止的容器
    docker rm $(docker ps -a -q)
  • 删除全部镜像
    docker rmi $(docker images -q)
  • 关闭容器
    docker stop CONTAINER ID或者NAMES
  • 从新启动关闭的容器
    docker start CONTAINER ID或者NAMES
  • 移除本地容器
    docker rm CONTAINER ID或者NAMES
  • 查看本地容器
    docker ps //查看正在运行的容器
    docker ps -a //查看全部容器
  • 查看本地镜像
    docker images
  • 建立镜像
    docker build -t name:tag Dockerfile路径
  • 修改本地镜像标记
    docker tag IMAGE ID name:tag
    docker rmi name:tag
  • 删除本地镜像
    docker rmi name:tag或者IMAGE ID
  • 进入容器
    docker exec -it IMAGE ID或者NAMES /bin/bash
  • 获取镜像中心的镜像
    docker pull name:tag
  • 获取容器的端口映射配置
    docker port CONTAINER ID或者NAMES

# 参考资料

1. Docker入门教程(阮一峰) - http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
2. Docker(一):Docker入门教程(纯洁的微笑) - https://www.cnblogs.com/ityouknow/p/8520296.html
3. Docker教程(菜鸟教程) - https://www.runoob.com/docker/docker-tutorial.html
4. - Docker入门,看这篇就够了 - https://segmentfault.com/a/1190000009544565#articleHeader6
5. 官方文档 - https://www.docker.com


按照惯例黏一个尾巴:

欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz 欢迎关注公众微信号:wmyskxz 分享本身的学习 & 学习资料 & 生活 想要交流的朋友也能够加qq群:3382693