docker 概念 | 安装 | 基本使用

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

 

一 先从认识容器开始

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

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

  • 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件适用于基于Linux和Windows的应用,在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性 ,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

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

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

 

 二 再来谈谈Docker的一些概念

 2.1 什么是Docker?

说实话关于Docker是什么并太好说,下面我通过四点向你说明Docker到底是个什么东西。

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

 

2.2 Docker思想

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

2.3 Docker容器的特点

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

2.4 为什么要用Docker

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

三 容器 VS 虚拟机

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

容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。

3.1 两者对比图

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

3.2 容器与虚拟机 (VM) 总结

 

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

通过Docker官网,我们知道了这么多Docker的优势,但是大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而 Docker通常用于隔离不同的应用 ,例如前端,后端以及数据库。

3.3 容器与虚拟机 (VM)两者是可以共存的

就我而言,对于两者无所谓谁会取代谁,而是两者可以和谐共存。

 

 四 Docker基本概念

Docker 包括三个基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周期

4.1 镜像(Image)——一个特殊的文件系统

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

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

Docker 设计时,就充分利用 Union FS的技术,将其设计为 分层存储的架构 。 镜像实际是由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

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

 

4.2 容器(Container)——镜像运行时的实体

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

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

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

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

 

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

镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

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

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

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

最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为: 。在国内访问Docker Hub 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像库网易云镜像服务DaoCloud 镜像市场阿里云镜像库等。

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

五 安装

ubuntu 16.04 安装docker:https://blog.csdn.net/jinking01/article/details/82490688

docker 构架

Docker 采用 Client/Server 架构模式。Docker Daemon是docker的核心守护进程,也就是Server端,Server端可以部署在远程,也可以部署在本地,客户端向服务器发送请求,服务端负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端可以通过 socket 或 REST API 与远程的服务器通信

docker CLI 实现容器和镜像的管理,为用户提供统一的操作界面,这个 客户端提供一个只读的镜像,然后通过镜像可以创建一个或者多个容器(container),这些容器可以只是一个RFS(Root File System),也可以是一个包含了用户应用的RFS。容器在docker Client中只是一个进程,两个进程是互不可见的,从而实现容器之间的个隔离。

用户不能与server直接交互,但可以通过与容器这个桥梁来交互,由于是操作系统级别的虚拟技术,中间的损耗几乎可以不计。

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

# step 4:查看docker安装版本

docker version

# step 5:配置文件(加速源)-可使用阿里云、中科大等
cd ~
mkdir /etc/docker
vi /etc/docker/daemon.json

{
"registry-mirrors":["https://registry.docker-cn.com"]
}

# step 6:启动
systemctl enable docker.service  :设置开启自启动
systemctl start docker.service:启动docker
systemctl stop docker.service:停止docker

六 基本使用

##搜索镜像
docker search centos7

##获取镜像
docker pull centos

##运行容器
docker run -it centos /bin/bash

##查看镜像
docker images

##删除镜像
docker rmi imageID

##导出镜像
docker save centos > /opt/centos.tar.gz

##导入镜像
docker load < /opt/centos.tar.gz


##运行1 启动一个容器,执行 echo,然后关闭 加 -d 以守护进程的方式启动
docker run centos /bin/echo "123"

##运行2 启动一个终端,进行交互 --name 名字 -i 标准输入打开 -t 分配一个伪终端
##退出的时候,想再继续运行 用 CTRL+P+Q
docker run --name he -it centos /bin/bash

##标准操作

检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个ip地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
##运行的容器
docker ps -a

##启动已经关闭的容器
docker start CONTAINER ID
docker stop CONTAINER ID

##删除容器 -f 删除正在运行的
docker rm CONTAINER ID

##日志
docker logs ${container_id}

##参数
docker -p ip:端口:端口 -e 环境变量 -v 本地目录:容器目录:rw/ro --volumes-from 容器名字 挂载该容器的数据卷
--link 容器名字:链接别名

##登录
docker exec -it web /bin/bash

