admin

技巧指南:在Ubuntu上用Docker管理Linux容器

admin 运维技术 2022-11-20 594浏览 0

技巧指南:在Ubuntu上用Docker管理Linux容器

本文将介绍如何安装Docker,并用它高效地管理虚拟机。Docker是一种开源Linux虚拟化平台,以便广大开发人员和系统管理员轻松地开发、部署和执行分布式应用程序。Docker包括这几个部分:Docker引擎(一个轻型运行时和虚拟化层),封装和版本控制虚拟机的工具(类似源代码软件库),以及Docker Hub(一项共享应用程序、实现工作流自动化的云端服务)。Docker让应用程序得以由组件迅速装配而成,消除了开发环境、质量控制和生产环境之间的磨擦。

1 首项附注

以本文为例,我准备把docker安装在Ubuntu 14.04操作系统上。虚拟化软件市场上有几项标准硬件虚拟化技术,比如KVM、Xen或Hyper-V。可是标准虚拟化技术太过笨拙,无法对Linux上的单个应用程序进行虚拟化处理。我们可以克服这种情形,只要使用Linux容器(Linux Container):对操作系统层面的虚拟化而言,这是一种不错的替代方案。Linux容器是非常有用的方式,可以让开发/测试环境出现在安全有保障的一堆容器中。Docker提供了这种用途的Linux容器环境。

2 安装

如前所述,我准备把docker安装在Ubuntu上。在这一章节,我将为大家介绍安装docker的两种方法;在2a这部分中,我使用来自Ubuntu软件库的docker版本,这个版本由Ubuntu维护,提供整整5年的长期支持版(LTS)支持,但它不是***版本。在2b这部分中,我将使用来自Ubuntu ppa软件库的***版本。由于docker正在大力开发之中,来自2b)的***Docker版本极可能适合大多数用户。请使用方法2a或方法2b,但别同时使用这两种方法!

2a 从官方的Ubuntu软件库来安装

想安装docker,请使用下列命令:

sudoapt-getupdate 
sudoapt-getinstalldocker.io

然后创建符号链接,以便在外壳上使用起来更容易。

sudoln-sf/usr/bin/docker.io/usr/local/bin/docker 
sudosed-i'$acomplete-F_dockerdocker'/etc/bash_completion.d/docker.io

2b安装***的docker版本

想从docker.io软件库安装***的docker版本,运行这个命令:

curl-shttps://get.docker.io/ubuntu/|sudosh

3 准备外壳环境

现在,我将把我的user=srijan添加到docker组:

sudousermod-a-Gdockersrijan

或者使用:

sudousermod-a-Gdocker$USER

这里,我会退出当前会话,然后再重新登录。现在,我将添加docker配置文件,以便向系统通知其位置。

sudovi/etc/default/docker.io
DOCKER="/usr/bin/docker.io"

现在重启服务,如下所示:

sudoservicedocker.iorestart

4 容器管理

我准备随Ubuntu操作系统一同启动容器。我会下载docker映像,如下所示:

dockerpullubuntu

注意:pull命令用于从注册中心(registry)拉取映像或软件库。

现在我将使用下面这个命令,登录进入到Ubuntu容器的bash外壳:

dockerrun-i-tubuntu/bin/bash

仅仅为了确认,我将检查容器的IP,如下所示:

root@fd98ee950252:/#ifconfig 
eth0Linkencap:EthernetHWaddr5a:a6:c6:88:f2:48 
inetaddr:172.17.0.3Bcast:0.0.0.0Mask:255.255.0.0 
inet6addr:fe80::58a6:c6ff:fe88:f248/64Scope:Link 
UPBROADCASTRUNNINGMTU:1500Metric:1 
RXpackets:7errors:0dropped:2overruns:0frame:0 
TXpackets:8errors:0dropped:0overruns:0carrier:0 
collisions:0txqueuelen:1000 
RXbytes:558(558.0B)TXbytes:648(648.0B) 

