Docker——入门

1.了解

1.1 认识容器

Docker是世界领先的软件容器,所以要想搞懂Docker的概念我们必须从容器开始说起。

先来看容器较为官方的解释:

一句话概括容器:容器就是将软件打包成标准化单元,以用于开发,交付和部署。

  • 容器镜像是轻量的,可执行的独立软件包,包含软件运行所需的所有内容:代码,运行时环境,系统工具,系统库和设置。

  • 容器化软件适用于基于Linux和Windows的应用,在任何环境中都能始终如一的运行。

  • 容器赋予软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础措施上运行不同软件时的冲突。

再来看看容器较为通俗的解释:

如果需要通俗的描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具一样。我们现在所说的容器存放的东西更偏向应用比如网站,程序甚至是系统环境。

认识容器

1.2 什么是Docker?

下面从四个点来说明Docker到底是个什么东西。

  • Docker是世界领先的软件容器平台。
  • Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核提供的CGroup功能和name space来实现的,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面上的虚拟机技术。由于隔离的进程独立于宿主和其他隔离的进程,因此也称为容器。
  • Docker能够自动执行重复性的任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
  • 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理,复制,分享,修改,就像管理普通的代码一样。

1.3 Docker思想

  • 集装箱
  • 标准化:① 运输方式 ② 存储方式 ③ API 接口
  • 隔离

1.4 为什么使用Docker?

  • Docker的镜像提除内核外完整的运行时环境,确保了应用环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;--一致的运行环境。
  • 可以做到秒级,甚至是毫秒级的启动时间。大大的节约了开发,测试,部署的时间。--更快的启动时间
  • 避免公有的服务器,资源会容器受到其他用户的影响。--隔离性
  • 善于处理集中爆发的服务器使用压力;--弹性伸缩,快速扩展
  • 可以很轻易到的将在一个平台运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常执行的情况。--迁移方便
  • 使用Docker可以通过定制应用镜像来实现持续集成,持续交付,部署。--持续交付和部署

1.5 使用Docker的步骤

1.安装Docker

2.去Docker仓库找到这个软件对应的镜像

3.使用这个Docker运行这个镜像,这个镜像就会产生于一个容器

4.对容器的启动和停止就是对软件的启动和停止

2.Docker容器

2.1 特点

  • 轻量:在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
  • 标准:Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。
  • 安全:Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

2.2 容器VS虚拟机

简单来说:容器和虚拟机具有相似的资源隔离和分配优势,但是功能有所不同。因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。

2.2.1 两者对比图

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上在运行所需要的应用进程;而容器内的应用进程直接运行于宿主的内核,容器没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统的虚拟机更为轻便。

7.png

2.2.2 容器与虚拟机VM总结

8.png

  • 容器是一个应用层抽象,用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行。与虚拟机相比,容器所占的空间较少,瞬间就能完成启动。
  • 虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。管理程序允许多个VM在一台机器上运行。每个VM都包含一整套的操作系统,一个或多个应用,必要的二进制文件和库资源,因此,占用大量空间。而且VM启动十分缓慢。

虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而 Docker 通常用于隔离不同的应用 ,例如前端,后端以及数据库。

2.2.3 虚拟机和容器两者是可以共存的

9.png

3.Docker基本概念

Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。 

  • 镜像(Image)

  • 容器(Container)

  • 仓库(Repository)

3.1 镜像(Image):一个特殊的文件系统

操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。

Docker 设计时,就充分利用 Union FS的技术,将其设计为 分层存储的架构 。 镜像实际是由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

3.2 容器(Container):镜像运行时的实体

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。

3.3 仓库(Repository):集中存放镜像文件的地方

镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。

这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念:

Docker Registry 公开服务 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:https://hub.docker.com/ 。官方是这样介绍 Docker Hub 的:Docker Hub 是 Docker 官方提供的一项服务,用于与您的团队查找和共享容器镜像。

比如我们想要搜索自己想要的镜像:

利用Docker Hub 搜索镜像

在国内访问Docker Hub 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像库网易云镜像服务DaoCloud 镜像市场阿里云镜像库等。

除了使用公开服务外,用户还可以在 本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

前面的三节内容和图片来自于:JavaGuide_Docker

4.安装Docker

4.1 Linux环境安装

安装虚拟机和设置虚拟机可以按照这个文件进行操作:实验报告-Linux环境搭建

4.2 安装Docker

步骤:

1. 检查内核版本,必须是3.10以及以上

uname -r

2. 安装docker,输入y确认安装

yum install docker

3.启动docker

systemctl start docker

4.开机启动docker

systemctl enable docler

5.停止docker

systemctl stop docker

5. 常用操作

5.1 镜像操作

操作命令说明
检索docker search 关键字(eg:docker search mysqll)我们经常去docker hub上检索镜像的详细信息,如镜像的TAG
拉取docker pull 镜像名:tag:tag是可选的,tag表示标签,多为软件的版本,默认是latest
列表docker images查看
删除docker rmi image-id删除指定的本地镜像

5.2 容器操作

操作命令说明
运行

docker run --name container-name -d image-name 

eg: docker run --name Mysql 0d mysql

--name:自定义容器名

-d:后台运行

image-name:指定镜像模板

列表docker ps(查看运行中的容器)-a:查看所有容器
停止docker stop container-name/container-id停止当前运行的容器
启动docker start container-name/container-id启动容器
删除docker rm container-id删除指定容器
端口映射

-p 8888:8080

eg:docker run  -p 8888:8080 --name mytomcat -d tomcat

-p:主机端口(映射到)容器内部的端口号
容器日志docker logs container-name/container-id 

5.3 以mysql为例

这些操作是在关闭Linux的防火墙的前提下进行操作:

1.安装mysql

docker pull mysql:5.6

如果没指定版本,将会下载最新版本。最新的mysql8.0因为自身算法的问题,在Navicat进行连接的时候,会出现问题,所以在此指定版本。

2.启动容器,并指定端口映射

docker run -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

3.Navicat连接:输入的是Linux虚拟机的IP地址加端口号

连接成功:

6.Build Ship and Run

如果你搜索 Docker 官网,会发现如下的字样:“Docker - Build, Ship, and Run Any App, Anywhere”。那么 Build, Ship, and Run 到底是在干什么呢?

  • Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源
  • Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样
  • Run(运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方。

Docker运行过程也就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。

 

查看镜像的具体操作可以看:JavaGuide-Docker

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值