什么是Docker?


Docker是由dotcloud公司使用golang语言进行开发的,基于Linux内核的 cgroupnamespace,以及OverlayFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处:

传统虚拟化

Docker

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


为什么要使用Docker

更高效地利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。


更快速的启动时间

传统虚拟机在启动的时候是需要启动一个完整的操作系统,所以使用传统虚拟化技术启动一个服务需要数分钟,而Docker容器应用是直接将服务的应用程序启动在宿主机的内核上,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。


一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现。而Docker的镜像提供了除内核以外的完整的运行时环境,确保了应用运行环境一致性,不需要做任何配置就能在任意Linux服务器上运行,即Build Once, Run Anywhere。从而不会再出现「这段代码在我机器上没问题啊」这类问题。


更轻松的迁移与弹性伸缩

由于Docker镜像封装了除操作系统内核外的完整的文件系统,所以Docker应用在进行迁移的时候只需要在新的服务器上将镜像拉取下来或者使用Dockerfile重新Build,然后run一下就迁移完成了,完全不用担心运行环境的变化导致应用无法正常运行的情况。


更轻松的扩展与维护

Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。


与传统虚拟技术对比总结

特性 容器 虚拟机
启动速度 秒级 分钟级
磁盘使用 MB级 GB级
单机运行数量 支持上千个容器 最多跑几十个虚拟机

Docker基础概念

镜像(Image)

我们都知道,操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载 root文件系统为其提供用户空间支持。而 Docker镜像(Image),就相当于是一个 root文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。

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


容器(Container)

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

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。


仓库(Registry)

Docker Registry提供的是保存Docker镜像的服务,便于将镜像可以在任意支持Docker引擎的服务器上“实例化”为容器提供服务。

通常一个Registry可以包含多个仓库,每个仓库里又可以包含多个镜像,每个镜像之间使用tag(标签)进行区分,如果镜像没有标签则以默认latest作为该镜像的标签,相同标签的镜像会被新镜像覆盖。

以ubuntu镜像为例,ubuntu是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过ubuntu:16.04,或者ubuntu:18.04来具体指定所需哪个版本的镜像。如果忽略了标签,比如ubuntu,那将视为ubuntu:latest

Docker基础命令

01. 使用镜像

获取镜像

  1. docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。

  • Docker 镜像仓库地址:地址的格式一般是<域名/IP>[:端口号]。默认地址是Docker Hub(docker.io)
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。

例如:

  1. docker pull ubuntu:15.10

列出镜像

  1. docker image ls

删除镜像

  1. docker image rm <镜像id>
  2. docker images rm <镜像名>:<镜像tag>
  3. # 例如:
  4. docker images rm 5c64
  5. docker images rm alpine:latest

02. 运行容器

使用docker run命令启动一个ubuntu的容器并在其中输出 Hello World文本,执行完毕后,容器会自动退出。

  1. docker run --name=hello ubuntu:15.10 /bin/echo "Hello, World"

参数解析:

run: y与docker组合启动一个新容器;

--name: 容器的名称;

ubuntu:15.10:启动容器使用的镜像;

/bin/echo:在容器中执行的命令。

03. 运行交互式容器

使用命令行运行以下命令,此命令将启动一个ubuntu容器并在其中运行bash交互命令行界面,你可以尝试运行pwd,ls,ps等命令查看容器内环境,就如同远程操作一台服务器一样。

  1. docker run -i -t ubuntu:latest /bin/bash
  2. root@cd07977c1a22:/#

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

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

第二行表示已经进入了一个ubuntu系统的容器中,可以执行命令。

04. 在容器中运行持续任务并管理容器生命周期

后台启动容器

使用以下命令创建一个以进程方式运行的容器

  1. docker run --name=ubuntu -it -d ubuntu:15.10 /bin/bash

参数解析:

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

/bin/bash: 运行的命令,必须是可以一直挂起的命令,如死循环。

  1. docker run --name=test -d ubuntu:15.10 sh -c "while true; do echo hello world; sleep 1; done"

Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的

查看容器列表

使用docker ps命令查看当前宿主机上运行的容器:

  1. # 查看正在运行的容器
  2. docker ps
  3. # 查看所有容器
  4. docker ps -a

查看容器日志

使用docker logs命令查看容器日志

  1. # 查看容器日志
  2. docker logs <containerid>
  3. # 实时查看容器日志
  4. docker logs -f <containerid>

连接容器

连接容器有两种方法,attachexec -it:

  1. # 使用attach
  2. docker attach <containerid>
  3. # 使用exec -it
  4. docker exec -it <containerid> /bin/<bash|sh>

注意事项:

使用attach连接是使用现有终端,ctrl+d退出后容器也跟着退出,需要使用ctrl+p+q;

使用exec -it是使用伪终端,ctrl+d退出后容器会继续运行。

停止及删除容器

停止运行中的容器

  1. docker stop e8c6

删除容器

  1. # 删除已经停止的容器
  2. docker rm e8c6
  3. # 删除正在运行的容器
  4. docker rm -f e86c

删除所有停止的容器

  1. docker container prune

容器重启

启动已经停止的容器

  1. docker start e8c6

重启正在运行的容器

  1. docker restart e8c6

05. 容器端口映射

将容器中服务端口映射到宿主机:

  1. # 指定宿主机端口映射
  2. docker run --name=nginx -d -p 80:80 nginx:1.17.0
  3. # 随机宿主机端口映射
  4. docker run --name=nginx -d -P nginx:1.17.0