七 常用命令

    1. 查看docker信息(version、info)
    2. 查看docker版本
      $docker version
    3. 显示docker系统的信息
      $docker info
      1. 对image的操作(search、pull、images、rmi、history)
    4. 检索image
      $docker search image_name
    5. 下载image
      $docker pull image_name
    6. 列出镜像列表; -a, --all=false 显示所有镜像; --no-trunc=false 不要截断输出; -q, --quiet=false 仅显示数字ID
      $docker images
    7. 删除一个或者多个镜像; -f, --force=false 强行; --no-prune=false 不要删除未标记的父级
      $docker rmi image_name
    8. 显示一个镜像的历史; --no-trunc=false 不要截断输出; -q, --quiet=false 仅显示数字ID
      $docker history image_name
      1. 启动容器(run)
        docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
    9. 在容器中运行"echo"命令,输出"hello word"
      $docker run image_name echo "hello word"
    10. 交互式进入容器中
      $docker run -i -t image_name /bin/bash
    11. 在容器中安装新的程序
      $docker run image_name apt-get install -y app_name
      注意: 在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
      1. 查看容器(ps)
    12. 列出当前所有正在运行的container
      $docker ps
    13. 列出所有的container$docker ps -a
    14. 列出最近一次启动的container
      $docker ps -l
      1. 保存对容器的修改(commit)
        当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。
    15. 保存对容器的修改; -a, --author="" 作者; -m, --message="" 提交消息
      $docker commit ID new_image_name
      注意: image相当于类,container相当于实例,不过可以动态给实例安装新软件,然后把这个container用commit命令固化成一个image。
      1. 对容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach)
    16. 删除所有容器
      $docker rm `docker ps -a -q`
    17. 删除单个容器; -f, --force=false; -l, --link=false 删除指定的链接,而不是基础容器; -v, --volumes=false 删除与容器关联的卷
      $docker rm Name/ID
    18. 停止、启动、杀死一个容器
      $docker stop Name/ID
      $docker start Name/ID
      $docker kill Name/ID
    19. 从一个容器中取日志; -f, --follow=false 按照日志输出; -t, --timestamps=false 显示时间戳
      $docker logs Name/ID
    20. 列出一个容器里面被改变的文件或者目录,list列表会显示出三种事件,A 增加的,D 删除的,C 被改变的
      $docker diff Name/ID
    21. 显示一个运行的容器里面的进程信息
      $docker top Name/ID
    22. 从容器里面拷贝文件/目录到本地一个路径
      $docker cp Name:/container_path to_path
      $docker cp ID:/container_path to_path
    23. 重启一个正在运行的容器; -t, --time=10 尝试在停止容器之前停止的秒数, 默认=10
      $docker restart Name/ID
    24. 附加到一个运行的容器上面; --no-stdin=false 不要附加标准输入(stdin); --sig-proxy=true 将所有接收到的信号代理给进程
      $docker attach ID
      注意: attach命令允许你查看或者影响一个运行的容器。你可以在同一时间attach同一个容器。你也可以从一个容器中脱离出来,是从CTRL-C。
      1. 保存和加载镜像(save、load)
        当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
    25. 保存镜像到一个tar包; -o, --output="" 写入文件
      $docker save image_name -o file_path
    26. 加载一个tar包格式的镜像; -i, --input="" 从tar存档文件读取
      $docker load -i file_path
    27. 机器a
      $docker save image_name > /home/save.tar
    28. 使用scp将save.tar拷到机器b上,然后:
      $docker load < /home/save.tar
      8、 登录registry server(login)
    29. 登陆registry server; -e, --email="" 电子邮件; -p, --password="" 密码; -u, --username="" 用户名
      $docker login
      1. 发布image(push)
    30. 发布docker镜像
      $docker push new_image_name
      1. 根据Dockerfile 构建出一个容器
    31. build
      --no-cache=false 在构建映像时不要使用缓存
      -q, --quiet=false 抑制由容器生成的详细输出
      --rm=true 成功构建后删除中间容器
      -t, --tag="" 在成功的情况下应用于生成的图像的存储库名称(以及可选的标记)
      $docker build -t image_name Dockerfile_path

参考:

https://zhuanlan.zhihu.com/p/38552635

https://studygolang.com/articles/9483

https://blog.51cto.com/hequan/2073186

原文地址:https://www.cnblogs.com/-wenli/p/11369134.html