loLinkencap:LocalLoopback 
inetaddr:127.0.0.1Mask:255.0.0.0 
inet6addr:::1/128Scope:Host 
UPLOOPBACKRUNNINGMTU:1500Metric:1 
RXpackets:0errors:0dropped:0overruns:0frame:0 
TXpackets:0errors:0dropped:0overruns:0carrier:0 
collisions:0txqueuelen:0 
RXbytes:0(0.0B)TXbytes:0(0.0B) 

root@fd98ee950252:/#

我容器上的IP地址为172.17.0.3。同样,我还可以使用其他窗口。想编辑容器,只要键入:

exit

同样,你可以有其他的操作系统容器,比如说。

我想使用Debian容器,就要使用代码:

dockerrun-i-tdebian/bin/bash

如果你想有某个发行版,那么就要使用这个命令:

dockerrun-i-tubuntu:12.04/bin/bash

它会创建ubuntu12.04容器。我会反复核实,如下所示:

root@44b56100fd1f:/#cat/etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04 
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu12.04.4LTS"
root@44b56100fd1f:/#

#p#

4.1 构建我们自己的映像

构建Docker映像有两种方法:

•通过docker commit(提交)命令

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

目前并不推荐docker提交方法,因为借助Docker文件进行构建要灵活得多、强大得多,但为了力求完整起见,我们会向你演示提交方法。之后,我将重点介绍推荐的Docker映像构建方法:编写Docker文件,然后使用docker构建命令。

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

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

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

dockerrun-i-tubuntu/bin/bash 
root@73527b8b4261:/#

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

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

apt-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会创建相应的随机名称。

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

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

它会给出结果:

srijan@vboxtest:~$dockercommit-m="Anewcustomimage"--author="SrijanKishore"73527b8b4261srijan/apache2:webserver 
f0367362eb405c513ac002b5cf172a2c0bc6c8212eab91c613f9ee611cf92fec

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

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

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

srijan@vboxtest:~$dockerinspectsrijan/apache2:webserver 
[{ 
"Architecture":"amd64", 
"Author":"SrijanKishore", 
"Comment":"Anewcustomimage", 
"Config":{ 
"AttachStderr":false, 
"AttachStdin":false, 
"AttachStdout":false, 
"Cmd":[ 
"/bin/bash" 
], 
"CpuShares":0, 
"Cpuset":"", 
"Domainname":"", 
"Entrypoint":null, 
"Env":[ 
"HOME=/", 
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 
], 
"ExposedPorts":null, 
"Hostname":"", 
"Image":"", 
"Memory":0, 
"MemorySwap":0, 
"NetworkDisabled":false, 
"OnBuild":null, 
"OpenStdin":false, 
"PortSpecs":null, 
"StdinOnce":false, 
"Tty":false, 
"User":"", 
"Volumes":null, 
"WorkingDir":"" 
}, 
"Container":"73527b8b42614f6ecd83fb5f9822d6086988d3b68fd5e32b4afbc7cd415402fd", 
"ContainerConfig":{ 
"AttachStderr":true, 
"AttachStdin":true, 
"AttachStdout":true, 
"Cmd":[ 
"/bin/bash" 
], 
"CpuShares":0, 
"Cpuset":"", 
"Domainname":"", 
"Entrypoint":null, 
"Env":[ 
"HOME=/", 
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 
], 
"ExposedPorts":null, 
"Hostname":"73527b8b4261", 
"Image":"ubuntu", 
"Memory":0, 
"MemorySwap":0, 
"NetworkDisabled":false, 
"OnBuild":null, 
"OpenStdin":true, 
"PortSpecs":null, 
"StdinOnce":true, 
"Tty":true, 
"User":"", 
"Volumes":null, 
"WorkingDir":"" 
}, 
"Created":"2014-06-30T12:58:04.973349049Z", 
"DockerVersion":"1.0.1", 
"Id":"f0367362eb405c513ac002b5cf172a2c0bc6c8212eab91c613f9ee611cf92fec", 
"Os":"linux", 
"Parent":"ef83896b7fb99b00b9e0e6ac943826386e7edcef11a3a2f58b42011ab4a4e683", 
"Size":14463026 
} 
]srijan@vboxtest:~$

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

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

#p#

4.2 用Docker文件构建映像

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".

它会得出如下结果:

