docker

docker

docker的历史

  • 2010年,几个搞IT的年轻人在美国成立了一家公司 dotCloud主要做一些pass的云计算服务,LXC有关的容器技术,容器技术被命名为Docker
  • 2013年,Docker开源
  • 2014年4月9日,Docker1.0发布虚拟机属于虚拟化技术,Docker容器技术,也是一种虚拟化技术,Docker基于Go语言开发的

docker基本概念

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

docker是什么

  • 使用最广泛的开源容器引擎
  • 一种操作系统级的虚拟化技术、依赖于linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)
  • 一个简单的应用程序打包工具

docker版本及支持平台

  • docker版本:

    • 社区版(Community Edition, CE)
    • 企业版(Enterprise Edition, EE)
  • 支持平台:

    • linux(Centos,Debian,Fedora,Oracle linux,RHEL,SUSE和Ubuntu)
    • Mac
    • Windows

为什么要使用docker容器技术

  • 上线流程繁琐

    开发→测试→申请资源→审批→部署→测试

  • 资源利用率低,造成资源浪费

  • 扩容/缩容 不及时

  • 服务器环境臃肿,维护难度越来越困难

docker应用场景

  • 应用程序打包和分布
  • 应用程序隔离
  • 持续集成
  • 部署微服务
  • 快速搭建测试环境
  • 提供PaaS(平台即服务)

安装使用docker

[root@localhost ~]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1919  100  1919    0     0   5467      0 --:--:-- --:--:-- --:--:--  5467
[root@localhost ~]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@localhost ~]# ls
anaconda-ks.cfg  docker-ce.repo


[root@localhost ~]# dnf -y install docker-ce
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:00:53 ago on Thu Aug  4 19:59:29 2022.
  python3-audit-3.0.7-1.el8.x86_64                                                             
  python3-libsemanage-2.9-6.el8.x86_64                                                         
  python3-policycoreutils-2.9-18.el8.noarch                                                    
  python3-setools-4.3.0-3.el8.x86_64                                                           
  slirp4netns-1.1.8-1.module_el8.6.0+926+8bef8ae7.x86_64                                       

