微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ubuntu 14.04下安装Docker图文教程(二)

4.1构建我们自己的映像

构建Docker映像有两种方法

•通过dockercommit(提交)命令

•通过dockerbuild(构建)命令以及Docker文件Dockerfile

目前并不推荐docker提交方法,因为借助Docker文件进行构建要灵活得多、强大得多,但为了力求完整起见,我会向你演示提交方法

之后,我将重点介绍推荐的Docker映像构建方法:编写Docker文件,然后使用docker构建命令。

4.1.1使用Docker提交命令来创建映像

我将创建一个容器,并对该容器进行更改――就像更改代码那样,然后将那些变更内容提交给新的映像。

不妨先通过我们在过去使用的ubuntu映像来创建一个容器。

dockerrun-i-tubuntu/bin/bash

root@73527b8b4261:/#

注意:请注意上面的root显示了主机名称73527b8b4261,它是所创建的容器名称;它与你的情况会不一样。

此外,我会将apache安装在容器里面:

sudoapt-getinstallapache2

我已启动了容器,然后将Apache安装在里面。现在,我准备将该容器用作Web服务器,所以我将它保存在当前状态。

这样一来,我每次创建一个新的容器时,就没必要用Apache来重新构建它。为此,我将退出容器,使用exit命令,然后使用docker提交命令。

exit

dockercommit73527b8b4261srijan/apache28ce0ea7a1528

注意:这里的73527b8b4261是我的容器名称;我为容器使用8ce0ea7a1528标记,你可以赋予任何标记名称,也可以使用同一个名称

假设你忘了上一个创建的容器的编号,可以使用这个命令:

dockerps-l-q

它会得出73527b8b4261

注意:73527b8b4261是你上一个创建的容器名称,它与你的情况可能不一样。

不妨看一下我们的新映像。它可以这样获得,如下所示:

srijan@vBoxtest:~$dockerimagessrijan/apache2

REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE

srijan/apache28ce0ea7a1528741155868ac86minutesago207.2MB

srijan@vBoxtest:~$

注意:这里的8ce0ea7a1528是我在保存容器时所使用的标记名称

注意:741155868ac8是该容器的映像编号;

注意:所有这些值与你的情况可能不一样,因为在保存容器时,docker会创建相应的随机名称

现在,我将保存定制的映像,如下所示:

sudodockercommit-m="Anewcustomimage"--author="SrijanKishore"73527b8b4261srijan/apache2:webserver

它会给出结果:

f0367362eb405c513ac002b5cf172a2c0bc6c8212eab91c613f9ee611cf92fec

想从我们的新映像运行容器,我们只要使用dockerrun(运行)命令。

dockerrun-t-isrijan/apache2:webserver/bin/bash

我们可以反复核对已提交的映像,如下所示:

srijan@vBoxtest:~$dockerinspectsrijan/apache2:webserver

[{

"Architecture":"amd64",

"Author":"SrijanKishore",

"Comment":"Anewcustomimage",

"Config":{

"AttachStderr":false,

......................................................................

"Parent":"ef83896b7fb99b00b9e0e6ac943826386e7edcef11a3a2f58b42011ab4a4e683",

"Size":14463026

}

]srijan@vBoxtest:~$

想从我们的新映像运行容器,我们可以使用docker运行命令。

4.1.2Docker文件构建映像

Docker文件使用基本的特定领域语言(DSL),以及用于构建Docker映像的指令。然后,我们使用docker构建命令,通过Docker文件里面的指令来构建新的映像。

Docker公司的开发团队还在此发布了Docker文件教程(http://www.docker.io/learn/dockerfile/),可以帮助大家学会如何构建Docker文件

现在,我将创建一个简单的docker文件,它可以按照用户的需求,进一步改进和完善。首先,让一个目录假设为dir=kishore

mkdirkishore


cdkishore

现在创建一个Docker文件,如下所示:

viDockerfile

并输入内容,如下所示:

FROMubuntu:12.04

MAINTAINERSrijanKishore<s.kishore@ispconfig.org>

RUNapt-get-qqupdate

RUNapt-get-qqyinstallapache2

现在打开定制的容器,请使用这个命令:

sudodockerbuild-t="srijan/custom1".

它会得出如下结果:

[sudo]passwordforsrijan:

Sendingbuildcontexttodockerdaemon2.56kB

Sendingbuildcontexttodockerdaemon

Step0:FROMubuntu:12.04

Pullingrepositoryubuntu

ea7d6801c538:Downloadcomplete

511136ea3c5a:Downloadcomplete

65b7e9ccb809:Downloadcomplete

f8dd6bd14f58:Downloadcomplete

a343823119db:Downloadcomplete

--->ea7d6801c538

Step1:MAINTAINERSrijanKishore<s.kishore@ispconfig.org>

--->Runningina6135f405eb4

--->be97c22efa82

Removingintermediatecontainera6135f405eb4

..................................................................................

Removingintermediatecontainer5765c09b530f

Successfullybuilt634855a43331

srijan@vBoxtest:~/kishore$

现在不妨看一下我们的新映像。为此,我们可以使用docker映像命令来实现。


sudodockerimagessrijan/custom1

REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE

srijan/custom1latest634855a43331Aboutaminuteago277.4MB

srijan@vBoxtest:~/kishore$

这里,你会发现映像在认情况下会安装apache2。不妨反复核对一下:

dockerrun-t-isrijan/apache2:webserver/bin/bash

现在,你可以进入新容器,而apache212.04ubuntu已预装。

主机名称的更改

假设你想更改主机名称,或者你想有一个定制的主机名称,比如我这里的server1.example.com

我会使用:

sudodockerrun-h'server1.example.com'-t-isrijan/custom1/bin/bash

它会得出映像容器,如下所示:

root@server1:/#hostname-f

server1.example.com

root@server1:/#

Docker其它的实用命令集锦

pullpull用于从注册中心拉取映像或软件库)

dockerpullubuntu

commitcommit用于保存容器)

