概要

docker是一种linux容器技术。容器有效的将由单个操作系统挂管理的资源划分到孤立的组中,以便更好的在组之间平衡有冲突的资源使用需求。可简单理解为一种沙盒 。每个容器内运行一个应用,不同的容器之间相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分快速,资源需求远远低于虚拟机。

好处

能高效地构建应用。

对于运维开发来说,

能快速的交付和部署

高效的资源利用

轻松的迁移扩展

简单的更新管理

与虚拟机的比较

docker与虚拟化

虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器,网络,内存等抽象、转化后呈现出来,使用户以更好的方式来应用这些资源。虚拟化目标往往是为了在同一个主机上运行多个系统或者应用,从而提高资源的利用率,降低成本,方便管理及容错容灾。

操作系统级的虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。docker以及其他容器技术就属于此范畴。

传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。而docker容器是在操作系统层面上实现虚拟化,直接复用本地主机操作系统,更加轻量。

docker核心概念

镜像(Image)

容器(Container)

仓库(Repository)

镜像:类似虚拟机镜像

容器:类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。

仓库:每个仓库存放某一类镜像。

容器、仓库、镜像运行关系图:

docker的安装以及镜像,容器,仓库的基本操作

docker的安装(centos7中可以直接yum安装)

yum install –y docker

更新需要自行通过源码安装,或者下载二进制文件安装。

镜像

# 搜索镜像

docker search <image> # 在docker index中搜索image

--automated=false 仅显示自动创建的镜像

--no-trunc=false 输出信息不截断显示

-s 0 指定仅显示评价为指定星级的镜像

# 下载镜像

docker pull <image> # 从docker registry server 中下拉image

还可通过指定标签下载某镜像

docker pull [:TAG]

docker pull centos:7

# 查看镜像/删除

docker images: # 列出images

docker images -a # 列出所有的images(包含历史)

docker ps -a #列出本机所有容器

docker rmi <image ID>: # 删除一个或多个image

# 存出和载入镜像

存出本地镜像文件为.tar

docker save -o ubuntu_14.04.tar ubuntu:14.04

导入镜像到本地镜像库

docker load --input ubuntu_14.04.tar或者

docker load < ubuntu_14.04.tar

# 上传镜像

    用户在dockerhub网站注册后,即可上传自制的镜像。

docker push NAME[:TAG]

容器

容器是镜像的一个运行实例,不同的是它带有额外的可写层。

可认为docker容器就是独立运行的一个或一组应用,以及它们所运行的必需环境。

# 创建(使用镜像创建容器):

首先得查看镜像的REPOSITORY和TAG

docker run -i -t REPOSITORY:TAG (等价于先执行docker create 再执行docker start 命令)

其中-t选项让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开。若要在后台以守护态(daemonized)形式运行,可加参数-d

在执行docker run来创建并启动容器时,后台运行的标准包括:

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

docker start/stop/restart <container> #:开启/停止/重启container

# 进入容器:

docker attach [container_id] #连接一个正在运行的container实例(即实例须为start状态,可以多个 窗口同时attach 一个container实例),但当某个窗口因命令阻塞时,其它窗口也无法执行了。

exec可直接在容器内运行的命令。docker exec -ti [container_id] /bin/bash

# 删除容器:

docker rm <container...> #:删除一个或多个container

docker rm `docker ps -a -q` #:删除所有的container

docker ps -a -q | xargs docker rm #:同上, 删除所有的container

docker -rm

-f 强制中止并运行的容器

-l 删除容器的连接,但保留容器

-v 删除容器挂载的数据卷

# 修改容器:

docker commit <container> [repo:tag] # 将一个container固化为一个新的image,后面的repo:tag可选。

# 导入和导出容器:

导出到一个文件,不管是否处于运行状态。

docker export CONTAINER > test.tar

导入为镜像:

cat test.tar | docker import - centos:latest

仓库

仓库是集中存放镜像的地方。每个服务器上可以有多个仓库。

仓库又分为公有仓库(DockerHub、dockerpool)和私有仓库

DockerHub:docker官方维护的一个公共仓库https://hub.docker.com,其中包括了15000多个的镜像,大部分都可以通过dockerhub直接下载镜像。也可通过docker search和docker pull命令来下载。

DockerPool:国内专业的docker技术社区,http://www.dockerpool.com也提供官方镜像的下载。

docker私有仓库的搭建:

192.168.2.189 仓库

192.168.2.201 客户端

1.先拉取registry镜像(用来启动仓库)和busybox镜像(用来上传)

docker pull registry

docker pull busybox

我这里下载的是registry 2

2.使用docker tag命令将这个镜像标记为192.168.2.189:5000/busybox

docker tag IMAGR[:TAG] NAME[:TAG]

docker tag docker.io/busybox 192.168.2.189:5000

3.修改docker配置文件,增加参数 --insecure-registry=192.168.2.189:5000

此处的参数指定为非安全模式,也就是http而不是https,然后重启docker服务。

4.创建registry容器并启动

docker run -d -p 5000:5000 --privileged=true -v /myregistry:/var/lib/registry registry

–privileged=true :CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误(OSError: [Errno 13] Permission denied: '/tmp/registry/repositories/liibrary')或者(Received unexpected HTTP status: 500 Internal Server Error)错误

