Docker入门

1.Docker是什么?

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。

总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样

2.Docker相比于传统虚拟化方式具有更多的优势:

1.docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动
2.docker 需要的资源更少, docker 在操作系统级别进行虚拟化, docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化
3.docker 更轻量, docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境, Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高
4.与虚拟机相比, docker 隔离性更弱, docker 属于进程之间的隔离,虚拟机可实现系统级别隔离
5.安全性: docker 的安全性也更弱。 Docker 的租户 root 和宿主机 root 等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户 root 权限和宿主机的 root 虚拟机权限是分离的,并且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击

  1. 可管理性: docker 的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如 VMware vCenter 提供完备的虚拟机管理能力
    7.高可用和可恢复性: docker 对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制, VMware 可承诺虚拟机 99.999% 高可用,保证业务连续性
    8.快速创建、删除:虚拟化创建是分钟级别的, Docker 容器创建是秒级别的, Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间
    9.交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化。 Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署
    我们可以从下面这张表格很清楚地看到容器相比于传统虚拟机的特性的优势所在:
特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般是几十个

3.Docker的三个基本概念

image

从上图我们可以看到,Docker 中包括三个基本的概念:

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

镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心

Image (镜像)

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

镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,下面的这张图能够帮助读者理解镜像的定义。

image

从左边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker 内部的实现细节,并且能够在主机的文件系统上访问到。统一文件系统 (union file system) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。我们可以在图片的右边看到这个视角的形式

Container (容器)

容器 (container) 的定义和镜像 (image) 几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

image

由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。

Repository(仓库)

Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

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

仓库又可以分为两种形式:

  • public(公有仓库)
  • private(私有仓库)

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

除了使用公开服务外,用户还可以在本地搭建私有 Docker RegistryDocker 官方提供了 Docker Registry镜像,可以直接使用做为私有 Registry 服务。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

我们主要把 Docker 的一些常见概念如 ImageContainerRepository 做了详细的阐述,也从传统虚拟化方式的角度阐述了 docker 的优势,我们从下图可以直观地看到 Docker 的架构:

framework

Docker 使用 C/S 结构,即客户端/服务器体系结构。 Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像。 Docker 客户端和服务端可以运行在一台机器上,也可以通过 RESTfulstock 或网络接口与远程 Docker 服务端进行通信。

docker-framework

这张图展示了 Docker 客户端、服务端和 Docker 仓库(即 Docker HubDocker Cloud ),默认情况下Docker 会在 Docker 中央仓库寻找镜像文件,这种利用仓库管理镜像的设计理念类似于 Git ,当然这个仓库是可以通过修改配置来指定的,甚至我们可以创建我们自己的私有仓库。

docker仓库地址:https://hub.docker.com/

image.png

4.在Linux上安装

由于 Docker-CE 支持 64 位版本的 CentOS7 ,并且要求内核版本不低于 3.10

在Linux操作系统上的安装,主要以CentOS 7为例,其他Linux系统的发行版本,如Ubuntu,Debian,Fedora等,可以自行查询Docker的官方文档。

删除旧的Docker版本

可能有些Linux预先安装Docker,但一般版本比较旧,所以可以先执行以下代码来删除旧版本的Docker。

$ 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

image.png

我们执行以下安装命令去安装依赖包:

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

这里我事先已经安装过了,所以提示我已经安装了最新版本


image.png

安装Docker

Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令

$ sudo yum install docker

安装完成后,运行下面的命令,验证是否安装成功:

docker version
or
docker info

离线安装

参考博客
https://blog.csdn.net/qq_15807167/article/details/80588856

5.Docker命令

1.Docker的启动

  systemctl start docker 
image

2.Docker帮助命令

docker help
image.png

3.从仓库拉取镜像

docker pull nginx
image.png

4.查看所有镜像

docker images

image

5.删除一个或多个镜像

docker rmi 25f3f98ce9f8 镜像编号

image.png

6.启动容器 并使用bash命令

-it -i 交互式操作 -t 终端 --rm 容器退出随之将其删除