dockercommit73527b8b4261srijan/apache28ce0ea7a1528

cp(将文件/文件夹从容器的文件系统拷贝到主机路径。路径相对于文件系统的根目录。)

dockercpCONTAINER:PATHHOSTPATH

其中的CONTAINER是容器,将文件/文件夹从PATH拷贝到HOSTPATH

startstop容器:

dockerstart4386fb97867d

dockerstop4386fb97867d

其中的4386fb97867d是你的容器编号

export(将文件系统的内容作为tar存档文件导出到STDOUT

dockerexport4386fb97867d>latest.tar

import(创建一个空的文件系统映像,将打包文件[.tar.tar.gz.tgz.bzip.tar.xz.txz]内容导入到里面,然后以可选方式标记它。)

dockerimporthttp://example.com/exampleimage.tgz

从本地文件导入:

通过pipestdin导入到docker

catexampleimage.tgz|sudodockerimport-exampleimagelocal:new

从本地目录导入:

sudotar-c.|sudodockerimport-exampleimagedir

history显示映像的历史记录)

dockerhistory[OPTIONS]IMAGE

sudodockerhistoryea7d6801c538

images(它会显示映像)

dockerimages[OPTIONS][NAME]

它后面跟一些选项,如下所示:

-a,--all=false显示所有映像(认情况下,过滤掉中间映像层)

-f,--filter=[]:提供过滤器值(即“dangling=true”)

--no-trunc=false不截短输出

-q,--quiet=false显示数字编号

info显示整个系统的信息)

srijan@vBoxtest:~$sudodockerinfo

Containers:20

Images:65

StorageDriver:aufs

RootDir:/var/lib/docker/aufs

Dirs:105

ExecutionDriver:native-0.2

KernelVersion:3.13.0-30-generic

WARNING:Noswaplimitsupport

inspect(返回关于容器/映像的低级信息)

dockerinspectCONTAINER|IMAGE[CONTAINER|IMAGE...]

kill(终止运行中的容器/发送SIGKILL,即指定信号)

dockerkill[OPTIONS]CONTAINER[CONTAINER...]

login注册登录docker注册中心服务器,如果未指定任何服务器,https://index.docker.io/v1/认值。)

dockerloginlocalhost:8080

它会登录到自托管注册中心。

logs(读取容器的日志)

dockerlogsCONTAINER

ps(列出容器)

dockerps[OPTIONS]

它有下列选项:

-a,--all=false显示所有容器。认情况下只显示运行中的容器。

--before=""显示编号或名称之前创建的容器,包括非运行中的容器。

-l,--latest=false显示最近创建的容器,包括非运行中的容器。

-n=-1显示n个最近创建的容器,包括非运行中的容器。

--no-trunc=false不截短输出

-q,--quiet=false显示数字编号。

-s,--size=false显示大小。

--since=""显示自编号或名称以来创建的容器,包括非运行中的容器。

push(将映像或软件库推送到注册中心)

dockerpushNAME[:TAG]

restart(它将重启运行中的容器)

dockerrestart[OPTIONS]CONTAINER[CONTAINER...]

rm(它将删除一个或多个容器)

dockerrm[OPTIONS]CONTAINER[CONTAINER...]

rmi(它将删除一个或多个映像)

dockerrmiIMAGE[IMAGE...]

run(在新容器中运行命令)

dockerrun[OPTIONS]IMAGE[COMMAND][ARG...]

它有下列选项:

-a,--attach=[]连接到stdinstdoutstderr

-c,--cpu-shares=0处理器共享(相对权重)