-p:将容器目录映射至宿主机,<宿主机端口>:<容器端口>

-P: 将容器中暴露的端口映射到宿主机上的随机端口,防止端口冲突。

06. 容器与宿主机文件传输

目录挂载

  1. # 默认权限为读写
  2. docker run --name=nginx -d -v /data:/data nginx:latest
  3. # 配置权限为只读
  4. docker run --name=nginx -d -v /data:/data:ro nginx:latest

文件cp

使用docker cp命令传输文件

  1. # 将宿主机文件copy至容器
  2. docker cp test.txt nginx:/mnt/
  3. # 将容器文件copy至宿主机
  4. docker cp nginx:/mnt/test.txt /mnt/

07. docker for mac中容器访问宿主机服务

docker在mac上启动后,在宿主机上没有docker-0网桥,所以无法通过访问宿主机ip或者docker-0网桥ip访问宿主机服务。

docker for mac提供了一个宿主机的域名host.docker.internal,所以mac上访问宿主机业务时的格式为host.docker.internal:port,如settings.py中mysql的配置:

  1. MYSQL_HOST = 'host.docker.internal'
  2. MYSQL_PORT = '3306'

nginx容器反向代理宿主机后端服务时的配置:

  1. proxy_pass http://host.docker.internal:8899;

Docker基础知识及入门的更多相关文章

  1. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  2. Docker03 Docker基础知识、Docker实战

    1 Docker基础知识 1.1 什么是Docker Docker是一个可以装应用的容器,就像杯子可以装水.书包可以装书一样:docker官网 Docker是Docker公司开发的,并开源到GitHu ...

  3. Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟

    最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 环境&版本信息声明 运行ng -v @angular/ ...

  4. docker 基础知识分享ppt

    给团队做的docker基础分享ppt, 见下面的附件. https://files.cnblogs.com/files/harrychinese/docker_intro.pptx

  5. 史上最全docker基础知识汇总

    正文 Docker常用命令 run docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -e设置环境变量:-e username=zhj --name为容器指定 ...

  6. PJzhang:docker基础知识的2个疗程-one

    猫宁!!! 参考:http://virtual.51cto.com/art/201805/572135.htm https://www.cnblogs.com/rkit/p/9237696.html ...

  7. docker学习---docker基础知识

    目录 docker的基础 1.安装docker 2.使用镜像 3.镜像迁移|导入和导出 4.docker Hub介绍 5.搭建私有镜像仓库 5.1.docker开源的镜像分发工具--docker Re ...

  8. docker基础知识普及(一)

    背景 这篇内容是之前给部门同事培训时写的文档,旨在传达一些docker相关概念,有个基本印象,当然,以下内容都来自网络,我只是个搬运工.具体操作在下篇文章中 一.什么是docker? 1. Docke ...

  9. [19/09/02-星期一] 基础知识_Python入门

    一.计算机基础 用户界面:TUI-文本交互界面: GUI-图形化交互界面 命令行:就是一种文本交互界面,可以使用一个一个的指令来操作计算机.任何计算机的操作系统都包含命令行(Windows.Linux ...

随机推荐

  1. MySQL全面瓦解5:数据操作-DML

    说明 DML(Data Manipulation Language)数据操作语言,是指对数据库进行增删改的操作指令,主要有INSERT.UPDATE.DELETE三种,代表插入.更新与删除,这是学习M ...

  2. Java学习的第四天

    1.变量不可以重复命名并且 方法内定义的变量,必须初始化才能使用,方法内定义的变量在Java中又叫做局部变量. 单行注释:// 多行注释/*       */ doc注释   /** *doc注释 * ...

  3. RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation

    问题 在用pytorch跑生成对抗网络的时候,出现错误Runtime Error: one of the variables needed for gradient computation has b ...

  4. 【CHOJ】磁力块

    题意描述 磁力块 在平面内分布着 \(N\) 个磁力块,同时你的手上也有一块. 你一开始站在给定的坐标上,当磁力块之间满足互相吸引的条件时就可以吸引. 当你拿到新的磁石时你就可以用它来吸引更多的石头, ...

  5. ZOJ 1005 Jugs(BFS)

    Jugs In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with th ...

  6. CO函数库

    CO函数库 用于 Generator 函数的自动执行,co函数返回一个promise对象 Generator 函数: 协程的概念:A执行- A暂停,执行权给B--- B交回执行权--- A恢复执行 G ...

  7. Hadoop调优 | NameNode主备宕机引发的思考

    大家都知道在双十一这些电商大型营销活动期间,电商网站的访问量等是平时的N倍.每当这个时候到来,无论是开发还是运维人员都严阵以待生怕服务出现问题.很不幸,笔者的一个朋友在一家电商公司上班,在双十一时,恰 ...

  8. 遗传算法(Genetic Algorithm)——基于Java实现

    一.遗传算法原理介绍 遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法.遗传算法是从代表问 ...

  9. 16、Auth认证组件

    1 Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码 ...

  10. [MIT6.006] 14. Depth-First Search (DFS), Topological Sort 深度优先搜索,拓扑排序

    一.深度优先搜索 它的定义是:递归探索图,必要时要回溯,同时避免重复. 关于深度优先搜索的伪代码如下: 左边DFS-Visit(V, Adj.s)是只实现visit所有连接某个特定点(例如s)的其他点 ...