docker run -it --rm ubuntu:12.04 bash
image

7.使用nignx 镜像创建一个容器 命名为 webserver 并映射 到端口 80

docker run  --name webserver -d -p 80:80 nginx
image

8.我们以交互式终端进入容器 并执行bash命令 覆盖nginx 访问页面,并访问服务器80端口

docker exec -it webserver bash
echo '<h1>hello, Docker!</h1>' > /usr/share/nginx/html/index.html

image
image

9.查看具体的改动

docker diff webserver 
image

10.查看所有容器 ,查看所有运行的容器

#查看所有容器
docker ps -a

#看看运行的容器
docker ps
image

11.删除一个或多个容器

docker rm 6292a64c2fe9 042623e7c20a(容器号)

image.png

12.查看docker 日志

docker logs  575ad73cf04d 容器号
image.png

13.后台进程启动docker 容器号

docker run -d ubuntu:7789(镜像名)

14.进入后台启动的Docker容器

docker attach 44fc0f0582d9   容器号

15.以使用docker inspect来查看该容器的详细信息。

docker inspect 44fc0f0582d9   容器号

16.使用docker exec进入Docker容器

docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器

sudo docker exec -it 775c7c9ee1e1 /bin/bash 

17.容器的启停

docker stop  44fc0f0582d9   容器号),  docker start  44fc0f0582d9   容器号)

18.容器查看

    docker ps -a
        查看所有容器
    docker ps -l
        查看最后一次的容器
    docker ps -q
        查看正在运行容器的id号

19.容器内命令执行

  1. 进入容器进行操作
    attach
  2.不进入容器,在主系统中对容器进行操作
      exec
    2.1.后台执行
         docker  exec -d  7b7b(容器号) touch a.txt
        2.2.交互执行
      docker exec -ti 7b7b(容器号) touch a.txt

20.容器与镜像与tar文件的转换

#容器转换为镜像
docker commit 575ad73cf04d(容器名称) nginx1 (镜像)

#容器转换tar文件
 docker export  575ad73cf04d  > nginx1bak.tar

#镜像转换为tar文件
docker save -o nginx1bak.tar nginx1:latest

#tar文件转换为镜像
docker load --input nginx1bak.tar  导入镜像
cat nginx1bak.tar | docker import - nginx2:v2 

image.png
image.png
image.png

6.数据卷&数据卷容器

1,数据卷:数据卷就是在宿主中可以在容器之间进行共享和重用的一系列和文件和文件夹,通过docker run -v命令可以将数据卷挂载到对应的容器目录空间,进行文件读取,容器卷特性如下

1.1数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便

1.2对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作

1.3 对数据卷的更新不会影响镜像,解耦了应用和数据

1.4卷会一直存在,直到没有容器使用,可以安全地卸载它

2,数据卷容器:接数据卷,已经存在一个挂载了数据卷的容器;由于数据卷在容器之前是可以共享的,所以此时如果存在其他容器通过docker run --volumes-from [容器别名]命令挂载到该容器上,则该容器可以被称之为数据卷容器,其主要功能是提供数据卷供其他容器挂载。当数据卷容器宕机后,并不会造成数据卷的回收卸载,数据卷会继续挂载在其他容器中。当全部挂载该数据卷的容器全部宕机后,该数据卷才会卸载

3.创建容器,启动镜像

image.png
image.png
docker run -itd  -p 8080:8080 -v /root/index.html:/usr/local/tomcat/webapps/docs/index.html  -v /root/tmp:/usr/local/tomcat/webapps/docs/  --name tomcat_1 tomcat

image.png

4.数据卷容器
1,数据卷操作完成后,docker容器中存在一个已经启动的tomcat镜像。并命名为tomcat_1


image.png

2,现在,以该容器为数据卷容器,重新启动tomcat镜像,以该容器为数据卷进行挂载

docker run -itd -p 9090:8080 --volumes-from tomcat_1 --name tomcat_2 tomcat

将容器tomcat_1 作为数据卷容器挂载在 tomcat_2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容