Docker 容器学习笔记

Docker 诞生于2013年,最初发起者是dotCloud公司.Docker自开源后受到普遍的关注和讨论,目前已有多个相关项目逐渐造成了围绕Docker容器的生态体系,因为Docker在业界形成的影响力实在太大,dotCloud公司后来也直接更名为Docker Inc,并专一于Docker相关技术和产品的开发.php

Docker是基于Go语言实现的开源容器项目,Docker让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的 Linux 机器上,也能够实现虚拟化.容器是彻底使用沙箱机制,相互之间不会有任何接口,html


Docker 容器简介

Docker的构想是要实现 "Build,Ship and Run Any App,Anywhere" ,即经过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件 "一次封装,处处运行" 的目的.这里的应用组件,既能够是一个Web应用、一个编译环境,也能够是一套数据库平台服务,甚至是一个操做系统或集群.基于Linux平台上的多项开源技术,Docker提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流云平台.能够说,Docker首次为应用的开发、运行和部署提供了"一站式"的实用解决方案,并且Docker的源代码是开源的,并已加入了Linux基金会,遵循Apache2.0协议,所有开源代码均在https://github.com/docker/上进行维护.python

跟大部分新兴技术的诞生同样,Docker也并不是"从石头缝里蹦出来的",而是站在前人的肩膀上,其中最重要的就是Linux容器(LinuxContainers LXC)技术,LXC能够提供轻量级的虚拟化,以便隔离进程和资源,并且不须要提供指令解释机制以及全虚拟化的其余复杂性.至关于C++中的NameSpace.容器有效地将由单个操做系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求,LXC在资源管理方面依赖于Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,能够为特定的进程组限定可使用的资源.LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag.mysql

Docker与Linux系统linux

在LXC的基础上,Docker进一步优化了容器的使用体验,首先Docker提供了各类容器管理工具(如分发、版本、移植等)让用户无需关注底层的操做,能够更简单明了地管理和使用容器.其次Docker经过引入分层文件系统构建和高效的镜像机制,下降了迁移难度,极大地提高了用户体验.用户操做Docker容器就像操做应用自身同样简单,早期的Docker代码实现是直接基于LXC的,自0.9版本开始Docker开发了libcontainer项目,做为更普遍的容器驱动实现,从而替换掉了LXC的实现.目前Docker还积极推进成立了runC标准项目,试图让容器支持再也不局限于Linux操做系统,而是更安全、更具扩展性.nginx

简单来讲,其实咱们能够把Docker容器理解为一种轻量级的沙盒(sandbox),每一个容器内运行着一个应用,不一样的容器相互隔离,容器之间也能够经过网络互相通讯.容器的建立和中止都十分快速,几乎跟建立和终止原生应用一致.另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机.不少时候,甚至直接把容器看成应用自己也没有任何问
题.git

Docker虚拟化的好处github

Docker项目的发起人和Docker公司CTO Solomon Hykes曾认为,Docker在正确的地点、正确的时间顺应了正确的趋势——如何正确地构建应用.在云时代,开发者建立的应用必需要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制.同时必须是"任什么时候间、任何地点"可获取的,所以,开发者须要一种新型的建立分布式应用程序的方式,快速分发和部署,这正是Docker所可以提供的最大优点,web

Docker还能够快速迁移数据,经过容器来打包应用,解耦应用和运行平台.意味着迁移的时候,只须要在新的服务器上启动须要的容器就能够了,不管新旧服务器是不是同一类型的平台.这无疑将节约大量的宝贵时间,并下降部署过程出现问题的风险.redis

Go语言与Docker

相比Go语言与其它语言的对比,国内外不少技术媒体都有列举,在Docker领域Go语言相比其它语言的优点在于.

● 相对于C/C++开发难度低,支持向前兼容,运维维护成本小.
● 相对于python生成的是静态文件,有效的避免的低级错误,而且性能高一个等级.
● 并发性好,内存占用低,属于编译型.
● 部署简单,毕竟生成的静态文件,有glibc的地方就能运行.

一门语言固然也有本身的缺点,好比内存回收延迟久,图片处理库有bug,对包版本要求严格等一些问题,可是瑕不掩瑜,一个开发成本极其简单,性能优良,部署简单的语言与Docker简直就是天做之合.

Docker的引擎简介

Docker的是基于Linux自带的(Linux Containers,LXC)技术,在LXC上Docker进行了近一步封装.正由于如此,Docker只能在Linux环境下运行,固然前段时间docker终于支持OSX和Windows了,虽然仍是体验尝鲜版,但更加方便开发者去开发了.

Docker的原理

其实前面讲了这么多,Docker的原理已经不言而喻,这里用IBM的解释就是:

容器有效的将单个操做系统管理的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求.与虚拟化相比,这样既不须要指令级模拟,也不须要即时编译.容器能够在核心CPU本地运行指令,而不须要任何专门的解释机制.此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性.

简而言之就是,Docker是一个盒子,一个盒子装一个玩具,不管你丢在哪里,你给他通电(glibc)他就能运行.你的玩具大就用大盒子,小玩具就用小盒子.

两个应用之间的环境是环境是彻底隔离的,创建通讯机制来互相调用.容器的建立和中止都十分快速(秒级),容器自身对资源的需求十分有限,远比虚拟机自己占用的资源少.


