博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker
阅读量:5309 次
发布时间:2019-06-14

本文共 6487 字,大约阅读时间需要 21 分钟。

Docker 是基于内核,对应用进程进行封装隔离,属于操作系统层面的容器虚拟化技术。

1. Docker 与虚拟机的区别

虚拟机是在宿主机上虚拟出一套硬件资源,在其上运行一个完整的操作系统,在该系统上再运行应用进程;Docker 容器内的应用进程直接运行于宿主机的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。

2. Docker 优势

  • 主机资源利用率高:不需要进行硬件虚拟和运行完整的操作系统等额外开销。
  • 启动时间快:直接运行于宿主机内核,不需要启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
  • 运行环境一致性:Docker 镜像提供了除内核外完整的运行环境,确保了应用运行环境一致性。
  • 部署简单:通过镜像来实现持续集成、持续交付、快速部署。

3. 基本概念

(1)镜像 Image

镜像是一个特殊的文件系统,采用分层存储的架构,构建镜像时,会一层层构建,每一层构建完就不会再发生改变,前一层是后一层的基础。镜像不包含任何动态数据,其内容在构建之后不会被改变。镜像是用于创建容器的模板。

(2)容器 Container

镜像和容器关系,类似于面向对象程序设计中的类和对象。容器由镜像创建,一个镜像可以创建出多个相同的容器实例,每个容器为独立的应用进程。

容器运行时,以镜像为基础层,在其上创建一个当前容器的存储层,存储层可以读写数据。

(3)仓库 Registry

仓库用来存储镜像,一个 Registry 可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。

一个仓库包含同一个软件不同版本的镜像,而标签就对应软件的各个版本。我们可以通过仓库名:标签的格式来指定镜像。如果不给出标签,将以 latest 作为默认标签。

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

用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。

4. 基本架构

Docker 使用 C/S 架构,用户通过客户端与服务端进行交互,服务端负责构建、运行和分发镜像。客户端和服务端可以运行在一台机器上,也可以通过REST API与远程服务端进行通信。

docker-framework

5. Docker daemon

Docker daemon 是服务器组件,以守护进程方式在后台运行。Docker server 模块接收客户端请求,通过内部的路由分发调度,由具体的函数来执行请求,并在 Engine 中处理请求,然后根据请求类型,创建出相应的 job 并运行。

Docker daemon 运行在 Docker host上,负责创建、运行、监控容器,构建、存储镜像。

  • Docker client 通过 Docker daemon 向 Docker Registry 获取镜像
  • 通过 graphdriver 执行容器镜像的本地化操作
  • 通过 networkdriver 执行容器网络环境的配置
  • 通过 execdriver 执行容器内部运行的执行工作

6. Docker 安装

Docker CE 社区免费版,支持 64 位 CentOS 7,并且要求内核版本不低于 3.10。

卸载旧版本

$ sudo yum remove docker \                  docker-client \                  docker-client-latest \                  docker-common \                  docker-latest \                  docker-latest-logrotate \                  docker-logrotate \                  docker-selinux \                  docker-engine-selinux \                  docker-engine

安装依赖包

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加 yum 软件源

$ sudo yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo# 官方源$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

更新 yum 软件源缓存,安装 Docker CE

$ sudo yum makecache fast$ sudo yum install docker-ce

启动 Docker CE

$ sudo systemctl enable docker$ sudo systemctl start docker

镜像加速

在使用过程中拉取 Docker 镜像十分缓慢,可以配置 Docker 国内镜像加速。

添加内核参数

如果在 CentOS 使用 Docker CE 看到下面的这些警告信息:

WARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip6tables is disabled

添加内核配置参数以启用这些功能。

$ sudo tee -a /etc/sysctl.conf <<-EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF

然后重新加载 sysctl.conf 即可。

$ sudo sysctl -p

7. 镜像使用

Docker 运行容器前需要本地存在对应的镜像,如果本地不存在,从镜像仓库下载该镜像。

docker search 命令来查找官方仓库中的镜像。

$ docker search centosNAME               DESCRIPTION                            STARS     OFFICIAL   AUTOMATEDcentos             The official build of CentOS.          465       [OK]blalor/centos      Bare-bones base CentOS 6.5 image       6                    [OK]

返回结果包括镜像名字、描述、收藏数、是否官方创建、是否自动构建。

镜像名是 centos,被称为基础镜像或根镜像。blalor/centos 带有用户名前缀,由 Docker Hub 的注册用户创建并维护的。

docker pull 命令从镜像仓库获取镜像。

$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
  • Docker Registry 地址:即域名或IP,默认为 Docker Hub。
  • 仓库名:即用户名/软件名两段式名称。对于 Docker Hub,如果不给出用户名,默认是 library,也就是官方镜像。
$ docker pull ubuntu:18.0418.04: Pulling from library/ubuntubf5d46315322: Pull complete9f13e0ac480c: Pull completee8988b5b3097: Pull complete40af181810e7: Pull completee6f7c7e5c03e: Pull completeDigest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbeStatus: Downloaded newer image for ubuntu:18.04

这条命令中表示从 Docker Hub 获取 library/ubuntu 仓库中标签为 18.04 的官方镜像。