--cidfile=""将容器编号写入到文件

-d,--detach=false分离模式:在后台运行容器,输出新的容器编号

--dns=[]设置自定义DNS服务器

--dns-search=[]设置自定义DNS搜索

-e,--env=[]设置环境变量

--entrypoint=""覆盖映像的认入口点

--env-file=[]在行分隔的文件中读取ENV变量

--expose=[]暴露来自容器的端口,又不将端口发布到你的主机

-h,--hostname=""容器主机名称

-i,--interactive=falsestdin保持开放,即便没有连接

--link=[]链接添加到另一个容器(名称:别名)

--lxc-conf=[]lxcexec-driveronly添加自定义lxc选项--lxc-conf="lxc.cgroup.cpuset.cpus=0,1"

-m,--memory=""内存限制(格式:<number><optionalunit>,其中unit=b,k,morg

--name=""为容器赋予名称

--net="bridge"为容器设置网络模式

'bridge':为docker网桥上的容器创建新的网络堆栈

'none':不为该容器创建任何网络机制

'container:<name|id>':重复使用另一个容器的网络堆栈

'host':使用容器里面的主机网络堆栈

-p,--publish=[]将容器的端口发布到主机

格式:ip:hostPort:containerPort|ip::containerPort|hostPort:containerPort

(使用“dockerport”即可看到实际映射)

-P,--publish-all=false 将所有暴露的端口发布到主机接口

--privileged=false为该容器赋予扩展后的权限

--rm=false容器退出后,自动删除容器(与-d不兼容)

--sig-proxy=true将所有收到的信号代理输出到进程(即便处于非-tty模式下)

-t,--tty=false分配伪终端

-u,--user=""用户名称或UID

-v,--volume=[]绑定挂载卷(比如来自host:-v/host:/container,来自docker:-v/container

--volumes-from=[]从指定的一个或多个容器挂载卷

-w,--workdir=""容器里面的工作目录

save(将映像保存到tar存档文件认情况下流式传输到stdout

dockersaveIMAGE

search搜索docker索引,寻找映像)

dockersearchTERM

tag(将映像标记到软件库)

dockertag[OPTIONS]IMAGE[REGISTRYHOST/][USERNAME/]NAME[:TAG]

top查询容器的运行中进程)

dockertopCONTAINER[psOPTIONS]

version显示docker版本信息)

srijan@vBoxtest:~$sudodockerversion

[sudo]passwordforsrijan:

Clientversion:1.0.1

ClientAPIversion:1.12

Goversion(client):go1.2.1

Gitcommit(client):990021a

Serverversion:1.0.1

ServerAPIversion:1.12

Goversion(server):go1.2.1

Gitcommit(server):990021a


如果系统中还不存在FedoraDocker镜像,这个命令会自动下载它,然后启动这个FedoraDocker容器。

上面的命令会立即启动Ubuntucontainer容器(这是一个完美的容器!),然后它会提供一个shell提示符运行环境给你。现在开始你可以通过这个沙箱环境访问一个完整的Ubuntu系统了。

输入“exit”命令退出Docker容器。

导出镜像

sudodockersaveIMAGENAME|bzip2-9-c>img.tar.bz2

导入镜像

sudobzip2-d-c<img.tar.bz2|dockerload


在主机节点上部署了Docker容器中,接着就需要虚拟出多个客户端容器。

3.Container容器网络设置

Docker使用Linux桥接技术与其他容器通信,以及连通外网。安装完Docker后你应该可以看到docker0这个网桥,这是Docker认创建的。你创建的每个容器都会通过这个网桥连接到网络。

4.自定义Linux网桥

如果你想自定义网桥,你可以执行以下步骤。你可以在这个网桥后面分配一个子网,并为这个子网分配地址。下面的命令会为Docker子网分配10.0.0.0/24地址段:

sudoapt-getinstallbridge-utils

sudobrctladdbrbr0

sudoifconfigbr010.0.0.1netmask255.255.255.0

然后在/etc/default/docker.io文件DOCKER_OPTS变量里添加-b=br0”选项,并重启Docker服务:

sudoservicedocker.iorestart

到目前为止,任何创建的容器都会连上br0网桥,它们的IP地址会从10.0.0.0/24自动分配(译注:在10.0.0.210.0.0.254之间随机分配)。

其他自定义设置

你可以通过/etc/default/docker.io文件DOCKER_OPTS变量设置其他一些属性

"-dns8.8.8.8-dns8.8.4.4":为容器指定DNS服务器。

"-icc=false":将容器与其他容器隔离出来

我试着让大家更加熟悉docker,但愿本文会帮助各位进一步了解docker,并在自己的测试/生产环境中充分利用docker

原文地址:https://www.jb51.cc/ubuntu/352682.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