Docker

什么是docker容器技术

在这里插入图片描述
docker是容器技术的一个前端工具,容器是内核的一项技术,docker只是把这一项技术的使用得以简化,使之普及而已。

LXC进行大规模创建容器很难,想在另一台主机上复刻一个一模一样的容器也很难,而docker就是从这方面着手去找解决方案。所以docker早期的版本其核心就是一个LXC,docker对其进行了二次封装,功能的实现是通过LXC做容器管理引擎,但是在创建容器时,不再是像LXC一样用模板去现场安装,而是事先通过一种类似镜像技术,就像在KVM中一样,将一个操作系统打包成一个镜像,然后将这个镜像拷贝到目标主机上直接部署启动。

我们可以尝试着把一个操作系统用户空间需要用到的所有组件,事先准备、编排好,编排好以后整体打包成一个文件,这个文件我们称其为镜像文件(image)。

docker的镜像文件是放在一个集中统一的互联网仓库中的,把一些人们常用的镜像文件放在互联网仓库中,比如最小化的centos系统,有时我们需要在操作系统上安装一些应用,比如nginx,我们就可以在一个最小化的centos系统中安装一个nginx,然后将其打包成镜像,将其放在互联网仓库中,当人们想启动一个容器的时候,docker会到这个互联网仓库中去下载我们需要的镜像到本地,并基于镜像来启动容器。

自docker 0.9版本起,docker除了继续支持LXC外,还开始引入自家的libcontainer,试图打造更通用的底层容器虚拟化库。如今的docker基本上都已经是使用libcontainer而非LXC了。

从操作系统功能上看,docker底层依赖的核心技术主要包括Linux操作系统的命名空间、控制组、联合文件系统和Linux虚拟网络支持。

什么是容器

在这里插入图片描述

容器(Container)

  • 容器是一种基础工具
    泛指任何可以用于容纳其他物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品;物体可以被放置在容器中,而容器则可以保护内容物;
  • 容器的本质和目的
    从容器(container)的名字上,我们就能够非常直观地看出容器的优点,“提供的原材料(镜像)一样,得到的结果(运行实例)一样”、“打包隔离”、“轻松运输” 等。
    如果把容器类比成集装箱的话,那运行的服务或服务对应的多个进程就应该是集装箱里对应的货物了,可以很自然地想到,容器的目的就是为进程集合提供一个独立的运行环境。那我们具体应该怎么实现 “独立的运行环境” 呢?
  1. 文件系统隔离
    每个容器都具有独立的文件系统,单个容器内对文件系统进行增删改查不会影响到其他容器
    参考 Linux 下的 chroot 命令,可以将子目录变为根目录
  2. 资源隔离
    利用 namespace 隔离进程之间的相互可见及通信
    使用 Cgroup 限制资源使用率,设置其能够使用的 CPU 以及内存量的大小
    所以容器的本质就是一个视图隔离、资源可限制、独立文件系统的进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。“视图隔离”,指的是能够看到部分进程、有独立的主机名,“资源可限制”,指的是可以限制内存大小、CPU 使用个数等。

docker的发展历程

docker的发展历程主要经历八个大的阶段:
第一阶段:
2008年,Solomon Hykes 和他的朋友 Kamel Founadi、Sebastien Pahl 共同创立了一家名为 DotCloud 的公司,目标是利用一种叫做容器的技术来创建他们称作是“大规模的创新工具”:任何人都可以使用的编程工具。

2010年,dotCloud获得了创业孵化器Y Combinator的支持,并开始吸引到一些真正的投资,在接下来的3年中,dotCloud内部孵化了一款名为Docker的产品。
第二阶段:
2013 年 3 月 Docker 创始人 Solomon Hykes 在 PyCon 大会上的演讲中首次公开介绍了 Docker 这一产品。在2013 年 PyCon 大会之后,Docker 的创新式镜像格式以及容器运行时迅速成为社区、客户和更广泛行业的实际标准和基石。Docker 的强大之处在于它通过可移植的形式和易于使用的工具在应用程序和基础设施之间创造了独立性。其结果是,Docker将容器技术大众化,并解决了困扰数百万开发人员的“matrix from hell”问题,使容器技术成为主流。

2013年3月20日,dotCloud发布了 Docker 的首个版本,并将Docker源码进行开源。https://github.com/docker/

2013年9月 红帽公司成为Docker的主要合作伙伴,利用Docker来驱动他的OpenShift云业务。随后,谷歌、亚马逊以及DigitalOcean也迅速的在其云服务平台提供了Docker的支持。主流云厂商的加入,加速Docker的发展进度。