Docker的大部分操做都围绕着它的三大核心概念:镜像、容器、仓库而展开.所以,准确把握这三大核心概念对于掌握Docker技术尤其重要,在docker中,咱们重点关注的就是镜像和容器了.由于在实际应用中,咱们封装好镜像,而后经过镜像来建立容器,在容器运行咱们的应用就行了.而server端掌控网络和磁盘,咱们不用去关心,启动docker sever 和 docker client都是一条命令的事情.

镜像(Image): Docker镜像相似于虚拟机镜像,能够将它理解为一个只读的模板.例如,一个镜像能够包含一个基本的操做系统环境,里面仅安装了一个应用程序,能够把它称为一个镜像,镜像是建立Docker容器的基础.经过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来建立和更新现有的镜像,用户甚至能够从网上下载一个已经作好的应用镜像,并直接使用.

容器(Container): Docker容器相似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用.容器是从镜像建立的应用运行实例.能够将其启动、开始、中止、删除,而这些容器都是彼此相互隔离的、互不可见的.能够把容器看作是一个简易版的Linux系统环境,以及运行在其中的应用程序打包而成的盒子.

镜像启动后,都是一堆layer的统一视角,惟一的却别是镜像最上面那一层是只读的,不能够修改,可是容器最上面一层是rw的,提供给用户操做.

仓库(repository): Docker仓库相似于代码仓库,它是Docker集中存放镜像文件的场所.根据所存储的镜像公开分享与否,Docker仓库能够分为公开仓库(Public)和私有仓库(Private)两种形式.目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载.国内很多云服务提供商(如网易云、阿里云等)也提供了仓库的本地源,能够提供稳定的国内访问.


Docker 安装

1.配置YUM源,此处咱们使用阿里源,并安装EPEL源,和Docker相应的依赖.

[root@localhost ~]# rm -fr /etc/yum.repos.d/*
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# yum makecache
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

2.下载Docker源,并开始配置一些安装属性列表.

[root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@localhost ~]# yum-config-manager --enable docker-ce-edge
[root@localhost ~]# yum-config-manager --enable docker-ce-test
[root@localhost ~]# yum-config-manager --disable docker-ce-edge

3.开始安装Docker,并设置开机自启动.

[root@localhost ~]# yum install -y docker-ce
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# docker run hello-world

4.接着配置好阿里云Docker加速器地址.

[root@localhost ~]# vim /etc/docker/daemon.json

{
 "registry-mirrors": ["https://h8o9al0n.mirror.aliyuncs.com"]
}

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker version


管理Docker镜像

镜像是Docker三大核心概念中最为重要的,自Docker诞生之日起,镜像就是相关社区最为热门的关键词,Docker运行容器前须要本地存在对应的镜像,若是镜像没保存在本地,Docker会尝试先从默认Docker Hub仓库下载,用户也能够经过配置,使用自定义的镜像仓库.

下面例子将围绕镜像这一核心概念的具体操做,包括如何使用pull命令从Docker Hub仓库中下载镜像到本地,如何查看本地已有的镜像信息和管理镜像标签,如何在远端仓库使用search命令进行搜索和过滤,如何删除镜像标签和镜像文件,如何建立用户定制的镜像而且保存为外部文件.最后,还介绍如何往Docker Hub仓库中推送本身的镜像.

◆查询本地镜像◆

使用docker images命令能够列出本地主机上已有镜像的基本信息,还可使用条件过滤出你想要看获得的相关镜像文件的信息.

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

上面信息的参数解释,在列出的信息中能够看到如下几个字段信息:

REPOSITORY=来自于哪一个仓库,好比hello-world仓库.
TAG=镜像标签信息,latest表示不一样版本信息.
IMAGE ID=镜像惟一ID号,此处惟一.
CREATED=建立时间信息,镜像最后的更新时间.
SIZE=镜像大小,优秀的镜像每每体积都较小,hello-world很优秀.

其中镜像的ID信息十分重要,它惟一标识了镜像.在使用镜像ID的时候,通常可使用该ID的前若干个字符组成的可区分串来替代完整的ID,好比后期咱们要删除一个镜像时无需写出所有镜像ID.

TAG信息用来标记来自同一个仓库的不一样镜像,例如ubuntu仓库中有多个镜像,经过TAG信息来区分发行版本,包括13.0四、14.0四、16.04等标签.

镜像大小信息只是表示该镜像的逻辑体积大小,实际上因为相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像的逻辑体积之和.

实例1: 经过使用-a --all=true|false参数,列出全部的镜像文件(包括临时文件),默认为否.由于我这里只有一个镜像因此只有这一个啦.

[root@localhost ~]# docker images --all=true

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

实例2: 经过使用--digests=true|false,列出镜像的数字摘要值,默认为否.

[root@localhost ~]# docker images --digests=true

REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
hello-world         latest              sha256:0add3ace90ecb4adbf7777e9a   4ab4c602aa5e        3 months ago        1.84kB

实例3: 经过使用--quiet=true|false,仅输出ID信息,默认为否.

[root@localhost ~]# docker images -q
4ab4c602aa5e

[root@localhost ~]# docker images --quiet=false

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

◆查询网络镜像◆

使用docker search命令能够搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像.用法为docker search TERM.

实例1: 使用search搜索一个Centos镜像文件.

[root@localhost ~]# docker search centos

NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5048                [OK]            
ansible/centos7-ansible            Ansible on Centos7                              119                                     [OK]
jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86…   102                
......

实例2: 仅显示自动建立的镜像,默认为否.