Complete!
[root@localhost ~]# 
[root@localhost ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-08-04 20:05:23 CST; 11s ago
     Docs: https://docs.docker.com
 Main PID: 19911 (dockerd)

[root@localhost ~]# ss -anlt
State     Recv-Q     Send-Q         Local Address:Port         Peer Address:Port    Process    
LISTEN    0          128                  0.0.0.0:22                0.0.0.0:*                  
LISTEN    0          128                     [::]:22                   [::]:*           
    
    
    
docker加速   
[root@localhost ~]# cd /etc/docker/
[root@localhost docker]# ls
key.json
[root@localhost docker]# vim daemon.json
{
          "registry-mirrors": ["https://p1d3ofgh.mirror.aliyuncs.com"]
}       
[root@localhost docker]# systemctl restart docker
[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:03:11 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:01:29 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.6
  GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc:
  Version:          1.1.2
  GitCommit:        v1.1.2-0-ga916309
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker基本用法

命令功能
docker search在 Docker 中搜索镜像
docker pull从注册表中拉取镜像或存储库
docker images列出镜像‎
docker create创建新的容器
docker start启动一个或多个已停止的容器
docker run在新容器中运行命令
docker attach连接到运行容器‎
docker ps列出容器‎
docker logs获取容器的日志
docker restart重新启动容器‎
docker stop停止一个或多个正在运行的容器‎
docker kill杀死一个或多个正在运行的容器‎
docker rm删除容器或更多容器‎
docker exec在正在运行的容器中运行命令‎
docker info显示系统范围的信息‎
docker inspect返回有关 Docker 对象的低级信息‎
pull拉取镜像
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Image is up to date for centos:latest
docker.io/library/centos:latest


images列出镜像
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   10 months ago   231MB


查看网络
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
cc2ebcf7bcf5   bridge    bridge    local
131912872e41   host      host      local
1e9116cf1265   none      null      local


搜素镜像
[root@localhost ~]# docker search php
NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
php                                  While designed for web development, the PHP6705      [OK]       
composer                             Composer is a dependency manager written in898       [OK]       
adminer                              Database management in a single PHP f
.......................


运行镜像
docker run 镜像名
docker run 镜像名:Tag
[root@localhost ~]# docker run -d --name web httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete 
dcc4698797c8: Pull complete 
41c22baa66ec: Pull complete 
67283bbdd4a0: Pull complete 
d982c879c57e: Pull complete 
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
dacbf10b634080e3ded05facc80bf5a87d388dd9ca4a8819bfb9d7d78eff34e



rm删除镜像----当前镜像没有被任何容器使用才可以删除
#删除一个
 docker rmi -f 镜像名/镜像ID
 
 #删除多个 其镜像ID或镜像用用空格隔开即可 
 docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
 
 #删除全部镜像  -a 意思为显示全部, -q 意思为只显示ID
 docker rmi -f $(docker images -aq)

[root@localhost ~]# docker ps -aq
7eab7496dfd5
5dacbf10b634
26690b9424dd
[root@localhost ~]# docker rm -f $(docker ps -aq)
7eab7496dfd5
5dacbf10b634
26690b9424dd
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

强制删除镜像
 docker image rm 镜像名称/镜像ID




查看正在运行容器
docker ps


查看所以容器-----包含正在运行 和已停止的
docker ps -a



run镜像来构建自己的容器实例
 # -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行)  --name 给要运行的容器 起的名字  /bin/bash  交互路径
 docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash 



stop停止容器
[root@localhost ~]# docker stop web
web
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS                      PORTS     NAMES
ace54afe9982   httpd     "httpd-foreground"   10 minutes ago   Exited (0) 17 seconds ago             web
0f3bfbe39e54   busybox   "sleep 6000"         18 minutes ago   Up 17 minutes                         exciting_goldstine
92b761bb47df   busybox   "sh"                 23 minutes ago   Exited (0) 19 minutes ago             bold_feistel

docker存储驱动

AUFS

AUFS(AnotherUnionFS)是一种Union FS,是文件级的存储驱动。AUFS是一个能透明覆盖一个或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container。

AUFS文件系统据说有3W行代码,而ext4文件系统却只有4000-5000行左右代码,这些代码是要被整合进内核的,后来AUFS申请要被合并进内核代码的时候,linuz觉得它这代码太过臃肿,于是拒绝了。因此AUFS这个文件系统一直以来就不是linux内核中自有的文件系统,想用AUFS这个文件系统的话,必须自己向内核打补丁并去编译使用它,但redhat系列的操作系统一向以稳定著称,不会干这种出格的事,所以在redhat系列操作系统中使用AUFS并无可能。而ubuntu上的docker默认使用的就是AUFS。

OverlayFS

Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。在Docker中,底下的只读层就是image,可写层就是Container。目前最新的OverlayFS为Overlay2。

AUFS和Overlay都是联合文件系统,但AUFS有多层,而Overlay只有两层,所以在做写时复制操作时,如果文件比较大且存在比较低的层,则AUSF会慢一些。而且Overlay并入了linux kernel mainline,AUFS没有。目前AUFS已基本被淘汰。

DeviceMapper

Device mapper是Linux内核2.6.9后支持的,提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。AUFS和OverlayFS都是文件级存储,而Device mapper是块级存储,所有的操作都是直接对块进行操作,而不是文件。Device mapper驱动会先在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的基本设备,所有镜像都是这个基本设备的快照,而容器则是镜像的快照。所以在容器里看到文件系统是资源池上基本设备的文件系统的快照,并没有为容器分配空间。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。

OverlayFS是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显然要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。

Btrfs

Btrfs(通常念成Butter FS)被称为下一代写时复制文件系统,并入Linux内核,也是文件级存储驱动,但可以像Device mapper一样直接操作底层设备。Btrfs把文件系统的一部分配置为一个完整的子文件系统,称之为subvolume 。采用 subvolume,一个大的文件系统可以被划分为多个子文件系统,这些子文件系统共享底层的设备空间,在需要磁盘空间时便从底层设备中分配,类似应用程序调用 malloc()分配内存一样。为了灵活利用设备空间,Btrfs 将磁盘空间划分为多个chunk 。每个chunk可以使用不同的磁盘空间分配策略。比如某些chunk只存放metadata,某些chunk只存放数据。这种模型有很多优点,比如Btrfs支持动态添加设备。用户在系统中增加新的磁盘之后,可以使用Btrfs的命令将该设备添加到文件系统中。Btrfs把一个大的文件系统当成一个资源池,配置成多个完整的子文件系统,还可以往资源池里加新的子文件系统,而基础镜像则是子文件系统的快照,每个子镜像和容器都有自己的快照,这些快照则都是subvolume的快照。
当写入一个新文件时,在容器的快照里为其分配一个新的数据块,文件写在这个空间里,这个叫用时分配。而当要修改已有文件时,使用CoW复制分配一个新的原始数据和快照,在这个新分配的空间变更数据,变结束再更新相关的数据结构指向新子文件系统和快照,原来的原始数据和快照没有指针指向,被覆盖。

ZFS

ZFS 文件系统是一个革命性的全新的文件系统,它从根本上改变了文件系统的管理方式,ZFS 完全抛弃了“卷管理”,不再创建虚拟的卷,而是把所有设备集中到一个存储池中来进行管理,用“存储池”的概念来管理物理存储空间。过去,文件系统都是构建在物理设备之上的。为了管理这些物理设备,并为数据提供冗余,“卷管理”的概念提供了一个单设备的映像。而ZFS创建在虚拟的,被称为“zpools”的存储池之上。每个存储池由若干虚拟设备(virtual devices,vdevs)组成。这些虚拟设备可以是原始磁盘,也可能是一个RAID1镜像设备,或是非标准RAID等级的多磁盘组。于是zpool上的文件系统可以使用这些虚拟设备的总存储容量。

存储驱动特点优点缺点适用场景
AUFS联合文件系统未并人内核主线文件级存储做为docker的第一个存储驱动,已经有很长的历史,比较的稳定,且在大量的生产中实践过,有较强的社区支持。有多层,在做写时复制操作时,如果文件比较大且存在比较低的层,可能会慢一些。大并发但少IO的场景
overlayFS联合文件系统并人内核主线文件级存储只有两层不管修改的内容大小都会复制整个文件,对大文件进行修改显示要比小文件要消耗更多的时间。大并发但少IO的场景
Device mapper并入内核主线块级存储块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件不支持共享存储,表示当有多个容器读同一个文件时,需要生成多个复本,在很多容器启停的情况下可能会导致磁盘溢出适合IO密集的场景
Btrfs并入LINUX内核文件级存储可以像Device mapper一样直接操作底层设备,支持动态添加设备不支持共享存储,表示当有多个容器读同一个文件时,需要生成多个复本不适合在高密度容器的PaaS平台上去使用
ZFS把所有设备集中到一个存储池中来进行管理支持多个容器共享一个缓存块,适合内存大的环境CoW使碎片化问题更加严重,文件在硬盘上的物理地址会变得不再连续,顺序读会变得性能比较差。适合PaaS和高密度的场景
fs并入LINUX内核文件级存储可以像Device mapper一样直接操作底层设备,支持动态添加设备不支持共享存储,表示当有多个容器读同一个文件时,需要生成多个复本不适合在高密度容器的PaaS平台上去使用
ZFS把所有设备集中到一个存储池中来进行管理支持多个容器共享一个缓存块,适合内存大的环境CoW使碎片化问题更加严重,文件在硬盘上的物理地址会变得不再连续,顺序读会变得性能比较差。适合PaaS和高密度的场景

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值