随着Docker技术的开源,此项技术能够将Linux容器中的应用代码打包并轻松的在服务器之间迁移,Docker技术瞬时的风靡了全球,2013年底DotCloud Inc则更名为Docker Inc,并全力的主攻到Docker项目开发中。
第三阶段:
2014年6月的DockerCon大会上Docker正式发布了Docker 1.0 版本。这也意味着Docker的稳定性和可靠性已经基本满足了生产环境的运行需求。会议上同时发布Docker Image的镜像仓库Docker Hub(http://hub.docker.com/),并指出已经有超过14,000个Docker化的应用存储在他们的publc registry中。

也是同样的2014年6月,基于谷歌内部强大的Borg系统而开发出来的kubernetes横空处世,刷新了人们对容器的理解。

2014年8月份,Docker Inc宣布将用于PaaS业务服务的DotCloud软件出售给德国柏林的PaaS服务厂商CloudControl,自此以后,DotCloud正式的和Docker分道扬镳了。

2014年12月举行的DockerConEU大会上,Docker Swarm 和Docker Machine同时面世。Docker Swarm是一个Docker集群管理工具,而Docker Machine是部署Docker主机的命令工具。

2014年12月里,CoreOS宣布开发自家的容器运行环境rkt以及appc容器规范。
第四阶段:
容器技术不只Docker,很早之前Google就投资了CoreOS来做竞争的容器–Rocket。那时是三家鼎立:Docker/Rocket/Warden,为了避免惨烈的竞争,大家终于统一意见,决定成立固定的标准来良好发展容器技术。

2015年6月,由Docker、IBM、微软、红帽及Google等厂商所组成的开放容器项目OCP联盟成立,该项目旨在建立软件容器的通用标准。OCP成立于Linux基金会之下,其使命是使用户和公司能够继续创新和开发基于容器的解决方案,并充满信心地保护其先前的开发工作,并且不会造成行业分散。作为该计划的一部分,Docker将捐赠其软件容器格式,运行时以及相关规范的代码。应用容器规范(“ appc”)计划的领导者,包括创始成员CoreOS,也将把他们的技术领导力和支持带到OCP。

2015 年,Docker 发布了 runC工具,runc是根据OCI标准生成的一个cli工具,一个轻量级的跨平台的容器运行时命令行小工具,可以直接利用 libcontainer 运行容器,而无需通过 docker engine。runC 的目标是使标准容器在任何地方都可用。
第五阶段:
2016年6月的DockerCon上,Docker宣布了Open Container Initiative的正式成立。OCI意在业界一起合作,开发一个开放的、标准的容器格式和runtime。OCI也属于Linux基金会的协作项目,一直秉承着开放的模式来管理,其roadmap在GitHub上,大家都可以看到并参与进去:https://github.com/opencontainers/specs/blob/master/ROADMAP.md

2016年,OCI标准制定后,Docker 将 containerd 独立拆分,并将其捐赠给了社区。将这个组件分解为一个单独的项目,使得 docker 将容器的管理功能移出 docker 的核心引擎并移入一个单独的守护进程(即 containerd)。

在2016年,人们认识到容器技术本身的价值时在于容器的编排,而此时的Docker项目令人惊讶的放弃了Swarm项目,而是想将容器的编排和集群的管理功能添加到Docker项目当中。而Kubernetes却与Docker不同的是推进民主化架构,使得通过暴露Kubernetes API的方法,让更多的人来不断丰富kubernetes的插件。
第六阶段:
从2013年3月开始推出0.1.0版本,到17年2月1.13的版本都采用x.x的形式。从 2017 年第一季度开始,Docker 版本号遵循 YY.MM-xx 格式。

2017 年是容器成为主流技术的一年,这就是为什么 Docker 在 Linux 之外支持众多平台的原因(Docker for Mac,Docker for Windows,Docker for AWS,GCP 等)。

2017 年于 Austin 举办的 DockerCon 上开源Docker项目正式命名为 Moby 项目。由于这次改名,GitHub 上的 docker/docker 库也被转移到了 moby/moby,并且拥有了项目自己的 Logo,如下图所示。

于此同时,将Docker本身拆分为Docker-CE免费版和Docker-EE商业版。

Docker-CE目前是docker公司维护的开源项目,是一个基于Moby项目的免费的容器产品。

Docker-EE目前是docker公司维护的闭源项目,是docker公司的商业产品。

至此,容器天下三分。其中Moby由社区维护,Docker-CE由Docker公司维护,Docker-EE是Docker公司闭源的商业产品。
第七阶段:
2018年3月 Docker 公司创始人Solomon Hykes 在 Docker 博客上(https://www.docker.com/blog/au-revoir/ 或者 https://blog.csdn.net/dt763C/article/details/79752939)宣布已正式从 Docker 公司离职,不再担任公司的日常运作工作。Solomon Hykes 表示,他未来的身份将是 Docker 的董事会成员、主要股东,以及 Docker 维护者,但不再负责担任公司的日常工作。
第八阶段:
2019年容器市场基本趋于稳定,一切都向着优化改进方向发展。Docker公司是底层容器引擎及运行时的。容器的编排进过几轮的激烈竞争,基本是GOOGLE的Kubernetes一家独大。

新的战斗已经由容器和编排的战场,逐渐迁移到应用领域。云原生CNCF将引领新的技术方向,微服务、ServcieMesh、Envoy、ServerLess等正在路上

docker的基本使用方式

docker的安装

下载docker的yum源
[root@Gin yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
[root@Gin yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@Gin yum.repos.d]# ls
CentOS-Base.repo  docker-ce.repo
[root@Gin ~]# yum makecache 

使用yum的方式去下载docker-ce
yum -y install docker-ce 

[root@Gin ~]# 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-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。

docker的加速有多种方式:

docker cn
中国科技大学加速器
阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
链接: 阿里云加速器地址

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://e1nfzb1k.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker的常用操作

命令功能
docker searchSearch the Docker Hub for images
docker pullPull an image or a repository from a registry
docker imagesList images
docker createCreate a new conntainer
docker startStart one or more stopped containers
docker runRun a command in a new container
docker attachAttach to a runninng container
docker psList containers
docker logsFetch the logs of a container
docker restartRestart a container
docker stopStop one or more running containers
docker killKill one or more running containers
docker rmRemove onne or more containers
docker execRun a command in a running container
docker infoDisplay system-wide information
docker inspectReturn low-level information on Docker objects

常用命令意思及演示

docker search:在Docker中心搜索镜像
[root@Gin ~]# docker search httpd					//在docker中搜索httpd的镜像
NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                                The Apache HTTP Server Project                  4109      [OK]       
centos/httpd-24-centos7              Platform for running Apache httpd 2.4 or bui…   44                   
centos/httpd                                                                         35                   [OK]
clearlinux/httpd                     httpd HyperText Transfer Protocol (HTTP) ser…   2                    
hypoport/httpd-cgi                   httpd-cgi                                       2                    [OK]
solsson/httpd-openidc                mod_auth_openidc on official httpd image, ve…   2                    [OK]
dockerpinata/httpd                                                                   1                    
nnasaki/httpd-ssi                    SSI enabled Apache 2.4 on Alpine Linux          1                    
lead4good/httpd-fpm                  httpd server which connects via fcgi proxy h…   1                    [OK]
inanimate/httpd-ssl                  A play container with httpd, ssl enabled, an…   1                    [OK]
publici/httpd                        httpd:latest                                    1                    [OK]
dariko/httpd-rproxy-ldap             Apache httpd reverse proxy with LDAP authent…   1                    [OK]
manageiq/httpd                       Container with httpd, built on CentOS for Ma…   1                    [OK]
centos/httpd-24-centos8                                                              1                    
manasip/httpd                                                                        0                    
patrickha/httpd-err                                                                  0                    
amd64/httpd                          The Apache HTTP Server Project                  0                    
manageiq/httpd_configmap_generator   Httpd Configmap Generator                       0                    [OK]
httpdss/archerysec                   ArcherySec repository                           0                    [OK]
paketobuildpacks/httpd                                                               0                    
httpdocker/kubia                                                                     0                    
e2eteam/httpd                                                                        0                    
sandeep1988/httpd-new                httpd-new                                       0                    
19022021/httpd-connection_test       This httpd image will test the connectivity …   0                    
sherazahmedvaival/httpd-php-fpm74                                                    0                    

docker pull:从注册表中拉取映像或存储库(也就是下载docker仓库中的镜像)
[root@Gin ~]# docker pull httpd			//下载httpd的镜像
Using default tag: latest
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
docker.io/library/httpd:latest

docker images:列出镜像
[root@Gin ~]# docker images				//列出已经有的镜像
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
httpd        latest    dabbfbe0c57b   7 months ago   144MB


docker create:创建新的容器
[root@Gin ~]# docker create httpd 			//使用httpd的镜像创建一个名为httpd-a的容器实例     不过在开启时会自动退出
1ed11275843f763e28b19df671c0780ef2d7e7db2d4700786f76641c541eb59a

[root@Gin ~]# docker create httpd -it sleep 6000			//这样的方式创建会在执行完命令后退出
f941d653051861403cea9f514b210be8181ca180ffb7dd52dde8d8b45e731612
[root@Gin ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS    PORTS     NAMES
f941d6530518   httpd     "-it sleep 6000"     10 seconds ago   Created             elegant_hopper
cd2b1110f36a   httpd     "httpd-foreground"   39 seconds ago   Created             romantic_meninsky

docker start:启动一个或多个已停止的容器
[root@Gin ~]# docker start cd2b1110f36a
cd2b1110f36a
[root@Gin ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND              CREATED              STATUS          PORTS     NAMES
cd2b1110f36a   httpd     "httpd-foreground"   About a minute ago   Up 13 seconds   80/tcp    romantic_meninsky

docker run:进入到指定容器中执行命令
[root@Gin ~]# docker run -d --name web -p 80:80 httpd
e6387385b99b5fe0e2d50bfef5be9a166b65ca89d31587bfe317fd9548d9070e
[root@Gin ~]# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                               NAMES
e6387385b99b   httpd     "httpd-foreground"   16 seconds ago   Up 15 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web

docker attache:附加到正在运行的容器

docker ps :查看运行的容器		docker ps -a :查看所有的容器的状态
[root@Gin ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@Gin ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND    CREATED              STATUS    PORTS     NAMES
1ed11275843f   httpd     "http-a"   About a minute ago   Created             practical_austin

docker logs:获取指定的容器日志
[root@Gin ~]# docker logs e6387385b99b
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
[Sat Aug 06 08:13:21.167908 2022] [mpm_event:notice] [pid 1:tid 140251965443392] AH00489: Apache/2.4.52 (Unix) configured -- resuming normal operations
[Sat Aug 06 08:13:21.168051 2022] [core:notice] [pid 1:tid 140251965443392] AH00094: Command line: 'httpd -D FOREGROUND'
172.17.0.1 - - [06/Aug/2022:08:14:25 +0000] "GET /favicon.ico HTTP/1.1" 404 196
172.17.0.1 - - [06/Aug/2022:08:15:17 +0000] "-" 408 -

docker restart:重启容器
[root@Gin ~]# docker restart 179b6c07a365
179b6c07a365
[root@Gin ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND              CREATED              STATUS          PORTS                               NAMES
179b6c07a365   httpd     "httpd-foreground"   About a minute ago   Up 10 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web

docker stop:停止一个或者多个正在运行的容器
[root@Gin ~]#  docker stop cd2b1110f36a
cd2b1110f36a

docker kill:杀掉一个或者多个正在运行的容器
[root@Gin ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND              CREATED       STATUS          PORTS                               NAMES
179b6c07a365   httpd     "httpd-foreground"   2 hours ago   Up 16 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web
[root@Gin ~]# docker kill 179b6c07a365
179b6c07a365

docker rm:删除一个或者多个容器		docker rm  -f :强制删除
[root@Gin ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS                        PORTS     NAMES
e6387385b99b   httpd     "httpd-foreground"   8 minutes ago    Exited (128) 53 seconds ago             web
f941d6530518   httpd     "-it sleep 6000"     13 minutes ago   Created                                 elegant_hopper
cd2b1110f36a   httpd     "httpd-foreground"   13 minutes ago   Exited (0) 3 minutes ago                romantic_meninsky

[root@Gin ~]# docker rm f941d6530518 cd2b1110f36a
f941d6530518
cd2b1110f36a

docker exec:在正在运行中的容器执行命令

docker info:显示系统范围内的信息
[root@Gin ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
  scan: Docker Scan (Docker Inc., v0.17.0)
......
Registry Mirrors:
  https://e1nfzb1k.mirror.aliyuncs.com/
 Live Restore Enabled: false

docker inspect:返回有关 Docker 对象的低级信息

容器事件处理状态
docker的工作流程

相应报错处理
遇到这种将系统提示的命令加上后进行安装
[root@Gin ~]# yum -y install docker-ce
Last metadata expiration check: 0:08:55 ago on Sat 06 Aug 2022 01:49:10 PM CST.
Error: 
 Problem: package docker-ce-3:20.10.17-3.el8.x86_64 requires containerd.io >= 1.4.1, but none of the providers can be installed
  - package containerd.io-1.4.10-3.1.el8.x86_64 conflicts with runc provided by runc-1.0.2-1.module_el8.5.0+911+f19012f9.x86_64
....
  - package runc-1.0.0-72.rc92.module_el8.5.0+1006+8d0e68a2.x86_64 is filtered out by modular filtering
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

[root@Gin ~]# yum -y install docker-ce --allowerasing
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值