[root@localhost ~]# docker search --automated=true centos
Flag --automated has been deprecated, use --filter=is-automated=true instead
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ansible/centos7-ansible           Ansible on Centos7                              119                                     [OK]
jdeathe/centos-ssh                CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86…   102                                     [OK]
consol/centos-xfce-vnc            Centos container with "headless" VNC session…   73                                      [OK]
imagine10255/centos6-lnmp-php56   centos6-lnmp-php56                              48                                      [OK]

实例3: 搜索全部自动建立的评价为1+的带nginx关键字的镜像.

[root@localhost ~]# docker search --automated -s 3 nginx

Flag --automated has been deprecated, use --filter=is-automated=true instead
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker con…   1488                                    [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable of…   663

◆拉镜像到本地◆

可使用docker pull命令直接从Docker Hub镜像源来下载镜像,该命令的格式为docker pull NAME[:TAG].其中NAME是镜像仓库的名称,TAG是镜像的标签,一般状况下,描述一个镜像须要包括"名称+标签".

实例: 经过pull命令获取一个Centos系统镜像.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker pull centos

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

◆给镜像加标签◆

为了方便在后续工做中使用特定镜像,还可使用docker tag命令来为本地镜像任意添加新的标签.

实例: 为Centos镜像添加一个新的mycentos:latest镜像标签.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker tag centos:latest mycentos:latest

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
mycentos            latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

上图可看到,当再次使用docker images列出本地主机上镜像信息,能够看到多了一个拥有mycentos:latest标签的镜像,细心的你可能注意到,这些mycentos:latest镜像的ID跟centos:latest彻底一致,它们实际上指向同一个镜像文件,只是别名不一样而已.docker tag命令添加的标签实际上起到了相似连接的做用.

◆查询镜像详情◆

使用docker inspect命令能够获取该镜像的详细信息,包括制做者、适应架构、各层的数字摘要等.

[root@localhost ~]# docker inspect hello-world

[
    {
        "Id": "sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f",
        "RepoTags": [
            "hello-world:latest"
        ],
        "RepoDigests": [
            "hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788"
        ],
.....

上面的输出有不少,只不过我这里简单显示了,若是咱们只要其中一项内容时,可使用参数-f来指定你要打印的数据,例以下面咱们来演示一下获取当前镜像的Id这个字段的数据.

[root@localhost ~]# docker inspect -f {{".Id"}} hello-world

sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f

◆查询镜像分层◆

既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可使用history子命令,该命令将列出各层的建立信息.注意过长的命令被自动截断了,可使用前面提到的--no-trunc选项来输出完整命令.

[root@localhost ~]# docker history centos:latest

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
1e1148e4cc2c        8 days ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           8 days ago          /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           8 days ago          /bin/sh -c #(nop) ADD file:6f877549795f4798a…   202MB

◆删除指定镜像◆

使用docker rmi命令能够删除镜像,其中IMAGE能够为标签或ID,若是要强制删除可加-f这个选项.

删除镜像: 经过rmi命令删除mycentos这个标签.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
mycentos            latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker rmi mycentos:latest
Untagged: mycentos:latest

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

强制删除: 强制删除系统所有镜像.

[root@localhost ~]# docker rmi -f $(docker images -q)

Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb
Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956
Untagged: hello-world:latest
Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f

◆镜像导入导出◆

导出操做: 经过save 镜像ID >导出centos镜像.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker save 1e1148e4cc2c > /root/centos.tar

[root@localhost ~]# ls
centos.tar

导入操做: 经过load < 文件名导入centos镜像.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker load < centos.tar

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

◆镜像命令速查◆

[root@localhost ~]# docker info                       #查询守护进程的系统资源设置
[root@localhost ~]# docker search                     #仓库镜像的查询
[root@localhost ~]# docker pull                       #仓库镜像的下载
[root@localhost ~]# docker images                     #本地镜像的查询
[root@localhost ~]# docker rmi                        #本地镜像的删除
[root@localhost ~]# docker rmi -f $(docker images -q) #强制删除所有镜像(Image)
[root@localhost ~]# docker rmi -f <image id>          #强制删除指定镜像(Image)
[root@localhost ~]# docker history 镜像名              #查询镜像的分层
[root@localhost ~]# docker save 镜像ID > /root/*.tar  #镜像的导出
[root@localhost ~]# docker load < /root/*.tar         #镜像的导入


管理Docker容器

容器是Docker的另外一个核心概念,简单来讲,容器是镜像的一个运行实例.所不一样的是,镜像是静态的只读文件,而容器带有运行时须要的可写文件层.若是认为虚拟机是模拟运行的一整套操做系统和跑在上面的应用,那么Docker容器就是独立运行的一个应用,以及它们必需的运行环境.

下面的例子将具体介绍围绕容器的重要操做,包括建立一个容器、启动容器、终止一个容器、进入容器内执行操做、删除容器和经过导入导出容器来实现容器迁移等.

◆建立容器◆

从如今开始,忘掉臃肿的虚拟机吧,对容器进行操做就跟直接操做应用同样简单、快速.Docker容器实在过轻量级了,用户能够随时建立或删除容器.

新建容器: 可使用docker create命令新建一个容器,使用docker create命令新建的容器处于中止状态,可使用docker start命令来启动它.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        9 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker create -it centos:latest
23c881ac33c526e60811978a418be92c6a022c106e6d59d989fb7b932dc3473a

[root@localhost ~]# docker start 23c881ac33c5
23c881ac33c5

新建并启动: 除了建立容器后经过start命令来启动,也能够直接新建并启动容器.所须要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        9 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker run centos:latest

守护态运行: 更多的时候,须要让Docker容器在后台以守护态Daemonized形式运行.此时,能够经过添加-d参数来实现.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        9 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker run -itd ubuntu:latest
540fd59ee8899a38c4302d83549bd113ad159064ec41c9475a773cbc0fd2dfb8

[root@localhost ~]# docker run -d centos:latest /bin/sh
505a728a2bed9e96b3e4615c4e528bd55285a856dc201bb50d4ed5c9e0a52566

[root@localhost ~]# docker run -d centos:latest /bin/sh -c "echo hello"
6c8fc14a6637928442b768bee0b2d3af800464192e7fce295f39ccdd91b73572

◆终止容器◆

可使用docker stop来终止一个运行中的容器,也可使用docker kill命令干掉一个容器.

stop终止容器: 指定经过stop终止一个容器.

[root@localhost ~]# docker stop 540fd59ee889
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
540fd59ee889        ubuntu:latest       "/bin/bash"         6 minutes ago       Up 6 minutes                            festive_liskov

[root@localhost ~]# docker stop 540fd59ee889
540fd59ee889

kill终止容器:docker kill命令会直接发送SIGKILL信号来强行终止容器.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
84da1ad9f06c        centos:latest       "/bin/bash"         33 seconds ago      Up 32 seconds                           hungry_bhabha

[root@localhost ~]# docker kill 84da1ad9f06c
84da1ad9f06c

◆进入容器◆

在使用-d参数时,容器启动后会进入后台,用户没法看到容器中的信息,也没法进行操做.
这个时候若是须要进入容器进行操做,有多种方法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等.下面分别介绍一下.

attach进入容器: attach是Docker自带的命令,下面咱们使用它来进入容器的内部吧.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
540fd59ee889        ubuntu:latest       "/bin/bash"         About a minute ago   Up About a minute                       festive_liskov
300560ca1c88        centos:latest       "/bin/bash"         3 minutes ago        Up 3 minutes                            ecstatic_raman

[root@localhost ~]# docker attach 300560ca1c88
[root@300560ca1c88 /]#

可是使用attach命令有时候并不方便,当多个窗口同时用attach命令连到同一个容器的时候,全部窗口都会同步显示.当某个窗口因命令阻塞时,其余窗口也没法执行操做了,接着下面的命令就更好一些了.

exec进入容器: Docker从1.3.0版本起提供了一个更加方便的exec命令,能够在容器内直接执行任意命令.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
540fd59ee889        ubuntu:latest       "/bin/bash"         3 minutes ago       Up 3 minutes                            festive_liskov

[root@localhost ~]# docker exec -it 540fd59ee889 /bin/bash
root@540fd59ee889:/#

能够看到,一个bash终端打开了,在不影响容器内其余应用的前提下,用户能够很容易与容器进行交互,经过指定-it参数来保持标准输入打开,而且分配一个伪终端.经过exec命令对容器执行操做是最为推荐的方式.

◆删除容器◆

可使用docker rm命令来删除处于终止或退出状态的容器.

rm 删除容器: 经过rm -f命令强制删除一个容器.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fa6110bdb3df        centos:latest       "/bin/bash"         3 seconds ago       Up 2 seconds                            eager_mirzakhani

[root@localhost ~]# docker rm -f fa6110bdb3df
fa6110bdb3df

◆命令速查◆

[root@localhost ~]# docker run                      #容器的建立或启动
[root@localhost ~]# docker run --restart=always     #设置容器的自启动

[root@localhost ~]# docker ps                       #运行中的容器的查询
[root@localhost ~]# docker ps --no-trunc            #查看容器状态
[root@localhost ~]# docker start/stop               #容器启动/关闭
[root@localhost ~]# docker stop $(docker ps -a -q)  #中止全部运行中的容器(Container)
[root@localhost ~]# docker rm $(docker ps -a -q)    #删除所有容器(Container)

[root@localhost ~]# docker start/stop 镜像名         #经过容器别名启动/中止
[root@localhost ~]# docker inspect 镜像名            #查看容器全部基本信息
[root@localhost ~]# docker logs 镜像名               #查看容器日志
[root@localhost ~]# docker stats 镜像名              #查看容器所占用的系统资源

[root@localhost ~]# docker exec 容器名 容器内执行的命令#容器执行命令
[root@localhost ~]# docker exec -it 容器名 /bin/bash  #登入容器的bash
[root@localhost ~]# docker run -it 容器名 /bin/bash   #进入一个镜像


Docker 持久存储

生产环境中使用Docker的过程当中,每每须要对数据进行持久化,或者须要在多个容器之间进行数据共享,这必然涉及容器的数据管理操做,容器管理中主要有两种方式,数据卷(Data Volumes),数据卷容器(Data Volume Containers),本小结将首先介绍如何在容器内建立数据卷,而且把本地的目录或文件挂载到容器内的数据卷中.接下来,会介绍如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复.

◆数据卷◆

数据卷是一个可供容器使用的特殊目录,它将主机操做系统目录直接映射进容器,相似于Linux中的mount操做.

数据卷能够提供不少有用的特性,以下所示:

● 数据卷能够在容器之间共享和重用,容器间传递数据将变得高效方便.
● 对数据卷内数据的修改会立马生效,不管是容器内操做仍是本地操做.
● 对数据卷的更新不会影响镜像,解耦了应用和数据.
● 卷会一直存在,直到没有容器使用,能够安全地卸载它.

挂载一个本地目录做为数据卷:

1.在本地主机建立一个目录,并写入一些数据,来模拟本地数据.

[root@localhost ~]# mkdir /data
[root@localhost ~]# echo "hello mkdirs.com" > /data/index.html

2.开启容器,并让容器读取本地的/data目录.

[root@localhost ~]# docker run -d -p 8080:80 --name MyWeb -v /data:/usr/local/apache2/htdocs httpd:latest
2882b3edda42fe153a897d3dc21f73835eb57c14019b5e810066c34e0eda4c0c

[参数解释]

    -d     #以守护进程运行
    -p     #将容器中的80口,映射到本地主机的8080
    --name #指定一个容器名称
    -v     #上面指的是,将本地/data目录挂载获得容器中的/usr/local目录中.
    -P     #是将容器服务暴露的端口,是自动映射到本地主机的临时端口.


[root@localhost ~]# curl 127.0.0.1:8080
hello mkdirs.com

◆数据卷容器◆

若是用户须要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器.数据卷容器也是一个容器,可是它的目的是专门用来提供数据卷供其余容器挂载.

1.首先,建立一个数据卷容器dbdata,并在容器中建立一个数据卷/dbdata的目录.

[root@localhost ~]# docker run -itd -v /usr/local/apache2/htdocs --name dbdata centos:latest
1bc16a7978db7db83a4a107bf2fe1c4c42c4c7fffa7dd92372a6aacb68ccfdd0

[root@localhost ~]# docker exec -it dbdata /bin/bash
[root@1bc16a7978db /]# echo "hello mkdirs.com" > /usr/local/apache2/htdocs/index.html
[root@1bc16a7978db /]# ls -lh /usr/local/apache2/htdocs/index.html
total 4.0K
-rw-r--r-- 1 root root 17 Dec 15 11:37 index.html

[root@1bc16a7978db /]# exit

2.而后,能够在其余容器中使用--volumes-from来挂载dbdata容器中的数据卷,例如建立db1和db2两个容器,并从dbdata容器挂载数据卷.

[root@localhost ~]# docker run -d -p 801:80 --volumes-from dbdata --name db1 httpd:latest
123e75f38947f3294ac77a08bf4380f311d09cc176b576c61499139d75b35db3

[root@localhost ~]# docker run -d -p 802:80 --volumes-from dbdata --name db2 httpd:latest
a4e0f8016af6b89e31a637b1482b0849dcea26e4004298def4abce44c84d6dd6

3.分别访问两个不一样的端口,会发现网页展示效果是同样的,也就是说,db1和db2共享了dbdata容器里指定文件的内容.

[root@localhost ~]# netstat -antp |grep 801
tcp6       0      0 :::801                  :::*                    LISTEN      3998/docker-proxy
[root@localhost ~]# netstat -antp |grep 802
tcp6       0      0 :::802                  :::*                    LISTEN      4157/docker-proxy

[root@localhost ~]# curl 127.0.0.1:801
hello mkdirs.com
[root@localhost ~]# curl 127.0.0.1:802
hello mkdirs.com

使用--volumes-from参数所挂载数据卷的容器自身并不须要保持在运行状态,若是删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除.若是要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器.

◆容器备份恢复◆

数据备份: 使用下面的命令来备份dbdata数据卷容器内的数据卷,并把它备份到当前目录下.

[root@localhost ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name workers centos:latest tar -czvf /backup/backup.tar /usr/local/apache2/htdocs

tar: Removing leading `/' from member names
/usr/local/apache2/htdocs/
/usr/local/apache2/htdocs/index.html
[root@localhost ~]# ls
backup.tar

这个命令稍微有点复杂,具体分析一下,首先利用centos镜像建立了一个容器workers.使用--volumes-from dbdata参数来让workers容器挂载dbdata容器的数据卷(即dbdata数据卷),使用-v $(pwd):/backup参数来挂载本地的当前目录到workers容器的/backup目录.workers容器启动后,使用了tar -czvf/backup/backup.tar /usr/local/apache2/htdocs命令来将/usr/local/apache2/htdocs下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar.

数据恢复: 若是要将数据恢复到一个容器,能够按照下面的步骤操做.

1.首先建立一个带有数据卷的容器dbdata_backup.

[root@localhost ~]# docker run -itd -v /usr/local/apache2/htdocs --name dbdata_backup centos:latest /bin/bash
a207d887bfa07cc0e1737efb197950cac3b2c5647391348b1b8fa8b873c58667

2.而后建立另外一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中.

[root@localhost ~]# docker run --volumes-from dbdata_backup -v $(pwd):/backup busybox tar -xzvf /backup/backup.tar

usr/local/apache2/htdocs/
usr/local/apache2/htdocs/index.html

本小结介绍了经过数据卷和数据卷容器对容器内数据进行共享、备份和恢复等操做,经过这些机制,即便容器在运行中出现故障,用户也没必要担忧数据发生丢失,只须要快速地从新建立容器便可.

Docker 端口映射

在实践中,常常会碰到须要多个服务组件容器共同协做的状况,这每每须要多个容器之间有可以互相访问到对方的服务,Docker提供了两个很方便的功能来知足服务访问的基本需求:一个是容许映射容器内应用的服务端口到本地宿主主机,另外一个是互联机制实现多个容器间经过容器名来快速访问,下面咱们来分别介绍一下吧.

◆从外部访问容器应用◆

随机分配端口: 当容器中运行一些网络应用,要让外部访问这些应用时,能够经过-P-p参数来指定端口映射.当使用-P(大写的)标记时,Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口.

[root@localhost ~]# docker run -d -P --name myweb httpd:latest
afb211e832c16c80822632fe0864838781cee2132993f93cde8c915e242f9df5

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
afb211e832c1        httpd:latest        "httpd-foreground"   3 seconds ago       Up 2 seconds        0.0.0.0:32768->80/tcp   myweb

指定分配端口: 当咱们使用-p(小写的)能够指定要映射的端口,而且,在一个指定端口上只能够绑定一个容器.

[root@localhost ~]# docker run -d -p 8080:80 --name myweb1 httpd:latest
b47f6131dea02c8cd22a75049e97c28cc4bb25bc6bf5cd36645c1ccb4210554e

#上面说明,将容器的80端口,映射到本地的8080

[root@localhost ~]# curl 127.0.0.1.8080
<html><body><h1>It works!</h1></body></html>

◆映射全部接口地址◆

映射指定端口: 格式将容器的80端口映射到本机的80端口.

[root@localhost ~]# docker run -d -p 80:80 --name myweb2 httpd:latest
9c3d0f8ad0bbfa75cc6534f93f959192316125a2776a2c909c71dc9dfb5a8b79

[root@localhost ~]# curl 127.0.0.1
<html><body><h1>It works!</h1></body></html>

映射多个端口: 屡次使用-p标记能够绑定多个端口.

[root@localhost ~]# docker run -d -p 8080:80 -p 1000:21 --name myweb3 httpd:latest
097ceb68128b58195c990dff720e39ca1717809cc2019d3f31466dee6fd32aec

[root@localhost ~]# netstat -antp |grep "8080"
tcp6       0      0 :::8080                 :::*                    LISTEN      2306/docker-proxy
[root@localhost ~]# netstat -antp |grep "1000"
tcp6       0      0 :::1000                 :::*                    LISTEN      2317/docker-proxy

◆映射到指定地址◆

映射到指定地址的指定端口: 将容器中的80端口映射到本地指定IP地址上去.

[root@localhost ~]# ifconfig ens32:0 192.168.1.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig ens32:0
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:0c:29:1e:14:e2  txqueuelen 1000  (Ethernet)

[root@localhost ~]# docker run -d -p 192.168.1.10:8080:80 --name myweb_port httpd:latest
7385faa5d476cb37dd7d201cd0ec939501c9bdb23ec1c8239245c30d2be9abe7

[root@localhost ~]# netstat -antp |grep "8080"
tcp        0      0 192.168.1.10:8080       0.0.0.0:*               LISTEN      2585/docker-proxy

[root@localhost ~]# curl 192.168.1.10:8080
<html><body><h1>It works!</h1></body></html>

映射到指定地址的任意端口: :本地主机会自动分配一个端口,绑定到容器的80口.

[root@localhost ~]# docker run -d -p 192.168.1.10::80 --name myweb_port1 httpd:latest
7a5a105ae0827aaff68864a28b5f9b8a9592af3551f7deca564ea2d6d5a249b3

[root@localhost ~]# netstat -antp |grep "80"
tcp        0      0 192.168.1.10:8080       0.0.0.0:*               LISTEN      2585/docker-proxy

#还可使用udp标记来指定udp端口
[root@localhost ~]# docker run -d -p 192.168.1.10:5000:5000/udp --name myweb_udp httpd:latest
b9cc6333a63109a70a1d2e645b1ff5046988b472dea3bb4f4d010f1478951adf

[root@localhost ~]# netstat -an |grep "5000"
udp        0      0 192.168.1.10:5000       0.0.0.0:*


Docker 容器互联

容器的互联(linking)是一种让多个容器中应用进行快速交互的方式,它会在源和接收容器之间建立链接关系,接收容器能够经过容器名快速访问到源容器,而不用指定具体的IP地址.

1.使用--link参数可让容器之间安全地进行交互,下面先建立一个新的MySQL数据库容器.

[root@localhost ~]# docker run -d --name mysqldb mysql:latest
c1770a69ed29944466ce013c42ac2a0391651c88381e41be05308eab80458390

2.而后建立一个新的web容器,并将它链接到MySQL容器,使之可以通讯.

[root@localhost ~]# docker run -d -P --name web --link mysqldb:mysqldb httpd:latest
8b2bfcbbe00f6966c511fdbbbc16e40736ab8d6aa89d229e224f38d12c4643df

此时,mysqldb容器和web容器创建互联关系,--link参数的格式为--link name:alias,其中name是要链接的容器名称,alias是这个链接的别名.

Docker至关于在两个互联的容器之间建立了一个虚机通道,并且不用映射它们的端口到宿主主机上.在启动mysqldb容器的时候并无使用-p和-P标记,从而避免了暴露数据库服务端口到外部网络上.

环境变量传递参数

FROM centos:latest
USER root
MAINTAINER lyshark@139.com

ENV USER none
ENV PASD none

在docker run 命令中经过 -e标记来传递环境变量,这样容器运行时就可使用该变量:

docker run -it --env "USER=root" \
               --env "PASD=1233" df434s4s /bin/bash

查看环境变量

[root@localhost ~]# docker inspect centos:v3
[root@localhost ~]# docker exec -it b2f327865a98 env

◆Apache◆

Apache是世界使用排名第一的Web服务器软件,它能够运行在几乎全部普遍使用的计算机平台上,因为其跨平台和安全性被普遍使用,是最流行的Web服务器端软件之一.它快速、可靠而且可经过简单的API扩充,将Perl/Python等解释器编译到服务器中.

1.拉取镜像,并在本地建立一个测试页.

[root@localhost ~]# docker pull httpd:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              2a51bb06dc8b        4 weeks ago         132MB

[root@localhost ~]# mkdir /web
[root@localhost ~]# echo "hello world" > /web/index.html

2.运行http容器,并访问测试.

[root@localhost ~]# docker run -d -p 8080:80 --name MyWeb -v /web:/usr/local/apache2/htdocs httpd:latest
[root@localhost ~]# curl 127.0.0.1:8080
hello world

◆GitLab◆

Gitlab是一款很是强大的开源源码管理系统.它支持基于Git的源码管理、代码评审、issue跟踪、活动管理、wiki页面,持续集成和测试等功能.基于Gitlab,用户能够本身搭建一套相似Github的开发协同平台.

1.安装并启动postgresql.

[root@localhost ~]# docker pull sameersbn/postgresql:latest
[root@localhost ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
sameersbn/postgresql   latest              3c0142eb3992        5 months ago        204MB

[root@localhost ~]# docker run --name gitlab_postgresql -d \
--env 'DB_NAME=gitlab' \
--env 'DB_USER=gitlab' --env 'DB_PASS=gitlab' \
sameersbn/postgresql:latest

2.安装redis.

[root@localhost ~]# docker pull sameersbn/redis:latest
[root@localhost ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
sameersbn/redis        latest              ad607f019b8c        4 months ago        84.8MB
sameersbn/postgresql   latest              3c0142eb3992        5 months ago        204MB

[root@localhost ~]# docker run --name gitlab_redis -itd sameersbn/redis:latest

3.安装GitLab.

[root@localhost ~]# docker pull sameersbn/gitlab:latest
[root@localhost ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
sameersbn/gitlab       latest              336fe9c19d92        6 days ago          1.96GB
sameersbn/redis        latest              ad607f019b8c        4 months ago        84.8MB
sameersbn/postgresql   latest              3c0142eb3992        5 months ago        204MB

[root@localhost ~]# docker run --name gitlab -d sameersbn/gitlab \
--link gitlab_postgresql:postgresql --link gitlab_redis:redis \
--publish 10022:22 --publish 10080:80 \
--env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
--env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
sameersbn/gitlab:latest

◆WordPress◆

WordPress是使用PHP语言开发的博客平台,用户能够在支持PHP和MySQL数据库的服务器上架设属于本身的网站.也能够把WordPress看成一个内容管理系统(CMS)来使用,WordPress逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的.用户能够在支持PHP和MySQL数据库的服务器上使用本身的博客.

1.首先安装一个MariaDB数据库,并配置好初始密码.

[root@localhost ~]# docker pull mariadb:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mariadb             latest              b468922dbbd7        3 weeks ago         366MB

[root@localhost ~]# docker run --name MyDataBase --env MYSQL_ROOT_PASSWORD=example -d mariadb:latest

2.拉取WordPress镜像,并运行,将容器内的80口映射到宿主机的8080口上.

[root@localhost ~]# docker pull wordpress:latest
[root@localhost ~]# docker run --name MyWordPress --link MyDataBase:MariaDB -p 8080:80 -d wordpress:latest


Docker 制做镜像

◆手动制做镜像◆

1.拉centos:latest 镜像为基础镜像

[root@localhost ~]# docker pull centos:latest

2.启动并进入容器内部

[root@localhost ~]# docker run -itd --name lamp --net=host centos:latest
[root@localhost ~]# docker exec -it lamp /bin/bash

3.安装lamp环境

yum install -y httpd httpd-devel \
               mariadb mariadb-server mysql-devel \
               php php-mysql php-common php-gd \
               php-mbstring php-mcrypt php-devel php-xml

4.写入一下内容.

echo "hello lyshark" > /var/www/html/index.html
echo "/usr/sbin/apachectl" >> /etc/bashrc

5.保存镜像,将所退出的容器用commit命令保存为一个新的my_ssh:centos镜像.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS             
ebfae6bcd308        centos:latest       "/bin/bash"         2 minutes ago       Up 2 minutes      

[root@localhost ~]# docker commit ebfae6bcd308 httpd:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              89cb7bb995ba        4 seconds ago       329 MB
docker.io/centos    latest              9f38484d220f        2 months ago        202 MB

6.启动容器,并添加端口映射10000-->22.其中10000是宿主主机的端口,22是容器的SSH服务监听端口.

[root@localhost ~]# docker run -itd -p 8080:80 httpd:latest
[root@localhost ~]# docker run -p 10000:22 -itd my_ssh:centos

◆编译制做镜像◆

1.首先咱们要解决Docker容器内不得网络问题.修改DockerDNS,默认没有文件自行建立便可.

[root@localhost ~]# vim /etc/default/docker
docker_OPTS="--dns 8.8.8.8 --dns 114.114.114.114"

[root@localhost ~]# systemctl restart docker

2.接着在当前目录建立一个Dockerfile文件,和一个index.html文件,文件内容以下.

vim Dockerfile

FROM centos:latest                          // 指定基础镜像
USER root                                   // 以root身份运行
MAINTAINER lyshark@139.com                  // 我的描述信息
ENV PATH $PATH:/usr/local/nginx/sbin/       // 指定环境变量

RUN yum install -y gcc wget pcre pcre-devel zlib zlib-devel openssl openssl-devel
WORKDIR /tmp/
RUN wget http://nginx.org/download/nginx-1.15.12.tar.gz
RUN tar -xzf nginx-1.15.12.tar.gz           // 解压文件
WORKDIR /tmp/nginx-1.15.12                  // 切换默认目录

RUN useradd -s /sbin/nologin -M nginx \     // 编译安装过程
&& ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
&& make \
&& make install

RUN echo "hello docker" > /usr/local/nginx/html/index.html
# COPY ./index.html /usr/local/nginx/html/      // 拷贝文件
EXPOSE 80                                       // 内部侦听端口
ENTRYPOINT  /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log  // 镜像入口
#CMD ["/usr/local/nginx/sbin/nginx"]            // 做用同上

3.编译镜像文件,并运行镜像

docker build -t nginx:latest .
docker run -d -p80:80 nginx:latest


Registry 仓库搭建

Docker Registry工具是Docker内置的私有仓库解决方案,新版本的Registry基于Golang进行了重构,提供更好的性能和扩展性,而且支持Docker 1.6+的API,很是适合用来构建私有的镜像注册服务器.官方仓库中也提供了Registry的镜像,所以用户能够经过容器运行和源码安装两种方
式来使用Registry.

实验规划Docker服务器:192.168.1.5,Docker客户端:192.168.1.25,请在服务端配置好网桥服务.

◆服务端配置◆

1.将本机配置成网桥,使之可以互相通讯.

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
DEVICE=eno16777728
TYPE=Ethernet
BOOTPROTO=static
BRIDGE=br0
NM_CONTROLLED=yes
ONBOOT=yes

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.1.15
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=114.114.114.114
ONBOOT=yes

[root@localhost ~]# reboot

2.在服务端192.168.1.5上拉取registry镜像包.

[root@localhost ~]# docker pull registry:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              2e2f252f3c88        3 months ago        33.3MB

3.在服务端192.168.1.5运行docker私有仓库成功执行,则咱们的docker私有仓库搭建成功.

[root@localhost ~]# docker run -itd -p 5000:5000 -v /registry:/var/lib/registry --restart=always --privileged=true --name my_registry registry:latest

◆客户端上传◆

1.此处咱们以hello-world为例,首先要先把它拉取下来.

[root@localhost ~]# docker pull hello-world:latest
[root@localhost ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              4ab4c602aa5e        3 months ago        1.84 kB

2.其次给hello-world镜像打个tag表示新的版本,过程当中指定服务器IP地址.

[root@localhost ~]# docker tag hello-world 192.168.1.5:5000/hello-world:latest
[root@localhost ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
192.168.1.5:5000/hello-world   latest              4ab4c602aa5e        3 months ago        1.84 kB
docker.io/hello-world          latest              4ab4c602aa5e        3 months ago        1.84 kB

3.因为docker私有仓库服务器,默认是基于https传输的,因此咱们须要在客户端192.168.1.25作相关设置,禁止使用https传输.

[root@localhost ~]# vim /etc/docker/daemon.json
{
        "registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"],
        "insecure-registries":["192.168.1.5:5000"]
}

4.依次执行下面两条命令,从新启动docker让其加载咱们的配置文件.

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# systemctl enable docker

5.执行推送命令,将咱们的hello-world推送到服务器上.

[root@localhost ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
192.168.1.5:5000/hello-world   latest              4ab4c602aa5e        3 months ago        1.84 kB
docker.io/hello-world          latest              4ab4c602aa5e        3 months ago        1.84 kB

[root@localhost ~]# docker push 192.168.1.5:5000/hello-world:latest
The push refers to a repository [192.168.1.5:5000/hello-world]
428c97da766c: Pushed
latest: digest: sha256:1a6fd470b9ce10849be79e99529a88371dff60c60aab424c077007f6979b4812 size: 524

6.在服务器端查看刚刚提交的一个请求.

[root@localhost ~]# ls -l /registry/docker/registry/v2/repositories
total 0
drwxr-xr-x 5 root root 55 Dec 17 20:23 hello-world

[root@localhost ~]# curl http://192.168.1.5:5000/v2/_catalog
{"repositories":["hello-world"]}

◆客户端拉取◆

1.客户端修改一下配置文件,指定如下服务器地址.

[root@localhost ~]# cat /etc/docker/daemon.json
{
        "registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"],
        "insecure-registries":["192.168.1.5:5000"]
}

2.修改Docker配置文件,开启局域网模式.

在/etc/default/docker添加一行:

DOCKER_OPTS="--insecure-registry 192.168.1.5:5000"

或在/etc/sysconfig/docker文件中添加

OPTIONS='--selinux-enabled --insecure-registry 192.168.1.5:5000'

3.从新启动Docker,加载配置文件.

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# systemctl enable docker

4.经过命令下载测试镜像.

[root@localhost ~]# docker pull 192.168.1.5:5000/hello-world:latest
相关文章
相关标签/搜索