技巧指南:在Ubuntu上用Docker管理Linux容器
譯文【51CTO精選譯文】本文將介紹如何安裝Docker,并用它高效地管理虛擬機(jī)。Docker是一種開(kāi)源Linux虛擬化平臺(tái),以便廣大開(kāi)發(fā)人員和系統(tǒng)管理員輕松地開(kāi)發(fā)、部署和執(zhí)行分布式應(yīng)用程序。Docker包括這幾個(gè)部分:Docker引擎(一個(gè)輕型運(yùn)行時(shí)和虛擬化層),封裝和版本控制虛擬機(jī)的工具(類(lèi)似源代碼軟件庫(kù)),以及Docker Hub(一項(xiàng)共享應(yīng)用程序、實(shí)現(xiàn)工作流自動(dòng)化的云端服務(wù))。Docker讓?xiě)?yīng)用程序得以由組件迅速裝配而成,消除了開(kāi)發(fā)環(huán)境、質(zhì)量控制和生產(chǎn)環(huán)境之間的磨擦。
1 首項(xiàng)附注
以本文為例,我準(zhǔn)備把docker安裝在Ubuntu 14.04操作系統(tǒng)上。虛擬化軟件市場(chǎng)上有幾項(xiàng)標(biāo)準(zhǔn)硬件虛擬化技術(shù),比如KVM、Xen或Hyper-V??墒菢?biāo)準(zhǔn)虛擬化技術(shù)太過(guò)笨拙,無(wú)法對(duì)Linux上的單個(gè)應(yīng)用程序進(jìn)行虛擬化處理。我們可以克服這種情形,只要使用Linux容器(Linux Container):對(duì)操作系統(tǒng)層面的虛擬化而言,這是一種不錯(cuò)的替代方案。Linux容器是非常有用的方式,可以讓開(kāi)發(fā)/測(cè)試環(huán)境出現(xiàn)在安全有保障的一堆容器中。Docker提供了這種用途的Linux容器環(huán)境。
2 安裝
如前所述,我準(zhǔn)備把docker安裝在Ubuntu上。在這一章節(jié),我將為大家介紹安裝docker的兩種方法;在2a這部分中,我使用來(lái)自Ubuntu軟件庫(kù)的docker版本,這個(gè)版本由Ubuntu維護(hù),提供整整5年的長(zhǎng)期支持版(LTS)支持,但它不是***版本。在2b這部分中,我將使用來(lái)自Ubuntu ppa軟件庫(kù)的***版本。由于docker正在大力開(kāi)發(fā)之中,來(lái)自2b)的***Docker版本極可能適合大多數(shù)用戶。請(qǐng)使用方法2a或方法2b,但別同時(shí)使用這兩種方法!
2a 從官方的Ubuntu軟件庫(kù)來(lái)安裝
想安裝docker,請(qǐng)使用下列命令:
- sudo apt-get update
- sudo apt-get install docker.io
然后創(chuàng)建符號(hào)鏈接,以便在外殼上使用起來(lái)更容易。
- sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
- sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
2b安裝***的docker版本
想從docker.io軟件庫(kù)安裝***的docker版本,運(yùn)行這個(gè)命令:
- curl -s https://get.docker.io/ubuntu/ | sudo sh
3 準(zhǔn)備外殼環(huán)境
現(xiàn)在,我將把我的user=srijan添加到docker組:
- sudo usermod -a -G docker srijan
或者使用:
- sudo usermod -a -G docker $USER
這里,我會(huì)退出當(dāng)前會(huì)話,然后再重新登錄?,F(xiàn)在,我將添加docker配置文件,以便向系統(tǒng)通知其位置。
- sudo vi /etc/default/docker.io
- DOCKER="/usr/bin/docker.io"
現(xiàn)在重啟服務(wù),如下所示:
- sudo service docker.io restart
4 容器管理
我準(zhǔn)備隨Ubuntu操作系統(tǒng)一同啟動(dòng)容器。我會(huì)下載docker映像,如下所示:
- docker pull ubuntu
注意:pull命令用于從注冊(cè)中心(registry)拉取映像或軟件庫(kù)。
現(xiàn)在我將使用下面這個(gè)命令,登錄進(jìn)入到Ubuntu容器的bash外殼:
- docker run -i -t ubuntu /bin/bash
僅僅為了確認(rèn),我將檢查容器的IP,如下所示:
- root@fd98ee950252:/# ifconfig
- eth0 Link encap:Ethernet HWaddr 5a:a6:c6:88:f2:48
- inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
- inet6 addr: fe80::58a6:c6ff:fe88:f248/64 Scope:Link
- UP BROADCAST RUNNING MTU:1500 Metric:1
- RX packets:7 errors:0 dropped:2 overruns:0 frame:0
- TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:1000
- RX bytes:558 (558.0 B) TX bytes:648 (648.0 B)
- lo Link encap:Local Loopback
- inet addr:127.0.0.1 Mask:255.0.0.0
- inet6 addr: ::1/128 Scope:Host
- UP LOOPBACK RUNNING MTU:1500 Metric:1
- RX packets:0 errors:0 dropped:0 overruns:0 frame:0
- TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:0
- RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
- root@fd98ee950252:/#
我容器上的IP地址為172.17.0.3。同樣,我還可以使用其他窗口。想編輯容器,只要鍵入:
- exit
同樣,你可以有其他的操作系統(tǒng)容器,比如說(shuō)。
我想使用Debian容器,就要使用代碼:
- docker run -i -t debian /bin/bash
如果你想有某個(gè)發(fā)行版,那么就要使用這個(gè)命令:
- docker run -i -t ubuntu:12.04 /bin/bash
它會(huì)創(chuàng)建ubuntu12.04容器。我會(huì)反復(fù)核實(shí),如下所示:
- root@44b56100fd1f:/# cat /etc/lsb-release
- DISTRIB_ID=Ubuntu
- DISTRIB_RELEASE=12.04
- DISTRIB_CODENAME=precise
- DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"
- root@44b56100fd1f:/#
#p#
4.1 構(gòu)建我們自己的映像
構(gòu)建Docker映像有兩種方法:
•通過(guò)docker commit(提交)命令
•通過(guò)docker build(構(gòu)建)命令以及Docker文件(Dockerfile)
目前并不推薦docker提交方法,因?yàn)榻柚鶧ocker文件進(jìn)行構(gòu)建要靈活得多、強(qiáng)大得多,但為了力求完整起見(jiàn),我們會(huì)向你演示提交方法。之后,我將重點(diǎn)介紹推薦的Docker映像構(gòu)建方法:編寫(xiě)Docker文件,然后使用docker構(gòu)建命令。
4.1 使用Docker提交命令來(lái)創(chuàng)建映像
我將創(chuàng)建一個(gè)容器,并對(duì)該容器進(jìn)行更改――就像更改代碼那樣,然后將那些變更內(nèi)容提交給新的映像。
不妨先通過(guò)我們?cè)谶^(guò)去使用的ubuntu映像來(lái)創(chuàng)建一個(gè)容器。
- docker run -i -t ubuntu /bin/bash
- root@73527b8b4261:/#
注意:請(qǐng)注意上面的root顯示了主機(jī)名稱(chēng)73527b8b4261,它是所創(chuàng)建的容器名稱(chēng);它與你的情況會(huì)不一樣。
此外,我會(huì)將apache安裝在容器里面:
- apt-get install apache2
我已啟動(dòng)了容器,然后將Apache安裝在里面?,F(xiàn)在,我準(zhǔn)備將該容器用作Web服務(wù)器,所以我將它保存在當(dāng)前狀態(tài)。
這樣一來(lái),我每次創(chuàng)建一個(gè)新的容器時(shí),就沒(méi)必要用Apache來(lái)重新構(gòu)建它。為此,我將退出容器,使用exit命令,然后使用docker提交命令。
- exit
- docker commit 73527b8b4261 srijan/apache2 8ce0ea7a1528
注意:這里的73527b8b4261是我的容器名稱(chēng);我為容器使用8ce0ea7a1528標(biāo)記,你可以賦予任何標(biāo)記名稱(chēng),也可以使用同一個(gè)名稱(chēng)。
假設(shè)你忘了上一個(gè)創(chuàng)建的容器的編號(hào),可以使用這個(gè)命令:
- docker ps -l -q
它會(huì)得出73527b8b4261
注意:73527b8b4261是你上一個(gè)創(chuàng)建的容器名稱(chēng),它與你的情況可能不一樣。
不妨看一下我們的新映像。它可以這樣獲得,如下所示:
- srijan@vboxtest:~$ docker images srijan/apache2
- REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
- srijan/apache2 8ce0ea7a1528 741155868ac8 6 minutes ago 207.2 MB
- srijan@vboxtest:~$
注意:這里的8ce0ea7a1528是我在保存容器時(shí)所使用的標(biāo)記名稱(chēng);
注意:741155868ac8是該容器的映像編號(hào);
注意:所有這些值與你的情況可能不一樣,因?yàn)樵诒4嫒萜鲿r(shí),docker會(huì)創(chuàng)建相應(yīng)的隨機(jī)名稱(chēng)。
現(xiàn)在,我將保存定制的映像,如下所示:
- docker commit -m="A new custom image" --author="Srijan Kishore" 73527b8b4261 srijan/apache2:webserver
它會(huì)給出結(jié)果:
- srijan@vboxtest:~$ docker commit -m="A new custom image" --author="Srijan Kishore" 73527b8b4261 srijan/apache2:webserver
- f0367362eb405c513ac002b5cf172a2c0bc6c8212eab91c613f9ee611cf92fec
想從我們的新映像運(yùn)行容器,我們只要使用docker run(運(yùn)行)命令。
- docker run -t -i srijan/apache2:webserver /bin/bash
我們可以反復(fù)核對(duì)已提交的映像,如下所示:
- srijan@vboxtest:~$ docker inspect srijan/apache2:webserver
- [{
- "Architecture": "amd64",
- "Author": "Srijan Kishore",
- "Comment": "A new custom image",
- "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:~$
想從我們的新映像運(yùn)行容器,我們可以使用docker運(yùn)行命令。
- docker run -t -i srijan/apache2:webserver /bin/bash
#p#
4.2 用Docker文件構(gòu)建映像
Docker文件使用基本的特定領(lǐng)域語(yǔ)言(DSL),以及用于構(gòu)建Docker映像的指令。然后,我們使用docker構(gòu)建命令,通過(guò)Docker文件里面的指令來(lái)構(gòu)建新的映像。Docker公司的開(kāi)發(fā)團(tuán)隊(duì)還在此發(fā)布了Docker文件教程(http://www.docker.io/learn/dockerfile/),可以幫助大家學(xué)會(huì)如何構(gòu)建Docker文件。
現(xiàn)在,我將創(chuàng)建一個(gè)簡(jiǎn)單的docker文件,它可以按照用戶的需求,進(jìn)一步改進(jìn)和完善。首先,讓一個(gè)目錄假設(shè)為dir=kishore:
- mkdir kishore
- cd kishore
現(xiàn)在創(chuàng)建一個(gè)Docker文件,如下所示:
- vi Dockerfile
并輸入內(nèi)容,如下所示:
- FROM ubuntu:12.04
- MAINTAINER Srijan Kishore <s.kishore@ispconfig.org>
- RUN apt-get -qq update
- RUN apt-get -qqy install apache2
現(xiàn)在打開(kāi)定制的容器,請(qǐng)使用這個(gè)命令:
- sudo docker build -t="srijan/custom1" .
它會(huì)得出如下結(jié)果:
- srijan@vboxtest:~/kishore$ sudo docker build -t="srijan/custom1" .
- [sudo] password for srijan:
- Sending build context to Docker daemon 2.56 kB
- Sending build context to Docker daemon
- Step 0 : FROM ubuntu:12.04
- Pulling repository ubuntu
- ea7d6801c538: Download complete
- 511136ea3c5a: Download complete
- 65b7e9ccb809: Download complete
- f8dd6bd14f58: Download complete
- a343823119db: Download complete
- ---> ea7d6801c538
- Step 1 : MAINTAINER Srijan Kishore <s.kishore@ispconfig.org>
- ---> Running in a6135f405eb4
- ---> be97c22efa82
- Removing intermediate container a6135f405eb4
- Step 2 : RUN apt-get -qq update
- ---> Running in b5681cd85ba8
- ---> cbc3a95de894
- Removing intermediate container b5681cd85ba8
- Step 3 : RUN apt-get -qqy install apache2
- ---> Running in 5765c09b530f
- debconf: delaying package configuration, since apt-utils is not installed
- Selecting previously unselected package libsqlite3-0.
- (Reading database ... 7551 files and directories currently installed.)
- Unpacking libsqlite3-0 (from .../libsqlite3-0_3.7.9-2ubuntu1.1_amd64.deb) ...
- Selecting previously unselected package libroken18-heimdal.
- Unpacking libroken18-heimdal (from .../libroken18-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libasn1-8-heimdal.
- Unpacking libasn1-8-heimdal (from .../libasn1-8-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libgpg-error0.
- Unpacking libgpg-error0 (from .../libgpg-error0_1.10-2ubuntu1_amd64.deb) ...
- Selecting previously unselected package libgcrypt11.
- Unpacking libgcrypt11 (from .../libgcrypt11_1.5.0-3ubuntu0.2_amd64.deb) ...
- Selecting previously unselected package libgdbm3.
- Unpacking libgdbm3 (from .../libgdbm3_1.8.3-10_amd64.deb) ...
- Selecting previously unselected package libp11-kit0.
- Unpacking libp11-kit0 (from .../libp11-kit0_0.12-2ubuntu1_amd64.deb) ...
- Selecting previously unselected package libtasn1-3.
- Unpacking libtasn1-3 (from .../libtasn1-3_2.10-1ubuntu1.1_amd64.deb) ...
- Selecting previously unselected package libgnutls26.
- Unpacking libgnutls26 (from .../libgnutls26_2.12.14-5ubuntu3.8_amd64.deb) ...
- Selecting previously unselected package libhcrypto4-heimdal.
- Unpacking libhcrypto4-heimdal (from .../libhcrypto4-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libheimbase1-heimdal.
- Unpacking libheimbase1-heimdal (from .../libheimbase1-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libwind0-heimdal.
- Unpacking libwind0-heimdal (from .../libwind0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libhx509-5-heimdal.
- Unpacking libhx509-5-heimdal (from .../libhx509-5-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libkrb5-26-heimdal.
- Unpacking libkrb5-26-heimdal (from .../libkrb5-26-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libheimntlm0-heimdal.
- Unpacking libheimntlm0-heimdal (from .../libheimntlm0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libgssapi3-heimdal.
- Unpacking libgssapi3-heimdal (from .../libgssapi3-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libsasl2-2.
- Unpacking libsasl2-2 (from .../libsasl2-2_2.1.25.dfsg1-3ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package libldap-2.4-2.
- Unpacking libldap-2.4-2 (from .../libldap-2.4-2_2.4.28-1.1ubuntu4.4_amd64.deb) ...
- Selecting previously unselected package libcap2.
- Unpacking libcap2 (from .../libcap2_1%3a2.22-1ubuntu3_amd64.deb) ...
- Selecting previously unselected package libexpat1.
- Unpacking libexpat1 (from .../libexpat1_2.0.1-7.2ubuntu1.1_amd64.deb) ...
- Selecting previously unselected package libmagic1.
- Unpacking libmagic1 (from .../libmagic1_5.09-2ubuntu0.3_amd64.deb) ...
- Selecting previously unselected package file.
- Unpacking file (from .../file_5.09-2ubuntu0.3_amd64.deb) ...
- Selecting previously unselected package mime-support.
- Unpacking mime-support (from .../mime-support_3.51-1ubuntu1_all.deb) ...
- Selecting previously unselected package netbase.
- Unpacking netbase (from .../netbase_4.47ubuntu1_all.deb) ...
- Selecting previously unselected package libsasl2-modules.
- Unpacking libsasl2-modules (from .../libsasl2-modules_2.1.25.dfsg1-3ubuntu0.1_amd64.deb) ...
- Selecting previously unselected package openssl.
- Unpacking openssl (from .../openssl_1.0.1-4ubuntu5.16_amd64.deb) ...
- Selecting previously unselected package libapr1.
- Unpacking libapr1 (from .../libapr1_1.4.6-1_amd64.deb) ...
- Selecting previously unselected package libaprutil1.
- Unpacking libaprutil1 (from .../libaprutil1_1.3.12+dfsg-3_amd64.deb) ...
- Selecting previously unselected package libaprutil1-dbd-sqlite3.
- Unpacking libaprutil1-dbd-sqlite3 (from .../libaprutil1-dbd-sqlite3_1.3.12+dfsg-3_amd64.deb) ...
- Selecting previously unselected package libaprutil1-ldap.
- Unpacking libaprutil1-ldap (from .../libaprutil1-ldap_1.3.12+dfsg-3_amd64.deb) ...
- Selecting previously unselected package apache2.2-bin.
- Unpacking apache2.2-bin (from .../apache2.2-bin_2.2.22-1ubuntu1.6_amd64.deb) ...
- Selecting previously unselected package apache2-utils.
- Unpacking apache2-utils (from .../apache2-utils_2.2.22-1ubuntu1.6_amd64.deb) ...
- Selecting previously unselected package libswitch-perl.
- Unpacking libswitch-perl (from .../libswitch-perl_2.16-2_all.deb) ...
- Selecting previously unselected package libclass-isa-perl.
- Unpacking libclass-isa-perl (from .../libclass-isa-perl_0.36-3_all.deb) ...
- Selecting previously unselected package perl-modules.
- Unpacking perl-modules (from .../perl-modules_5.14.2-6ubuntu2.4_all.deb) ...
- Selecting previously unselected package perl.
- Unpacking perl (from .../perl_5.14.2-6ubuntu2.4_amd64.deb) ...
- Selecting previously unselected package apache2.2-common.
- Unpacking apache2.2-common (from .../apache2.2-common_2.2.22-1ubuntu1.6_amd64.deb) ...
- Selecting previously unselected package apache2-mpm-worker.
- Unpacking apache2-mpm-worker (from .../apache2-mpm-worker_2.2.22-1ubuntu1.6_amd64.deb) ...
- Selecting previously unselected package apache2.
- Unpacking apache2 (from .../apache2_2.2.22-1ubuntu1.6_amd64.deb) ...
- Selecting previously unselected package ssl-cert.
- Unpacking ssl-cert (from .../ssl-cert_1.0.28ubuntu0.1_all.deb) ...
- Setting up libsqlite3-0 (3.7.9-2ubuntu1.1) ...
- Setting up libroken18-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libasn1-8-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libgpg-error0 (1.10-2ubuntu1) ...
- Setting up libgcrypt11 (1.5.0-3ubuntu0.2) ...
- Setting up libgdbm3 (1.8.3-10) ...
- Setting up libp11-kit0 (0.12-2ubuntu1) ...
- Setting up libtasn1-3 (2.10-1ubuntu1.1) ...
- Setting up libgnutls26 (2.12.14-5ubuntu3.8) ...
- Setting up libhcrypto4-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libheimbase1-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libwind0-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libhx509-5-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libkrb5-26-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libheimntlm0-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libgssapi3-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
- Setting up libsasl2-2 (2.1.25.dfsg1-3ubuntu0.1) ...
- Setting up libldap-2.4-2 (2.4.28-1.1ubuntu4.4) ...
- Setting up libcap2 (1:2.22-1ubuntu3) ...
- Setting up libexpat1 (2.0.1-7.2ubuntu1.1) ...
- Setting up libmagic1 (5.09-2ubuntu0.3) ...
- Setting up file (5.09-2ubuntu0.3) ...
- Setting up mime-support (3.51-1ubuntu1) ...
- update-alternatives: using /usr/bin/see to provide /usr/bin/view (view) in auto mode.
- Setting up netbase (4.47ubuntu1) ...
- Setting up libsasl2-modules (2.1.25.dfsg1-3ubuntu0.1) ...
- Setting up openssl (1.0.1-4ubuntu5.16) ...
- Setting up libapr1 (1.4.6-1) ...
- Setting up libaprutil1 (1.3.12+dfsg-3) ...
- Setting up libaprutil1-dbd-sqlite3 (1.3.12+dfsg-3) ...
- Setting up libaprutil1-ldap (1.3.12+dfsg-3) ...
- Setting up apache2.2-bin (2.2.22-1ubuntu1.6) ...
- Setting up apache2-utils (2.2.22-1ubuntu1.6) ...
- Setting up libclass-isa-perl (0.36-3) ...
- Setting up ssl-cert (1.0.28ubuntu0.1) ...
- debconf: unable to initialize frontend: Dialog
- debconf: (TERM is not set, so the dialog frontend is not usable.)
- debconf: falling back to frontend: Readline
- debconf: unable to initialize frontend: Readline
- debconf: (This frontend requires a controlling tty.)
- debconf: falling back to frontend: Teletype
- Setting up libswitch-perl (2.16-2) ...
- Setting up perl-modules (5.14.2-6ubuntu2.4) ...
- Setting up perl (5.14.2-6ubuntu2.4) ...
- update-alternatives: using /usr/bin/prename to provide /usr/bin/rename (rename) in auto mode.
- Setting up apache2.2-common (2.2.22-1ubuntu1.6) ...
- Enabling site default.
- Enabling module alias.
- Enabling module autoindex.
- Enabling module dir.
- Enabling module env.
- Enabling module mime.
- Enabling module negotiation.
- Enabling module setenvif.
- Enabling module status.
- Enabling module auth_basic.
- Enabling module deflate.
- Enabling module authz_default.
- Enabling module authz_user.
- Enabling module authz_groupfile.
- Enabling module authn_file.
- Enabling module authz_host.
- Enabling module reqtimeout.
- Setting up apache2-mpm-worker (2.2.22-1ubuntu1.6) ...
- invoke-rc.d: policy-rc.d denied execution of start.
- Setting up apache2 (2.2.22-1ubuntu1.6) ...
- Processing triggers for libc-bin ...
- ldconfig deferred processing now taking place
- ---> 634855a43331
- Removing intermediate container 5765c09b530f
- Successfully built 634855a43331
- srijan@vboxtest:~/kishore$
現(xiàn)在不妨看一下我們的新映像。為此,我們可以使用docker映像命令來(lái)實(shí)現(xiàn)。
- docker images srijan/custom1
- srijan@vboxtest:~/kishore$ docker images srijan/custom1
- REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
- srijan/custom1 latest 634855a43331 About a minute ago 277.4 MB
- srijan@vboxtest:~/kishore$
這里,你會(huì)發(fā)現(xiàn)映像在默認(rèn)情況下會(huì)安裝apache2。不妨反復(fù)核對(duì)一下:
- docker run -t -i srijan/apache2:webserver /bin/bash
現(xiàn)在,你可以進(jìn)入新容器,而apache2和12.04ubuntu已預(yù)裝。
#p#
5 主機(jī)名稱(chēng)的更改
假設(shè)你想更改主機(jī)名稱(chēng),或者你想有一個(gè)定制的主機(jī)稱(chēng),比如我這里的server1.example.com。
我會(huì)使用:
- docker run -h 'server1.example.com' -t -i srijan/custom1 /bin/bash
它會(huì)得出映像容器,如下所示:
- srijan@vboxtest:~/kishore$ docker run -h 'server1.example.com' -t -i srijan/custom1 /bin/bash
- root@server1:/# hostname -f
- server1.example.com
- root@server1:/#
6 docker的實(shí)用命令集錦
•pull(pull用于從注冊(cè)中心拉取映像或軟件庫(kù))
比如:
- docker run -i -t ubuntu /bin/bash
•commit(commit用于保存容器)
比如:
- docker commit 73527b8b4261 srijan/apache2 8ce0ea7a1528
•cp(將文件/文件夾從容器的文件系統(tǒng)拷貝到主機(jī)路徑。路徑相對(duì)于文件系統(tǒng)的根目錄。)
比如:
- docker cp CONTAINER:PATH HOSTPATH
其中的CONTAINER是容器,將文件/文件夾從PATH拷貝到HOSTPATH
•start和stop容器:
- docker start 4386fb97867d
- docker stop 4386fb97867d
其中的4386fb97867d是你的容器編號(hào)
•export(將文件系統(tǒng)的內(nèi)容作為tar存檔文件導(dǎo)出到STDOUT)
- docker export 4386fb97867d > latest.tar
•import(創(chuàng)建一個(gè)空的文件系統(tǒng)映像,將打包文件[.tar、.tar.gz、.tgz、.bzip、.tar.xz或.txz]的內(nèi)容導(dǎo)入到里面,然后以可選方式標(biāo)記它。)
- docker import http://example.com/exampleimage.tgz
從本地文件導(dǎo)入:
通過(guò)pipe和stdin導(dǎo)入到docker。
- cat exampleimage.tgz | sudo docker import - exampleimagelocal:new
從本地目錄導(dǎo)入:
- sudo tar -c . | sudo docker import - exampleimagedir
•history(顯示映像的歷史記錄)
- docker history [OPTIONS] IMAGE
- sudo docker history ea7d6801c538
•images(它會(huì)顯示映像)
- docker images [OPTIONS] [NAME]
它后面跟一些選項(xiàng),如下所示:
-a, --all=false 顯示所有映像(默認(rèn)情況下,過(guò)濾掉中間映像層)
-f, --filter=[]: 提供過(guò)濾器值(即“dangling=true”)
--no-trunc=false 不截短輸出
-q, --quiet=false 只顯示數(shù)字編號(hào)
•info(顯示整個(gè)系統(tǒng)的信息)
- srijan@VE130214:~$ sudo docker info
- srijan@vboxtest:~$ sudo docker info
- Containers: 20
- Images: 65
- Storage Driver: aufs
- Root Dir: /var/lib/docker/aufs
- Dirs: 105
- Execution Driver: native-0.2
- Kernel Version: 3.13.0-30-generic
- WARNING: No swap limit support
•inspect(返回關(guān)于容器/映像的低級(jí)信息)
- docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
•kill(終止運(yùn)行中的容器/發(fā)送SIGKILL,即指定信號(hào))
- docker kill [OPTIONS] CONTAINER [CONTAINER...]
•login(注冊(cè)或登錄docker注冊(cè)中心服務(wù)器,如果未指定任何服務(wù)器,https://index.docker.io/v1/為默認(rèn)值。)
- docker login localhost:8080
它會(huì)登錄到自托管注冊(cè)中心。
•logs(讀取容器的日志)
- docker logs CONTAINER
•ps(列出容器)
- docker ps [OPTIONS]
它有下列選項(xiàng):
-a, --all=false 顯示所有容器。默認(rèn)情況下只顯示運(yùn)行中的容器。
--before="" 只顯示編號(hào)或名稱(chēng)之前創(chuàng)建的容器,包括非運(yùn)行中的容器。
-l, --latest=false 只顯示最近創(chuàng)建的容器,包括非運(yùn)行中的容器。
-n=-1 顯示n個(gè)最近創(chuàng)建的容器,包括非運(yùn)行中的容器。
--no-trunc=false 不截短輸出。
-q, --quiet=false 只顯示數(shù)字編號(hào)。
-s, --size=false 顯示大小。
--since="" 只顯示自編號(hào)或名稱(chēng)以來(lái)創(chuàng)建的容器,包括非運(yùn)行中的容器。
#p#
•push(將映像或軟件庫(kù)推送到注冊(cè)中心)
- docker push NAME[:TAG]
•restart(它將重啟運(yùn)行中的容器)
- docker restart [OPTIONS] CONTAINER [CONTAINER...]
•rm(它將刪除一個(gè)或多個(gè)容器)
- docker rm [OPTIONS] CONTAINER [CONTAINER...]
•rmi(它將刪除一個(gè)或多個(gè)映像)
- docker rmi IMAGE [IMAGE...]
•run(在新容器中運(yùn)行命令)
- docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
它有下列選項(xiàng):
-a, --attach=[] 連接到stdin、stdout或stderr
-c, --cpu-shares=0 處理器共享(相對(duì)權(quán)重)
--cidfile="" 將容器編號(hào)寫(xiě)入到文件
-d, --detach=false 分離模式:在后臺(tái)運(yùn)行容器,輸出新的容器編號(hào)
--dns=[] 設(shè)置自定義DNS服務(wù)器
--dns-search=[] 設(shè)置自定義DNS搜索域
-e, --env=[] 設(shè)置環(huán)境變量
--entrypoint="" 覆蓋映像的默認(rèn)入口點(diǎn)
--env-file=[] 在行分隔的文件中讀取ENV變量
--expose=[] 暴露來(lái)自容器的端口,又不將端口發(fā)布到你的主機(jī)
-h, --hostname="" 容器主機(jī)名稱(chēng)
-i, --interactive=false 讓stdin保持開(kāi)放,即便沒(méi)有連接
--link=[] 將鏈接添加到另一個(gè)容器(名稱(chēng):別名)
--lxc-conf=[] (lxc exec-driver only)添加自定義lxc選項(xiàng)--lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
-m, --memory="" 內(nèi)存限制(格式:<number><optional unit>,其中unit = b, k, m or g)
--name="" 為容器賦予名稱(chēng)
--net="bridge" 為容器設(shè)置網(wǎng)絡(luò)模式
'bridge':為docker網(wǎng)橋上的容器創(chuàng)建新的網(wǎng)絡(luò)堆棧
'none':不為該容器創(chuàng)建任何網(wǎng)絡(luò)機(jī)制
'container:<name|id>':重復(fù)使用另一個(gè)容器的網(wǎng)絡(luò)堆棧
'host':使用容器里面的主機(jī)網(wǎng)絡(luò)堆棧
-p, --publish=[] 將容器的端口發(fā)布到主機(jī)
格式:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
(使用“docker port”即可看到實(shí)際映射)
-P, --publish-all=false 將所有暴露的端口發(fā)布到主機(jī)接口
--privileged=false 為該容器賦予擴(kuò)展后的權(quán)限
--rm=false 容器退出后,自動(dòng)刪除容器(與-d不兼容)
--sig-proxy=true 將所有收到的信號(hào)代理輸出到進(jìn)程(即便處于非-tty模式下)
-t, --tty=false 分配偽終端
-u, --user="" 用戶名稱(chēng)或UID
-v, --volume=[] 綁定掛載卷(比如來(lái)自host:-v /host:/container,來(lái)自docker: -v /container)
--volumes-from=[] 從指定的一個(gè)或多個(gè)容器掛載卷
-w, --workdir="" 容器里面的工作目錄
•save(將映像保存到tar存檔文件,默認(rèn)情況下流式傳輸?shù)絪tdout)
- docker save IMAGE
•search(搜索docker索引,尋找映像)
- docker search TERM
•tag(將映像標(biāo)記到軟件庫(kù))
- docker tag [OPTIONS] IMAGE [REGISTRYHOST/][USERNAME/]NAME[:TAG]
•top(查詢?nèi)萜鞯倪\(yùn)行中進(jìn)程)
- docker top CONTAINER [ps OPTIONS]
•version(顯示docker版本信息)
- srijan@vboxtest:~$ sudo docker version
- [sudo] password for srijan:
- Client version: 1.0.1
- Client API version: 1.12
- Go version (client): go1.2.1
- Git commit (client): 990021a
- Server version: 1.0.1
- Server API version: 1.12
- Go version (server): go1.2.1
- Git commit (server): 990021a
6 結(jié)束語(yǔ)
我試著讓大家更加熟悉docker,但愿本文會(huì)幫助各位進(jìn)一步了解docker,并在自己的測(cè)試/生產(chǎn)環(huán)境中充分利用docker。
想了解更多信息,請(qǐng)參閱http://www.docker.com/。
http://www.howtoforge.com/manage-linux-containers-with-docker-on-ubuntu