下载时我们可以看到分层存储的概念,镜像是由多层存储所构成,也会一层层的去下载。下载过程中给出了每一层 ID 的前 12 位。下载结束后,给出该镜像完整的 sha256 摘要,以确保下载一致性。

我们可以使用 docker images 命令来列出本地主机上的镜像。

$ docker imagesREPOSITORY           TAG                 IMAGE ID            CREATED             SIZEubuntu               18.04               f753707788c5        4 weeks ago         127 MB

列表包含了仓库名字、标签、镜像ID、镜像创建时间和镜像所占磁盘空间。

docker push 命令用来将镜像推送到 Docker Hub。

$ docker push username/ubuntu:18.04

8. 容器使用

docker run 是启动运行容器的命令。语法格式:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

-d:后台运行容器,并返回容器ID。

-i:以交互模式运行容器,通常与 -t 同时使用。

-t:为容器重新分配一个伪输入终端。

--name="":为容器指定名称。

-p ip:hostPort:containerPort容器端口映射到主机端口。

$ docker run -it ubuntu:18.04 /bin/bashroot@e7009c6ce357:/#

这条命令表示 Docker 以 ubuntu:18.04 镜像为基础启动并运行一个容器,然后在容器里执行 /bin/bash。

$ docker run -p 8000:5000 -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a  #容器ID

容器在后台运行时,某些时候需要进入容器进行操作,可以使用 docker exec 命令。

$ docker exec -it 77b2dc01fe0f /bin/bashroot@77b2dc01fe0f:/#

如果从这个 stdin 中输入 exit,不会导致容器的停止。

通过 docker ps 命令查看运行的容器有哪些。

$ docker psCONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS   NAMES77b2dc01fe0f  ubuntu:18.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute          agitated_wright

CONTAINER ID:容器ID。

NAMES:自动分配的容器名称。

docker logs 命令查看容器内的标准输出。

$ docker logs 77b2dc01fe0f    #可以是CONTAINER ID或者NAMEShello worldhello worldhello world

docker stop 命令终止一个运行中的容器。

$ docker stop 77b2dc01fe0f    #可以是CONTAINER ID或者NAMES

docker start 命令启动运行一个已经终止的容器。

$ docker start 77b2dc01fe0f    #可以是CONTAINER ID或者NAMES

docker rm 命令用来删除一个处于终止状态的容器。

$ docker rm 77b2dc01fe0f    #可以是CONTAINER ID或者NAMES

docker export 命令用于导出容器快照到本地文件。

$ docker export 77b2dc01fe0f > ubuntu.tar

docker import 命令用于导入容器快照到本地镜像库。

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0$ docker import http://example.com/exampleimage.tgz example/imagerepo    #通过指定URL或目录导入

9. Dockerfile

Dockerfile 是构建镜像的配置文件, 用户可以使用它快速定制镜像。

Dockerfile 是一个文本文件,包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

定制镜像,是以一个镜像为基础进行定制。FROM 指定基础镜像,因此 Dockerfile 中的 FROM 是必备的指令,而且是第一条指令。

组成部分 命令
基础镜像信息 FROM
维护者信息 MAINTAINER
镜像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令 CMD、ENTRYPOINT

docker build 命令用于使用 Dockerfile 构建镜像。

$ docker build -t test/ubuntu:v1 .  #使用当前目录的 Dockerfile 构建镜像$ docker build github.com/creack/docker-firefox  #使用URL Dockerfile 构建镜像$ docker build -f /path/to/Dockerfile .    #使用指定的 Dockerfile 构建镜像

docker commit 命令用于从容器中创建镜像。

$ docker commit -m="提交的描述信息" -a="作者" 容器ID 镜像名[:标签]

10. Docker 三剑客

(1)Docker Machine

Docker Machine 是 Docker 官方编排项目之一,负责在多种平台上快速安装 Docker 环境。

(2)Docker Compose

Docker Compose 是 Docker 官方编排项目之一,负责快速的部署分布式应用。

(3)Docker Swarm

Docker Swarm 是集群管理和编排工具,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。

 

转载于:https://www.cnblogs.com/yutb/p/11242010.html

你可能感兴趣的文章
iPad编程
查看>>
windows批量删除当前目录以及子目录的所有空文件夹
查看>>
基于Idea从零搭建一个最简单的vue项目
查看>>
前端对页面展示修改出现的问题------行内块元素(标签)、行内元素(标签)、块元素(标签)的区别...
查看>>
贝贝网电面
查看>>
《mysql必知必会》 笔记
查看>>
1.20(字符串)
查看>>
Day 25 面向对象高阶
查看>>
常规SQL SERVER数据库置疑后恢复步骤
查看>>
[hadoop](1) MapReduce:ChainMapper
查看>>
注册表文件关联
查看>>
[职场、征人、面试](呛)你到底要不要换工作? Part (II) -- 诚实,最难堪的状态,却最有价值的对策...
查看>>
《AOIT shader in UE4》
查看>>
抽象类与接口的区别
查看>>
[CentOS7] vncviewer与windows之间的复制粘贴
查看>>
切割大文件与合并文件
查看>>
面试问题
查看>>
Android中的Handler
查看>>
简单小练习_自动拉微信群
查看>>
PHP 常量dirname(__file__)
查看>>