Docker学习笔记讲解Word文档格式.docx
《Docker学习笔记讲解Word文档格式.docx》由会员分享,可在线阅读,更多相关《Docker学习笔记讲解Word文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
*注:
镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
Docker仓库
仓库是集中存放镜像文件的场所。
有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是DockerHub,存放了数量庞大的镜像供用户下载。
国内的公开仓库包括DockerPool等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。
Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
安装方式
安装EPEL
EPEL是yum的一个软件源,里面包含了许多基本源里没有的软件。
(安装需要连接网络)
安装了这个源后,就可以使用yum来安装docker了。
yuminstallepel-release-7
安装过程需要交互,输入“y”按回车就可以了。
验证是否安装成功:
yumrepolist
安装Docker-io
yum-yinstalldocker-io
配置开机自启动:
chkconfigdockeron
完成后,启动服务:
servicedockerstart
应用Docker
通过下面命令来验证doecker是否安装成功:
dockerinfo
出现下面类似内容,则表示安装成功:
使用下面命令网络仓库下载需要镜像:
dockerpullcentos:
latest#下载centos
dockerpullubutun:
latest#下载ubutun
使用下面命令查看当前镜像:
dockerimages
在列出信息中,可以看到几个字段信息
∙来自于哪个仓库,比如docker.io/ubuntu
∙镜像的标记,比如latest
∙它的ID号(唯一)07f8e8c5e660
∙创建时间
∙镜像大小
使用docker完成“helloworld"
:
dockerrunubuntu:
07f8e8c5e660/bin/echo‘helloworld‘
dockerruncentos:
fd44297e2ddb/bin/echo‘hellodocker‘
进入交互式容器:
sudodockerrun-t-iubuntu:
07f8e8c5e660/bin/bash
-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上-i则让容器的标准输入保持打开。
修改已有镜像:
使用交互模式在已有的centos镜像中安装gem应用,exit退出后,使用dockercommit来提交更新后的副本
dockercommit-m"
addgem"
-a"
Ray"
032c501e000fdocker.io/centos:
v2
∙-m来指定提交的说明信息,跟我们使用的版本控制工具一样;
∙-a可以指定更新的用户信息;
∙之后是用来创建镜像的容器的ID;
∙最后指定目标镜像的仓库名和tag信息,创建成功后会返回这个镜像的ID信息。
可以通过dockerimages查看新创建的镜像:
可以再通过dockerrun打开新创建的镜像:
dockerrun-t-icentos:
v2/bin/bash
利用dockerfile来创建镜像
使用dockercommit来扩展一个镜像比较简单,但是不方便在一个团队中分享。
我们可以使用dockerbuild来创建一个新的镜像。
为此,首先需要创建一个Dockerfile,包含一些如何创建镜像的指令,新建一个目录和一个Dockerfile
[root@localhost~]#cd/opt/
[root@localhostopt]#
[root@localhostopt]#mkdirubuntu
[root@localhostopt]#cdubuntu/
[root@localhostubuntu]#touchDockerfile
Dockerfile中每一条指令都创建镜像的一层,例如:
1.
1.#Thisisacomment
2.MAINTAINERRay<
tsbc@>
3.FROMubuntu:
latest
4.RUNapt-get-qqyinstallrubyruby-dev
5.RUNapt-get-qqupdate
Dockerfile基本的语法是
使用#来注释
FROM指令告诉Docker使用哪个镜像作为基础RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用apt-get来安装了一些软件编写完成Dockerfile后可以使用dockerbuild来生成镜像。
dockerbuild-t="
ubuntu:
latest"
.
其中-t标记来添加tag,指定新的镜像的用户信息。
“.”是Dockerfile所在的路径(当前目录),也可以替换为一个具体的Dockerfile的路径。
可以看到build进程在执行操作。
注意一个镜像不能超过127层
它要做的第一件事情就是上传这个Dockerfile内容,因为所有的操作都要依据Dockerfile来进行。
然后,Dockerfile中的指令被一条一条的执行,每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的dockercommit一样)。
当所有的指令都执行完毕之后,返回了最终的镜像id。
所有的中间步骤所产生的容器都被删除和清理了。
此外,还可以利用ADD命令复制本地文件到镜像;
(需要再做尝试)
用EXPOSE命令来向外部开放端口;
*用CMD命令来描述容器启动后运行的程序等。
从本地文件系统导入
要从本地文件系统导入一个镜像,可以使用openvz(容器虚拟化的先锋技术)的模板来创建:
openvz的模板下载地址为templates。
比如,先下载了一个centos-7-x86_64-minimal.tar.gz的镜像,之后使用以下命令导入:
catcentos-7-x86_64-minimal.tar.gz|dockerimport-centos:
v7.mini
然后查看导入的镜像:
上传镜像
用户可以通过dockerpush命令,把自己创建的镜像上传到仓库中来共享。
dockerpushdocker.io/ubuntu
存出镜像
如果要导出镜像到本地文件,可以使用dockersave命令。
dockersave-oubuntu.14.0.4.tardocker.io/ubuntu:
载入镜像
可以使用dockerload从导出的本地文件中再导入到本地镜像库,例如
dockerload--inputubuntu.14.0.4.tar
或者
dockerload<
ubuntu.14.0.4.tar
移除本地镜像
可以用dockerrmi移除,注意dockerrm是移除容器
dockerrmidocker.io/ubuntu
dockerrmi07f8e8c5e660
容器是Docker又一核心概念。
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。
对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
守护态运行
dockerrun-dubuntu:
ruby/bin/sh-c"
whiletrue;
doechohelloworld;
sleep1;
done"
容器启动后会返回一个唯一的id,也可以通过dockerps命令来查看容器信息。
dockerps
要获取容器的输出信息,可以通过dockerlogs命令。
dockerlogsgoofy_cori
终止容器
可以使用dockerstop来终止一个运行中的容器。
此外,当Docker容器中指定的应用终结时,容器也自动终止。
用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止。
终止状态的容器可以用dockerps-a命令看到。
例如
dockerps-a
处于终止状态的容器,可以通过dockerstart命令来重新启动。
dockerstart6fb00e62cfe9#id
此外,dockerrestart命令会将一个运行态的容器终止,然后再重新启动它.
dockerrestart6fb00e62cfe9#id
进入容器
在使用-d参数时,容器启动后会进入后台。
某些时候需要进入容器进行操作,有很多种方法,包括使用dockerattach命令或nsenter工具等。
attach命令
dockerattach是Docker自带的命令。
dockerrun-idtubuntu#后台启动容器
dockerps#查看容器进程NAMES
dockerattachstoic_newton#通过NAMES(stoic_newton)进入容器
nsenter命令
但是使用attach命令有时候并不方便。
当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。
当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
安装nsenter
nsenter工具在util-linux包2.23版本后包含,可以先使用nsenter-version进行查看。
如果系统中util-linux包没有该命令,可以按照下面的方法从源码安装。
cd/tmp
curlhttps:
//www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
tar-zxfutil-linux-2.24.tar.gz
cdutil-linux-2.24;
./configure--without-ncurses
makensenter&
&
sudocpnsenter/usr/local/bin
wget-P~
echo"
[-f~/.bashrc_docker]&
.~/.bashrc_docker"
>
>
~/.bashrc;
source~/.bashrc
同时建议大家下载.bashrc_docker,并将内容放到.bashrc中。
这个文件中定义了很多方便使用Docker的命令,例如docker-pid可以获取某个容器的PID;
而docker-enter可以进入容器或直接在容器内执行命令。
下面给出一个完整的例子:
echo$(docker-pid10f839063336)#通过容器ID查看,容器中的首进程ID
docker-enter10f839063336ls#可以docker-enter[容器id]直接操作容器
nsenter--target838--mount--uts--ipc--net--pid#通过首进程ID(838)进入容器
导入和导出容器
如果要导出本地某个容器,可以使用dockerexport命令,导入某个容器快照使用dockerimport命令:
dockerexport7691a814370e>
ubuntu.tar#导出容器到本地
catubuntu.tar|dockerimport-test/ubuntu:
v1.0#导入容器快照到镜像
dockerimportexample/imagerepo#从URL导入容器快照
用户既可以使用dockerload来导入镜像存储文件到本地镜像库,也可以使用dockerimport来导入一个容器快照到本地镜像库。
这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。
此外,从容器快照文件导入时可以重新指定标签等元数据信息。
删除容器
可以使用dockerrm来删除一个处于终止状态的容器。
例如
dockerrmtrusting_newton
如果要删除一个运行中的容器,可以添加-f参数。
Docker会发送SIGKILL信号给容器。
仓库
仓库(Repository)是集中存放镜像的地方。
一个容易混淆的概念是注册服务器(Registry)。
实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。
从这方面来说,仓库可以被认为是一个具体的项目或目录。
例如对于仓库地址来说,是注册服务器地址,ubuntu是仓库名。
大部分时候,并不需要严格区分这两者的概念。
DockerHub
基本操作
目前Docker官方维护了一个公共仓库DockerHub,其中已经包括了超过15,000的镜像。
大部分需求,都可以通过在DockerHub中直接下载镜像来实现。
用户无需登录即可通过dockersearch命令来查找官方仓库中的镜像,并利用dockerpull命令来将它下载到本地。
例如以centos为关键词进行搜索:
dockersearchcentos
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建。
官方的镜像说明是官方项目组创建和维护的,automated资源允许用户验证镜像的来源和内容。
根据是否是官方提供,可将镜像资源分为两类。
一种是类似centos这样的基础镜像,被称为基础或根镜像。
这些基础镜像是由Docker公司创建、验证、支持、提供。
这样的镜像往往使用单个单词作为名字。
还有一种类型,比如tianon/centos镜像,它是由Docker的用户创建并维护的,往往带有用户名称前缀。
可以通过前缀user_name/来指定使用某个用户提供的镜像,比如tianon用户。
另外,在查找的时候通过-sN参数可以指定仅显示评价为N星以上的镜像。
下载官方centos镜像到本地:
私有仓库
本节介绍如何使用本地仓库。
docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。
安装运行docker-registry
有时候使用DockerHub这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
容器运行
在安装了Docker后,可以通过获取官方registry镜像来运行。
dockerrun-d-p5000:
5000registry
这将使用官方的registry镜像来启动本地的私有仓库。
用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到AmazonS3服务。
dockerrun\
-eSETTINGS_FLAVOR=s3\
-eAWS_BUCKET=acme-docker\
-eSTORAGE_PATH=/registry\
-eAWS_KEY=AKIAHSHB43HS3J92MXZ\
-eAWS_SECRET=xdDowwlK7TJajV1Y7EoOZrmuPEJlHYcNP2k4j49T\
-eSEARCH_BACKEND=sqlalchemy\
-p5000:
5000\
registry
此外,还可以指定本地路径(如/home/user/registry-conf)下的配置文件。
5000-v/home/user/registry-conf:
/registry-conf-eDOCKER_REGISTRY_CONFIG=/registry-conf/config.ymlregistry
默认情况下,仓库会被创建在容器的/tmp/registry下。
可以通过-v参数来将镜像文件存放在本地的指定路径。
例如下面的例子将上传的镜像放到/opt/data/registry目录。
5000-v/opt/data/registry:
/tmp/registryregistry
本地安装
对于Ubuntu或CentOS等发行版,可以直接通过源安装。
Ubuntu
sudoapt-getinstall-ybuild-essentialpython-devlibevent-devpython-pipliblzma-dev
sudopipinstalldocker-registryCentOS
yuminstall-ypython-devellibevent-develpython-pipgccxz-devel
python-pipinstalldocker-registry
也可以从docker-registry项目下载源码进行安装。
apt-getinstallbuild-essentialpython-devlibevent-devpython-piplibssl-devliblzma-devlibffi-dev
gitclone
cddocker-registry
sudopythonsetup.pyinstall
然后修改配置文件,主要修改dev模板段的storage_path到本地的存储仓库的路径。
cpconfig/config_sample.ymlconfig/config.yml
之后启动Web服务。
gunicorn-ccontrib/gunicorn.pydocker_registry.wsgi:
application
gunicorn--access-logfile--error-logfile--kgevent-b0.0.0.0:
5000-w4--max-requests100docker_registry.wsgi:
此时使用curl访问本地的5000端口,看到输出docker-registry的版本信息说明运行成功。
config/config_sample.yml文件是示例配置文件。
在私有仓库上传、下载、搜索镜像
创建好私有仓库之后,就可以使用dockertag来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。
例如私有仓库地址为192.168.7.26:
5000。
先在本机查看已有的镜像。
$sudodockerimages
REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE
ubuntulatestba5877dc9bec6weeksago192.7MB
ubuntu14.04ba5877dc9bec6weeksago192.7MB
使用dockertag将ba58这个镜像标记为192.168.7.26:
5000/test(格式为dockertagIMAGE[:
TAG][REGISTRYHOST/][USERNAME/]NAME[:
TAG])。
$sudodockertagba58192.168.7.26:
5000/test
root~#dockerimages
192.168.7.26:
5000/testlatestba5877dc9bec6weeksago192.7M
使用dockerpush上传标记的镜像。
dockerpush192.168.7.26:
Thepushreferstoarepository[192.168.7.26:
5000/test](len:
1)
Sendingimagelist
Pushingrepository192.168.7.26:
5000/test(1tags)