srijan@vboxtest:~/kishore$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 
Step2:RUNapt-get-qqupdate 
--->Runninginb5681cd85ba8 
--->cbc3a95de894 
Removingintermediatecontainerb5681cd85ba8 
Step3:RUNapt-get-qqyinstallapache2 
--->Runningin5765c09b530f 
debconf:delayingpackageconfiguration,sinceapt-utilsisnotinstalled 
Selectingpreviouslyunselectedpackagelibsqlite3-0. 
(Readingdatabase...7551filesanddirectoriescurrentlyinstalled.) 
Unpackinglibsqlite3-0(from.../libsqlite3-0_3.7.9-2ubuntu1.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibroken18-heimdal. 
Unpackinglibroken18-heimdal(from.../libroken18-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibasn1-8-heimdal. 
Unpackinglibasn1-8-heimdal(from.../libasn1-8-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibgpg-error0. 
Unpackinglibgpg-error0(from.../libgpg-error0_1.10-2ubuntu1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibgcrypt11. 
Unpackinglibgcrypt11(from.../libgcrypt11_1.5.0-3ubuntu0.2_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibgdbm3. 
Unpackinglibgdbm3(from.../libgdbm3_1.8.3-10_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibp11-kit0. 
Unpackinglibp11-kit0(from.../libp11-kit0_0.12-2ubuntu1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibtasn1-3. 
Unpackinglibtasn1-3(from.../libtasn1-3_2.10-1ubuntu1.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibgnutls26. 
Unpackinglibgnutls26(from.../libgnutls26_2.12.14-5ubuntu3.8_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibhcrypto4-heimdal. 
Unpackinglibhcrypto4-heimdal(from.../libhcrypto4-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibheimbase1-heimdal. 
Unpackinglibheimbase1-heimdal(from.../libheimbase1-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibwind0-heimdal. 
Unpackinglibwind0-heimdal(from.../libwind0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibhx509-5-heimdal. 
Unpackinglibhx509-5-heimdal(from.../libhx509-5-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibkrb5-26-heimdal. 
Unpackinglibkrb5-26-heimdal(from.../libkrb5-26-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibheimntlm0-heimdal. 
Unpackinglibheimntlm0-heimdal(from.../libheimntlm0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibgssapi3-heimdal. 
Unpackinglibgssapi3-heimdal(from.../libgssapi3-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibsasl2-2. 
Unpackinglibsasl2-2(from.../libsasl2-2_2.1.25.dfsg1-3ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibldap-2.4-2. 
Unpackinglibldap-2.4-2(from.../libldap-2.4-2_2.4.28-1.1ubuntu4.4_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibcap2. 
Unpackinglibcap2(from.../libcap2_1%3a2.22-1ubuntu3_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibexpat1. 
Unpackinglibexpat1(from.../libexpat1_2.0.1-7.2ubuntu1.1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibmagic1. 
Unpackinglibmagic1(from.../libmagic1_5.09-2ubuntu0.3_amd64.deb)... 
Selectingpreviouslyunselectedpackagefile. 
Unpackingfile(from.../file_5.09-2ubuntu0.3_amd64.deb)... 
Selectingpreviouslyunselectedpackagemime-support. 
Unpackingmime-support(from.../mime-support_3.51-1ubuntu1_all.deb)... 
Selectingpreviouslyunselectedpackagenetbase. 
Unpackingnetbase(from.../netbase_4.47ubuntu1_all.deb)... 
Selectingpreviouslyunselectedpackagelibsasl2-modules. 
Unpackinglibsasl2-modules(from.../libsasl2-modules_2.1.25.dfsg1-3ubuntu0.1_amd64.deb)... 
Selectingpreviouslyunselectedpackageopenssl. 
Unpackingopenssl(from.../openssl_1.0.1-4ubuntu5.16_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibapr1. 
Unpackinglibapr1(from.../libapr1_1.4.6-1_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibaprutil1. 
Unpackinglibaprutil1(from.../libaprutil1_1.3.12+dfsg-3_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibaprutil1-dbd-sqlite3. 
Unpackinglibaprutil1-dbd-sqlite3(from.../libaprutil1-dbd-sqlite3_1.3.12+dfsg-3_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibaprutil1-ldap. 
Unpackinglibaprutil1-ldap(from.../libaprutil1-ldap_1.3.12+dfsg-3_amd64.deb)... 
Selectingpreviouslyunselectedpackageapache2.2-bin. 
Unpackingapache2.2-bin(from.../apache2.2-bin_2.2.22-1ubuntu1.6_amd64.deb)... 
Selectingpreviouslyunselectedpackageapache2-utils. 
Unpackingapache2-utils(from.../apache2-utils_2.2.22-1ubuntu1.6_amd64.deb)... 
Selectingpreviouslyunselectedpackagelibswitch-perl. 
Unpackinglibswitch-perl(from.../libswitch-perl_2.16-2_all.deb)... 
Selectingpreviouslyunselectedpackagelibclass-isa-perl. 
Unpackinglibclass-isa-perl(from.../libclass-isa-perl_0.36-3_all.deb)... 
Selectingpreviouslyunselectedpackageperl-modules. 
Unpackingperl-modules(from.../perl-modules_5.14.2-6ubuntu2.4_all.deb)... 
Selectingpreviouslyunselectedpackageperl. 
Unpackingperl(from.../perl_5.14.2-6ubuntu2.4_amd64.deb)... 
Selectingpreviouslyunselectedpackageapache2.2-common. 
Unpackingapache2.2-common(from.../apache2.2-common_2.2.22-1ubuntu1.6_amd64.deb)... 
Selectingpreviouslyunselectedpackageapache2-mpm-worker. 
Unpackingapache2-mpm-worker(from.../apache2-mpm-worker_2.2.22-1ubuntu1.6_amd64.deb)... 
Selectingpreviouslyunselectedpackageapache2. 
Unpackingapache2(from.../apache2_2.2.22-1ubuntu1.6_amd64.deb)... 
Selectingpreviouslyunselectedpackagessl-cert. 
Unpackingssl-cert(from.../ssl-cert_1.0.28ubuntu0.1_all.deb)... 
Settinguplibsqlite3-0(3.7.9-2ubuntu1.1)... 
Settinguplibroken18-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibasn1-8-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibgpg-error0(1.10-2ubuntu1)... 
Settinguplibgcrypt11(1.5.0-3ubuntu0.2)... 
Settinguplibgdbm3(1.8.3-10)... 
Settinguplibp11-kit0(0.12-2ubuntu1)... 
Settinguplibtasn1-3(2.10-1ubuntu1.1)... 
Settinguplibgnutls26(2.12.14-5ubuntu3.8)... 
Settinguplibhcrypto4-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibheimbase1-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibwind0-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibhx509-5-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibkrb5-26-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibheimntlm0-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibgssapi3-heimdal(1.6~git20120311.dfsg.1-2ubuntu0.1)... 
Settinguplibsasl2-2(2.1.25.dfsg1-3ubuntu0.1)... 
Settinguplibldap-2.4-2(2.4.28-1.1ubuntu4.4)... 
Settinguplibcap2(1:2.22-1ubuntu3)... 
Settinguplibexpat1(2.0.1-7.2ubuntu1.1)... 
Settinguplibmagic1(5.09-2ubuntu0.3)... 
Settingupfile(5.09-2ubuntu0.3)... 
Settingupmime-support(3.51-1ubuntu1)... 
update-alternatives:using/usr/bin/seetoprovide/usr/bin/view(view)inautomode. 
Settingupnetbase(4.47ubuntu1)... 
Settinguplibsasl2-modules(2.1.25.dfsg1-3ubuntu0.1)... 
Settingupopenssl(1.0.1-4ubuntu5.16)... 
Settinguplibapr1(1.4.6-1)... 
Settinguplibaprutil1(1.3.12+dfsg-3)... 
Settinguplibaprutil1-dbd-sqlite3(1.3.12+dfsg-3)... 
Settinguplibaprutil1-ldap(1.3.12+dfsg-3)... 
Settingupapache2.2-bin(2.2.22-1ubuntu1.6)... 
Settingupapache2-utils(2.2.22-1ubuntu1.6)... 
Settinguplibclass-isa-perl(0.36-3)... 
Settingupssl-cert(1.0.28ubuntu0.1)... 
debconf:unabletoinitializefrontend:Dialog 
debconf:(TERMisnotset,sothedialogfrontendisnotusable.) 
debconf:fallingbacktofrontend:Readline 
debconf:unabletoinitializefrontend:Readline 
debconf:(Thisfrontendrequiresacontrollingtty.) 
debconf:fallingbacktofrontend:Teletype 
Settinguplibswitch-perl(2.16-2)... 
Settingupperl-modules(5.14.2-6ubuntu2.4)... 
Settingupperl(5.14.2-6ubuntu2.4)... 
update-alternatives:using/usr/bin/prenametoprovide/usr/bin/rename(rename)inautomode. 
Settingupapache2.2-common(2.2.22-1ubuntu1.6)... 
Enablingsitedefault. 
Enablingmodulealias. 
Enablingmoduleautoindex. 
Enablingmoduledir. 
Enablingmoduleenv. 
Enablingmodulemime. 
Enablingmodulenegotiation. 
Enablingmodulesetenvif. 
Enablingmodulestatus. 
Enablingmoduleauth_basic. 
Enablingmoduledeflate. 
Enablingmoduleauthz_default. 
Enablingmoduleauthz_user. 
Enablingmoduleauthz_groupfile. 
Enablingmoduleauthn_file. 
Enablingmoduleauthz_host. 
Enablingmodulereqtimeout. 
Settingupapache2-mpm-worker(2.2.22-1ubuntu1.6)... 
invoke-rc.d:policy-rc.ddeniedexecutionofstart. 
Settingupapache2(2.2.22-1ubuntu1.6)... 
Processingtriggersforlibc-bin... 
ldconfigdeferredprocessingnowtakingplace 
--->634855a43331 
Removingintermediatecontainer5765c09b530f 
Successfullybuilt634855a43331 
srijan@vboxtest:~/kishore$

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

dockerimagessrijan/custom1

srijan@vboxtest:~/kishore$dockerimagessrijan/custom1 
REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE 
srijan/custom1latest634855a43331Aboutaminuteago277.4MB 
srijan@vboxtest:~/kishore$

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

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

现在,你可以进入新容器,而apache2和12.04ubuntu已预装。

#p#

5 主机名称的更改

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

我会使用:

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

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

srijan@vboxtest:~/kishore$dockerrun-h'server1.example.com'-t-isrijan/custom1/bin/bash 
root@server1:/#hostname-f 
server1.example.com 
root@server1:/#

6 docker的实用命令集锦

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

比如:

dockerrun-i-tubuntu/bin/bash

•commit(commit用于保存容器)

比如:

dockercommit73527b8b4261srijan/apache28ce0ea7a1528 

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

比如:

dockercpCONTAINER:PATHHOSTPATH

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

•start和stop容器:

dockerstart4386fb97867d
dockerstop4386fb97867d

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

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

dockerexport4386fb97867d>latest.tar

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

dockerimporthttp://example.com/exampleimage.tgz

从本地文件导入:

通过pipe和stdin导入到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@VE130214:~$sudodockerinfo

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="" 只显示自编号或名称以来创建的容器,包括非运行中的容器。

#p#

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

dockerpushNAME[:TAG]

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

dockerrestart[OPTIONS]CONTAINER[CONTAINER...]

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

dockerrm[OPTIONS]CONTAINER[CONTAINER...]

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

dockerrmiIMAGE[IMAGE...]

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

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

它有下列选项:

-a, –attach=[] 连接到stdin、stdout或stderr

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

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

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

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

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

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

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

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

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

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

-i, –interactive=false   让stdin保持开放,即便没有连接

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

–lxc-conf=[] (lxc exec-driver only)添加自定义lxc选项–lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"

-m, –memory="" 内存限制(格式:<number><optional unit>,其中unit = b, k, m or g)

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

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

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

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

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

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

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

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

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

-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

6 结束语

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

继续浏览有关 Linux 的文章
发表评论