-v选项指定将/myregistry/目录挂载给/var/lib/registry/,/tmp/registry是registry版本1的仓库目录。

/myregistry为本地创建的目录。

5.把本地标记的镜像push到仓库

docker push 192.168.2.189:5000/busybox

6.查看本地目录/myregistry以及在客户端上pull刚才push的镜像

客户端在pull之前也需要修改配置文件指定仓库,也和上面一样添加参数--insecure-registry=192.168.2.189:5000,然后重启docker。

7.也可以通过registry v2 api来查看push的镜像是否存在于仓库

GET /v2/_catalog检索列出所有存储库(Listing Repositories),也就是存储在库中的镜像。

docker核心概念(镜像、容器、仓库)及基本操作的更多相关文章

  1. Docker概念学习系列之Docker核心概念之容器container

    不多说,直接上干货! Docker 利用容器来运行应用. 容器是从镜像创建的运行实例. 它可以被启动.开始.停止.删除.每个容器都是相互隔离的.保证安全的平台. 可以把容器看做是一个简易版的 Linu ...

  2. Docker 核心概念、安装、端口映射及常用操作命令,详细到令人发指。

    Docker简介 Docker是开源应用容器引擎,轻量级容器技术. 基于Go语言,并遵循Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

  3. Docker 镜像 容器 仓库

    Docker 包括三个基本概念镜像(Image)容器(Container)仓库(Repository) Docker 镜像 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资 ...

  4. docker核心概念与配置安装

    一.Docker的三大核心概念: 镜像(image)  容器(container) 仓库(repository) 1.Docker镜像类是与虚拟机镜像,可以把它理解为一个只读的模板. 不仅仅是操作系统 ...

  5. 后端技术杂谈9:先搞懂Docker核心概念吧

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  6. docker 批量删除 镜像 容器

    我们在docker构建和测试时,经常会产生很多无用的镜像或者容器,我们可用如下两条命令一个一个删除. docker container rm 容器id #删除容器 可简写: docker rm 容器i ...

  7. Docker概念学习系列之Docker核心概念之镜像Image

    不多说,直接上干货! 说明:   Docker 运行容器之前需要本地存在对应的镜像,如果镜像不存在,Docker 会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户 ...

  8. Docker概念学习系列之Docker核心概念之仓库Repository

    不多说,直接上干货! Docker仓库 仓库(Repository)是集中存放镜像的地方,分公共仓库和私有仓库. 仓库是集中存放镜像文件的场所. 有时候会把仓库和仓库注册服务器(Registry)混为 ...

  9. 核心概念 —— 服务容器

    1.简介 Laravel 服务容器是一个用于管理类依赖和执行依赖注入的强大工具.依赖注入听上去很花哨,其实质是通过构造函数或者某些情况下通过 set 方法将类依赖注入到类中. 让我们看一个简单的例子: ...

随机推荐

  1. API输出的时候是return还是echo?

    写php API写的很少,最近才开始接口的写法,在框架里面一直用return,但是在api中retrun就失效了,为什么呢? 网友给出的答案: 1. return 一般用于函数或方法的返回. echo ...

  2. react组件中的constructor和super小知识

    react组件中的constructor和super小知识 1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类 ...

  3. loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试

    调用java jar文件远程操作Oracle数据库测试 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 Loadrunner:11 备注:想学ora ...

  4. 《ASP.NET MVC企业实战》(二) MVC开发前奏

    ​ 在上一篇“<ASP.NET MVC企业级实战>(一)MVC开发前奏”中记录了作者介绍的一些比较实用的VS使用方法以及C#2.0中添加的新特性.本篇继续大概了解之后版本的一些新特性.   ...

  5. 洗礼灵魂,修炼python(38)--面向对象编程(8)—从算术运算符进一步认识魔法方法

    上一篇文章了解了魔法方法,相信你已经归魔法方法至少有个概念了,那么今天就进一步的认识魔法方法.说这个之前,大脑里先回忆一下算术操作符. 什么是算术操作符?忘记没有?忘记了的自己倒回去看我前面的博文或者 ...

  6. 利用Spring的AbstractRoutingDataSource解决多数据源的问题

    多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题. 解决方法如下: 1.首先配置多个datasource <bean ...

  7. JavaScript高级特性-实现继承的七种方式

    声明和约定: 在C++和Java中,我们可以通过关键字class来声明一个类,在JavaScript中没有这个关键字,但我们知道可以通过new一个function创建对象,这个function类似C+ ...

  8. tkinter学习系列(四)之Button 控件

    目录 目录 前言 (一)基本用法和可选属性 ==1.基本用法== ==2.可选属性== (二)属性的具体实现和案例 ==1.常用属性== ==案例一== ==2.按钮里的图片== ==案例二== == ...

  9. macOS平台安装metasploit

    1  在Github上克隆Metasploit git clone https://github.com/rapid7/metasploit-framework.git /usr/local/shar ...

  10. January 15th, 2018 Week 03rd Monday

    We got things to do. Places to go. People to see. Futures to make. 我们有很多事情要做,有很多地方要去,有很多人要见,有很多美好的未来 ...