0x01 核心概念
Docker鏡像類似于虛擬機(jī)鏡像,可以理解為一個(gè)面向Docker引擎的只讀模板辱士,包含了文件系統(tǒng)泪掀。鏡像是創(chuàng)建Docker容器的基礎(chǔ)。
Docker容器類似于一個(gè)輕量級(jí)的沙箱颂碘,Docker利用容器來(lái)運(yùn)行和隔離應(yīng)用异赫。容器是從鏡像創(chuàng)建的應(yīng)用運(yùn)行實(shí)例,可以將其啟動(dòng)头岔、停止塔拳、刪除,而這些容器都是相互隔離峡竣、互不可見的靠抑。
鏡像自身是只讀的。容器從鏡像啟動(dòng)的時(shí)候适掰,Docker會(huì)在鏡像的最上層創(chuàng)建一個(gè)可寫層颂碧,鏡像本身將保持不變荠列。
Docker倉(cāng)庫(kù)類似于代碼倉(cāng)庫(kù),是Docker集中存放鏡像文件的場(chǎng)所稚伍。Docker倉(cāng)庫(kù)分為公開倉(cāng)庫(kù)和私有倉(cāng)庫(kù)弯予。
注冊(cè)服務(wù)器(Registry)是存放倉(cāng)庫(kù)的地方,其上往往存放著多個(gè)倉(cāng)庫(kù)个曙。每個(gè)倉(cāng)庫(kù)集中存放某一類鏡像锈嫩,往往包括多個(gè)鏡像文件,通過(guò)不同的標(biāo)簽(tag)來(lái)進(jìn)行區(qū)分垦搬。
0x02 Docker安裝
1呼寸、Ubuntu
Ubuntu 14.04 版本官方軟件源中已經(jīng)自帶了Docker包,較低版本需要先進(jìn)行內(nèi)核更新并重啟系統(tǒng):
$ sudo apt-get update
$ sudo apt-get install -y linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot
安裝Docker
$ sudo apt-get update
$ sudo apt-get install -y docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
系統(tǒng)默認(rèn)的Docker安裝包相對(duì)較舊猴贰,可通過(guò)以下方式從Docker官方源安裝最新版本对雪。
$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get -y lxc-docker
2、CentOS
2.1米绕、CentOS 6
$ sudo yum install -y http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install -y docker-io
2.2瑟捣、CentOS 7
$ sudo yum install -y docker
更新方式:自行通過(guò)源碼編譯安裝;下載二進(jìn)制文件更新栅干。
3迈套、Windows
Docker通過(guò)虛擬機(jī)方式支持Windows 7和8,前提是主機(jī)的CPU支持硬件虛擬化碱鳞。
從https://docs.docker.com/installation/windows/下載最新官方Docker for Windows Installer桑李。
運(yùn)行Installer,該過(guò)程將安裝VirtualBox窿给,MSYS-git贵白,boot2docker Linux ISO鏡像,以及Boot2Docker管理工具崩泡。
打開桌面的Boot2Docker Start程序禁荒,或者用以下命令:
Program Files > Boot2Docker for Windows
。此初始化腳本在第一次運(yùn)行時(shí)需要輸入一個(gè)SSH Key Passphrase(用于SSH密鑰生成的口令)角撞,也可直接跳過(guò)圈浇。此時(shí)Boot2Docker Start程序?qū)⑦B接至虛擬機(jī)中的Shell會(huì)話,Docker已經(jīng)運(yùn)行起來(lái)了靴寂。
4、Mac OS
Docker支持Mac OS 10.6 Snow Leopard及以上版本的Mac OS召耘,同樣需要Boot2Docker工具的支持百炬。
從https://docs.docker.com/installation/mac/下載最新官方Docker for OS X Installer。
運(yùn)行安裝包污它,該過(guò)程將安裝一個(gè)VirtualBox虛擬機(jī)剖踊,Docker本身以及Boot2Docker管理工具庶弃。
安裝成功,找到Boot2Docker并運(yùn)行它德澈,現(xiàn)在進(jìn)行Boot2Docker的初始化:
$ boot2docker init
$ boot2docker start
$ $(boot2docker shellinit)
看到虛擬機(jī)在命令行窗口中啟動(dòng)運(yùn)行歇攻,并顯示Docker的啟動(dòng)信息,則說(shuō)明Docker安裝成功梆造。當(dāng)虛擬機(jī)初始化完畢后缴守,可以使用
boot2docker stop
和boot2docker start
來(lái)控制它。注意:如果在命令行中看到如下提示信息:
To connect the Docker client to the Docker daemon, please set: export DOCKER_HOST=tcp://192.168.59.103:2375
可以執(zhí)行提示信息中的語(yǔ)句:export DOCKER_HOST=tcp://192.168.59.103:2375
在系統(tǒng)環(huán)境變量中設(shè)置Docker的主機(jī)地址镇辉。
0x03 docker基本操作
1屡穗、鏡像
1.1、獲取鏡像
命令docker pull NAME[:TAG]
獲取鏡像忽肛。如不顯式的指定TAG村砂,則默認(rèn)選擇latest標(biāo)簽。
[root@localhost test]# docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
bae382666908: Pull complete
29ede3c02ff2: Pull complete
da4e69f33106: Pull complete
8d43e5f5d27f: Pull complete
b0de1abb17d6: Pull complete
Digest: sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc
Status: Downloaded newer image for ubuntu:14.04
1.2屹逛、查看鏡像信息
命令docker images
列出本地主機(jī)上已有的鏡像础废。
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 747cb2d60bbe 2 weeks ago 122MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
命令docker inspect IMAGE_ID
可以獲取該鏡像的詳細(xì)信息。
[root@localhost test]# docker inspect dea1945146b9
[
{
"Id": "sha256:dea1945146b96542e6e20642830c78df702d524a113605a906397db1db022703",
"RepoTags": [
"ubuntu:14.04"
],
"RepoDigests": [
"ubuntu@sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc"
],
"Parent": "",
"Comment": "",
"Created": "2017-09-13T23:26:23.127186526Z",
"Container": "53c2a8c09f3e5b092cb05b323a382b2935476bc84353b102922c5c14b2bd3305",
"ContainerConfig": {
"Hostname": "53c2a8c09f3e",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"ArgsEscaped": true,
"Image": "sha256:2013c3d8a4f2376ef9d2922271c8bc6a913cb3109a34966dbaefe5057a9da766",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "17.06.2-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"ArgsEscaped": true,
"Image": "sha256:2013c3d8a4f2376ef9d2922271c8bc6a913cb3109a34966dbaefe5057a9da766",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 187971405,
"VirtualSize": 187971405,
"GraphDriver": {
"Data": {
"RootDir": "/var/lib/docker/overlay/9da37272f7684597b528479a3f91389673cd37351fd5ce8f51668d3df02af8b1/root"
},
"Name": "overlay"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:c47d9b229ca4eaf5d3b85b6fa7f794d00910a42634dd0fd5107a9a937b13b20f",
"sha256:bf59e7acf5c4eefb6b27e7973a8afa6214f7a6da99c20a94195665ab52d442b2",
"sha256:48daf661d621ef19b6df743b9fcfcb50044ba34d0b8b5161f4061dba49902e9b",
"sha256:4e1e6ac5b9d6cde7dabfdaa6a0e8f5a8986c4f8bb63689085fdfaca0ccae698d",
"sha256:7fb9ba64f896b3a7001af9604a44243cfa663c84e414cd298ee8bc754feb5aa1"
]
}
}
]
命令docker tag REPOSITORY:TAG
可為本地鏡像添加新的標(biāo)簽罕模。
[root@localhost test]# docker tag ubuntu:latest latest_ubuntu:latest
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 747cb2d60bbe 2 weeks ago 122MB
latest_ubuntu latest 747cb2d60bbe 2 weeks ago 122MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
1.3评腺、搜索鏡像
docker search
命令搜索遠(yuǎn)端倉(cāng)庫(kù)中的共享鏡像。
參數(shù):
--automated=false 僅顯示自動(dòng)創(chuàng)建的鏡像
--no-trunc=false 輸出信息不截?cái)囡@示
-s手销,--starts=0 指定僅顯示評(píng)價(jià)為指定星級(jí)以上的鏡像
下面以搜索mysql為例:
[root@localhost test]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati... 5160 [OK]
mariadb MariaDB is a community-developed fork of M... 1598 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Crea... 360 [OK]
percona Percona Server is a fork of the MySQL rela... 298 [OK]
hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 72
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 62 [OK]
centurylink/mysql Image containing mysql. Optimized to be li... 53 [OK]
sameersbn/mysql 48 [OK]
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server ... 36 [OK]
tutum/mysql Base docker image to run a MySQL database ... 27
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic back... 16 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 16 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 13
linuxserver/mysql A Mysql container, brought to you by Linux... 12
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 ima... 6
centos/mysql-56-centos7 MySQL 5.6 SQL database server 6
frodenas/mysql A Docker Image for MySQL 3 [OK]
dsteinkopf/backup-all-mysql backup all DBs in a mysql server 3 [OK]
circleci/mysql MySQL is a widely used, open-source relati... 2
cloudfoundry/cf-mysql-ci Image used in CI of cf-mysql-release 0
astronomerio/mysql-sink MySQL sink 0 [OK]
cloudposse/mysql Improved `mysql` service with support for ... 0 [OK]
ansibleplaybookbundle/rhscl-mysql-apb An APB which deploys RHSCL MySQL 0 [OK]
astronomerio/mysql-source MySQL source 0 [OK]
jenkler/mysql Docker Mysql package 0
1.4歇僧、刪除鏡像
命令docker rmi IMAGE[IMAGE...]
IMAGE可以為標(biāo)簽或ID。使用鏡像ID來(lái)刪除時(shí)锋拖,會(huì)先嘗試刪除所有指向該鏡像的標(biāo)簽诈悍,然后刪除該鏡像文件本身。
注意:當(dāng)有該鏡像創(chuàng)建的容器存在時(shí)兽埃,鏡像文件默認(rèn)是無(wú)法被刪除的侥钳。
docker ps -a
命令可以看到本機(jī)上存在的所有容器。
強(qiáng)制刪除鏡像用docker rmi -f IMAGE
命令柄错。使用-f
參數(shù)來(lái)強(qiáng)制刪除一個(gè)存在容器依賴的鏡像會(huì)造成一些遺留問題舷夺。正確做法是先刪除依賴鏡像的所有容器,再來(lái)刪除鏡像售貌。刪除容器用docker rm CONTAINER_ID
命令给猾。
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a40fcdb8f675 ubuntu:latest "/bin/bash" 5 minutes ago Exited (127) About a minute ago agitated_lalande
[root@localhost test]# docker rm a40fcdb8f675
a40fcdb8f675
[root@localhost test]# docker rmi 747cb2d60bbe
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:506e2d5852de1d7c90d538c5332bd3cc33b9cbd26f6ca653875899c505c82687
Deleted: sha256:747cb2d60bbecbda48aff14a8be5c8b913ca69318a6067e57c697f8a78dda06e
Deleted: sha256:ec1fd849ff0a8f0aa2fd1acc29ad5dabbc79b89f63b74a4f54e31a7b0a100aa1
Deleted: sha256:e3f6dffa20cf36460d23bfb22e17be6e5339891f8537f32db79887caf832048b
Deleted: sha256:c213ffdc9f7032702de5a8e9045fcce2353b7221ef6bf4509e02005cfc858f58
Deleted: sha256:3fddf55a451aa43707518f2d8788c12ee5eb1f1e3075433f5bcf4d445d5c275d
Deleted: sha256:0f5ff0cf6a1c53f94b15f03536c490040f233bc455f1232f54cc8eb344a3a368
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
1.5、創(chuàng)建鏡像
基于已有鏡像的容器創(chuàng)建使用命令docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]
命令颂跨。
參數(shù):
-a敢伸,--author="" 作者信息
-m,--message"" 提交信息
-p恒削,--pause=true 提交時(shí)暫停容器運(yùn)行
舉例如下:
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
[root@localhost test]# docker run -ti ubuntu:14.04 /bin/bash
root@098ab9bc25f8:/# touch test
root@098ab9bc25f8:/# exit
exit
[root@localhost test]# docker commit -m "Added a new file" -a "Docker Test" 098ab9bc25f8 test
sha256:68ceff3107a82641378dee544caeed48e6d544b4d74b525051381b7db7479d35
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest 68ceff3107a8 16 seconds ago 188MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
基于本地模板導(dǎo)入使用cat 鏡像壓縮包 | docker import -REPOSITORY:TAG
命令池颈。
[root@localhost test]# ls
ubuntu-14.04-x86_64-minimal.tar.gz
[root@localhost test]# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04-server
sha256:ae63a9e87332075323de0e2cb3e12dd6ea8c6078e006dd937dc0d670c4a8773d
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04-server ae63a9e87332 12 seconds ago 215MB
test latest 68ceff3107a8 About an hour ago 188MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
1.6尾序、存出鏡像
命令docker save -o 壓縮包保存名 REPOSITORY:TAG
可存出鏡像。
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04-server ae63a9e87332 12 seconds ago 215MB
test latest 68ceff3107a8 About an hour ago 188MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
[root@localhost test]# docker save -o ubuntu_server.tar ubuntu:14.04
[root@localhost test]# ls
ubuntu_server.tar
1.7躯砰、載入鏡像
命令docker load --input 壓縮包保存名
或者docker load < 壓縮包保存名
可從導(dǎo)出的文件中重新載入鏡像每币。
[root@localhost test]# ls
ubuntu_server.tar
[root@localhost test]# docker load --input ubuntu_server.tar
Loaded image: ubuntu:14.04
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04-server ae63a9e87332 4 minutes ago 215MB
test latest 68ceff3107a8 About an hour ago 188MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
1.8、上傳鏡像
可以使用docker push NAME[:TAG]
上傳鏡像到倉(cāng)庫(kù)琢歇,默認(rèn)上傳到DockerHub官方倉(cāng)庫(kù)兰怠。第一次使用必須要先登錄。
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04-server ae63a9e87332 4 minutes ago 215MB
test latest 68ceff3107a8 About an hour ago 188MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
[root@localhost test]# docker tag test:latest username/test:latest
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04-server ae63a9e87332 7 minutes ago 215MB
username/test latest 68ceff3107a8 About an hour ago 188MB
test latest 68ceff3107a8 About an hour ago 188MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
[root@localhost test]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: username
Password:
Login Succeeded
[root@localhost test]# docker push username/test:latest
The push refers to a repository [docker.io/username/test]
786a798121af: Pushed
7fb9ba64f896: Pushed
4e1e6ac5b9d6: Pushed
48daf661d621: Pushed
bf59e7acf5c4: Pushed
c47d9b229ca4: Pushed
latest: digest: sha256:c46955d49b5b7cf15528b94d5c4fb7028b61c52cf00ee4d14073a92379e2237f size: 1566
2矿微、容器
2.1痕慢、創(chuàng)建容器
可以使用docker create
命令來(lái)新建一個(gè)容器,新建的容器處于停止?fàn)顟B(tài)涌矢,可以使用docker start CONTAINER_ID
命令來(lái)啟動(dòng)它掖举。
[root@localhost test]# docker create -it ubuntu:14.04
1fea7f4a60ec1f33298b69dbbe736c6a3509a3a39756d93c20914f451e857356
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fea7f4a60ec ubuntu:14.04 "/bin/bash" 17 seconds ago Created eager_blackwell
[root@localhost test]# docker start 1fea7f4a60ec
1fea7f4a60ec
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fea7f4a60ec ubuntu:14.04 "/bin/bash" 2 minutes ago Up 16 seconds eager_blackwell
2.2、啟動(dòng)容器
啟動(dòng)容器有兩種方式:基于鏡像新建一個(gè)容器并啟動(dòng)娜庇;將在終止?fàn)顟B(tài)的容器重新啟動(dòng)塔次。所需的命令主要為docker run
,等價(jià)于先執(zhí)行docker create
名秀,再執(zhí)行docker start
励负。
啟動(dòng)一個(gè)bash終端,允許用戶進(jìn)行交互匕得,-t
參數(shù)讓Docker分配一個(gè)偽終端并綁定到容器的標(biāo)準(zhǔn)輸入上继榆,-i
參數(shù)則讓容器的標(biāo)準(zhǔn)輸入保持打開,-d
參數(shù)會(huì)讓Docker容器在后臺(tái)以守護(hù)形式運(yùn)行汁掠,獲取容器輸出信息略吨,可通過(guò)docker logs
命令。
[root@localhost test]# docker run -t -i ubuntu:14.04 /bin/bash
root@eac23878c8bf:/# pwd
/
root@eac23878c8bf:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@eac23878c8bf:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
15 pts/0 00:00:00 ps
root@eac23878c8bf:/# exit
exit
[root@localhost test]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello word; sleep 1; done"
2105fbb444b3b028a1b26ec5879d8d282ccc2fa7d0a9776a8a86e808d3414843
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2105fbb444b3 ubuntu:14.04 "/bin/sh -c 'while..." 11 seconds ago Up 10 seconds confident_payne
eac23878c8bf ubuntu:14.04 "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago adoring_shockley
[root@localhost test]# docker logs 2105fbb444b3
hello word
hello word
hello word
hello word
...
[root@localhost test]# docker stop 2105
2.3考阱、終止容器
可以用docker stop [-t|--time [=10]]
來(lái)終止一個(gè)運(yùn)行中的容器翠忠。
docker ps -a -q
查看處于終止?fàn)顟B(tài)的容器的ID信息。
docker start
啟動(dòng)一個(gè)處于終止?fàn)顟B(tài)的容器乞榨。
docker restart
將一個(gè)運(yùn)行態(tài)的容器終止然后再重新啟動(dòng)它秽之。
[root@localhost test]# docker stop 2105
2105
[root@localhost test]# docker ps -a -q
2105fbb444b3
eac23878c8bf
[root@localhost test]# docker start 2105
2105
[root@localhost test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2105fbb444b3 ubuntu:14.04 "/bin/sh -c 'while..." 2 minutes ago Up 9 seconds confident_payne
[root@localhost test]# docker restart 2105
2105
[root@localhost test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2105fbb444b3 ubuntu:14.04 "/bin/sh -c 'while..." 3 minutes ago Up 11 seconds confident_payne
2.4、進(jìn)入容器
使用-d
參數(shù)時(shí)容器會(huì)進(jìn)入后臺(tái)吃既,用戶無(wú)法看到容器中的信息考榨。進(jìn)入容器主要有以下三種方式。
docker attach
當(dāng)多個(gè)窗口同時(shí)attach到同一個(gè)容器時(shí)鹦倚,所有窗口都會(huì)同步顯示董虱。當(dāng)某個(gè)窗口因命令阻塞時(shí),其他窗口也無(wú)法執(zhí)行操作。
docker exec
官方推薦使用愤诱。
nsenter工具,比較繁瑣捐友,暫時(shí)不做過(guò)多概述淫半。
[root@localhost test]# docker run -tid ubuntu:14.04
0b59f3ef98d47454a314b02d598e8f425855266feb58141178b541fcbdcfc76d
[root@localhost test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b59f3ef98d4 ubuntu:14.04 "/bin/bash" 8 seconds ago Up 8 seconds elegant_ride
[root@localhost test]# docker attach elegant_ride
root@0b59f3ef98d4:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@0b59f3ef98d4:/# exit
exit
[root@localhost test]# docker run -tid ubuntu:14.04
a0bb97c292d1fe5d5e507a865c1925251c972dcee30fa65193c06e7ad2aabf0d
[root@localhost test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0bb97c292d1 ubuntu:14.04 "/bin/bash" 6 seconds ago Up 6 seconds brave_austin
[root@localhost test]# docker exec -ti a0bb97c292d1 /bin/bash
root@a0bb97c292d1:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@a0bb97c292d1:/# exit
exit
2.5、刪除容器
可以使用docker rm [OPTIONS] CONTAINER [CONTAINER...]
命令刪除處于終止?fàn)顟B(tài)的容器匣砖。
參數(shù):
-f科吭,--force=false 強(qiáng)行終止并刪除一個(gè)運(yùn)行中的容器
-l,--link=false 刪除容器的連接猴鲫,但保留容器
-v对人,--volumes=false 刪除容器掛載的數(shù)據(jù)卷
舉例如下:
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0bb97c292d1 ubuntu:14.04 "/bin/bash" 8 minutes ago Up 8 minutes brave_austin
0b59f3ef98d4 ubuntu:14.04 "/bin/bash" 14 minutes ago Exited (0) 8 minutes ago elegant_ride
[root@localhost test]# docker rm 0b59f3ef98d4
0b59f3ef98d4
[root@localhost test]# docker rm -f a0bb97c292d1
a0bb97c292d1
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2.6、導(dǎo)入導(dǎo)出容器
導(dǎo)出容器是指導(dǎo)出一個(gè)已經(jīng)創(chuàng)建好的容器到一個(gè)文件拂共,不管此時(shí)這個(gè)容器是否處于運(yùn)行狀態(tài)牺弄,可以使用docker export CONTAINER
命令。
[root@localhost test]# docker run -tid ubuntu:14.04
547e74d47ec3eb30736aee22c1b7bf2acd6e71470a1ade4561007a10b3b14a36
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
547e74d47ec3 ubuntu:14.04 "/bin/bash" 6 seconds ago Up 5 seconds unruffled_jennings
[root@localhost test]# docker export 547 > test.tar
[root@localhost test]# ls
test.tar
導(dǎo)出的文件又可以使用docker import
命令導(dǎo)入宜狐,成為鏡像势告。
[root@localhost test]# ls
test.tar
[root@localhost test]# cat test.tar | docker import - test/ubuntu:v1.0
sha256:1ab7c63a882a9bc13ff4673081a237ba8785d47ba69458bfe976c0e5fc7b9c99
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1.0 1ab7c63a882a 22 seconds ago 175MB
ubuntu 14.04-server ae63a9e87332 2 hours ago 215MB
securityweekly/test latest 68ceff3107a8 3 hours ago 188MB
ubuntu 14.04 dea1945146b9 6 weeks ago 188MB
3、倉(cāng)庫(kù)
倉(cāng)庫(kù)分為公共倉(cāng)庫(kù)和私有倉(cāng)庫(kù)抚恒。
3.1咱台、公共倉(cāng)庫(kù)
官方的公共倉(cāng)庫(kù)為https://hub.docker.com,大部分需求都可以通過(guò)再Docker Hub中直接下載鏡像來(lái)實(shí)現(xiàn)俭驮』啬纾可以通過(guò)docker login
命令輸入用戶名、密碼混萝、郵箱來(lái)完成注冊(cè)和登錄遗遵,認(rèn)證信息保存在本地用戶目錄的.dockercfg中。其他操作與前面提到的相同譬圣。
3.2瓮恭、自動(dòng)創(chuàng)建
自動(dòng)創(chuàng)建(Automated Builds)功能對(duì)于需要經(jīng)常升級(jí)景象內(nèi)程序來(lái)說(shuō)十分方便,用戶通過(guò)Docker Hub指定跟蹤一個(gè)目標(biāo)網(wǎng)站(目前支持GitHub或BitBucket)上的項(xiàng)目厘熟,一旦項(xiàng)目發(fā)現(xiàn)新的提交屯蹦,則自動(dòng)執(zhí)行創(chuàng)建。
配置自動(dòng)創(chuàng)建的步驟:
1绳姨、創(chuàng)建并登錄Docker Hub以及目標(biāo)站點(diǎn)登澜,在目標(biāo)站點(diǎn)中連接賬戶到Docker Hub;
2飘庄、在Docker Hub中配置一個(gè)自動(dòng)創(chuàng)建脑蠕;
3、選取一個(gè)目標(biāo)網(wǎng)站中的項(xiàng)目(需要含Dockerfile)和分支;
4谴仙、指定Dockerfile的位置迂求,并提交創(chuàng)建;
5晃跺、之后可以在Docker Hub的“自動(dòng)創(chuàng)建”頁(yè)面中跟蹤每次創(chuàng)建的狀態(tài)揩局。
3.3、私有倉(cāng)庫(kù)
安裝Docker后可通過(guò)官方提供的registry鏡像來(lái)簡(jiǎn)單搭建一套本地私有倉(cāng)庫(kù)環(huán)境掀虎。
啟動(dòng)下載一個(gè)registry容器凌盯,創(chuàng)建本地的私有倉(cāng)庫(kù)服務(wù)。默認(rèn)情況下會(huì)將倉(cāng)庫(kù)創(chuàng)建在容器的/tmp/registry
目錄下烹玉,可通過(guò)-v
參數(shù)來(lái)將鏡像文件存放在本地的指定路徑上驰怎。此時(shí),在本地將啟動(dòng)一個(gè)私有倉(cāng)庫(kù)服務(wù)二打,監(jiān)聽端口為5000
县忌。
[root@localhost test]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
49388a8c9c86: Pull complete
638c4c5f80c0: Pull complete
da6c9df08ef4: Pull complete
ee7e568878e6: Pull complete
386d4eddd833: Pull complete
Digest: sha256:0694e05b6d0b5fed892ddc60358758bd8341c9a6497ac185f93fc4c93c689810
Status: Downloaded newer image for registry:latest
801a921f0e219b6a8535259c06525a6c441ac0528fc977f27504e7519210b88b
[root@localhost test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
801a921f0e21 registry "/entrypoint.sh /e..." About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp fervent_edison
私有倉(cāng)庫(kù)的管理、使用與公共倉(cāng)庫(kù)類似址儒。
4芹枷、數(shù)據(jù)管理
容器中管理數(shù)據(jù)主要有兩種方式:數(shù)據(jù)卷(Data Volumes)和數(shù)據(jù)卷容器(Data Volumes Containers)。
4.1莲趣、數(shù)據(jù)卷
數(shù)據(jù)卷是一個(gè)可供容器使用的特殊目錄鸳慈,它繞過(guò)文件系統(tǒng),可提供很多有用的特性喧伞。
數(shù)據(jù)卷特性:
可在榮期間共享和重用走芋;
對(duì)數(shù)據(jù)卷的修改會(huì)立即生效;
對(duì)數(shù)據(jù)卷更新不會(huì)影響鏡像潘鲫;
卷會(huì)一直存在直到?jīng)]有容器使用翁逞。
在用docker run
命令時(shí),使用-v
標(biāo)記可以在容器內(nèi)創(chuàng)建一個(gè)數(shù)據(jù)卷溉仑,多次使用-v
標(biāo)記可以創(chuàng)建多個(gè)數(shù)據(jù)卷挖函。
[root@localhost test]# docker run -d -p 5000:5000 --name web -v /webapp training/webapp python app.py
932e1f1d871d8292bdc54d2b2007a776fb5286631f79577997604e870a40d441
-v
標(biāo)記也可以指定掛載一個(gè)本地的已有目錄到容器中去作為數(shù)據(jù)卷。Docker掛載數(shù)據(jù)卷的默認(rèn)權(quán)限試讀寫(rw)浊竟,可通過(guò)ro
指定為只讀怨喘。
[root@localhost test]# docker run -d -p 5000:5000 --name web -v /src/webapp:/opt/webapp:ro /training/webapp python app.py
7e68a0a373a3907aae114114b0c7e479e7c793d3bdec1ed1773ed1f0dfa1db16
-v
標(biāo)記也可以從主機(jī)掛載單個(gè)文件到容器中作為數(shù)據(jù)卷。
注意:如果直接掛載一個(gè)文件到容器振定,使用文件編輯工具時(shí)必怜,可能會(huì)造成文件inode的改變,從Docker 1.1.0起后频,這會(huì)導(dǎo)致報(bào)錯(cuò)誤信息梳庆,所以推薦的方式是直接掛載文件所在的目錄暖途。
[root@localhost test]# docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu:14.04 /bin/bash
root@43d2659bf299:/#
上述命令可以記錄在容器中輸入過(guò)的命令歷史了。
4.2膏执、數(shù)據(jù)卷容器
如果需要在容器間共享一些持續(xù)更新的數(shù)據(jù)驻售,最簡(jiǎn)單的方式是使用數(shù)據(jù)卷容器。數(shù)據(jù)據(jù)容器其實(shí)就是一個(gè)普通的容器胧后,專門用它提供數(shù)據(jù)卷供其它容器掛在使用芋浮。
創(chuàng)建一個(gè)數(shù)據(jù)卷容器dadata
并在其中創(chuàng)建一個(gè)數(shù)據(jù)卷掛載到/dbdata
。
[root@localhost ~]# docker run -it -v /dbdata --name dbdata ubuntu:14.04
root@417a47e1a78d:/# ls
bin dbdata etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
然后可在其他容器中使用--volumes-from
來(lái)掛載dbdata
容器中的數(shù)據(jù)卷壳快。
[root@localhost ~]# docker run -it --volumes-from dbdata --name db1 ubuntu:14.04
root@7704b2f5a909:/# exit
exit
[root@localhost ~]# docker run -it --volumes-from dbdata --name db2 ubuntu:14.04
root@e675ebdac602:/# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e675ebdac602 ubuntu:14.04 "/bin/bash" 10 seconds ago Exited (0) 6 seconds ago db2
7704b2f5a909 ubuntu:14.04 "/bin/bash" 23 seconds ago Exited (0) 15 seconds ago db1
417a47e1a78d ubuntu:14.04 "/bin/bash" 18 minutes ago Exited (0) About a minute ago dbdata
多個(gè)容器可掛載同一個(gè)數(shù)據(jù)卷到相同的/dbdata
目錄,容器任何一方在該目錄下的寫入镇草,其他容器都可以看到眶痰。
root@417a47e1a78d:/# cd /dbdata
root@417a47e1a78d:/dbdata# touch test
root@417a47e1a78d:/dbdata# ls
test
[root@localhost ~]# docker run -it --volumes-from dbdata --name db2 ubuntu:14.04
root@e675ebdac602:/# ls
bin dbdata etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
[root@localhost ~]# ls dbdata/
test
可以多次使用--volumes-from
參數(shù)來(lái)從多個(gè)容器掛載多個(gè)數(shù)據(jù)卷,還可以從其他已經(jīng)掛載了容器卷的容器來(lái)掛載數(shù)據(jù)卷梯啤。使用--volumes-from
參數(shù)所掛載數(shù)據(jù)卷的容器自身并不需要保持在運(yùn)行狀態(tài)竖伯。
[root@localhost ~]# docker run -d --name db3 --volumes-from db1 ubuntu:14.04
78b753e6d1a374a347160cfece7464901bed3d06b6ba8444b6bf793cd497fa80
如果刪除了掛載的容器(包括dbdata、db1和db2)因宇,數(shù)據(jù)卷并不會(huì)被自動(dòng)刪除七婴。如果要?jiǎng)h除一個(gè)數(shù)據(jù)卷,必須在刪除最后一個(gè)還掛載著它的容器時(shí)顯式使用docker rm -v
命令來(lái)指定同時(shí)刪除關(guān)聯(lián)的容器察滑。
使用數(shù)據(jù)卷容器可以讓用戶在容器之間自由的升級(jí)和移動(dòng)數(shù)據(jù)卷打厘,也可以利用數(shù)據(jù)卷容器對(duì)其中的數(shù)據(jù)卷進(jìn)行備份、恢復(fù)贺辰,以實(shí)現(xiàn)數(shù)據(jù)的遷移户盯。
備份數(shù)據(jù)卷容器中的數(shù)據(jù)卷
[root@localhost ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu:14.04 tar cvf /backup/backup.tar /dbdata
[root@localhost ~]# ls
backup.tar
命令有點(diǎn)復(fù)雜,詳細(xì)的命令分析如下:
首先利用ubuntu鏡像創(chuàng)建了一個(gè)容器worker饲化;
使用--volumes-from dbdata參數(shù)來(lái)讓worker容器掛載dbdata容器的數(shù)據(jù)卷(即dbdata數(shù)據(jù)卷)莽鸭;
使用-v $(pwd):/backup參數(shù)來(lái)掛載本地的當(dāng)前目錄到worker容器的/backup目錄;
worker容器啟動(dòng)后,使用tar cvf /backup/backup.tar /dbdata命令來(lái)將/dbdata下內(nèi)容備份為容器內(nèi)的/backup/backup.tar,即宿主主機(jī)當(dāng)前目錄下的backup.tar坐慰。
恢復(fù)數(shù)據(jù)到一個(gè)容器
首先創(chuàng)建一個(gè)帶有數(shù)據(jù)卷的容器dbdata2颖榜;
[root@localhost ~]# docker run -v /dbdata --name dbdata2 ubuntu:14.04 /bin/bash
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d27d09f57de ubuntu:14.04 "/bin/bash" 13 seconds ago Exited (0) 12 seconds ago dbdata2
然后創(chuàng)建另一個(gè)新的容器,掛載dbdata2的容器燎窘,并使用untar解壓備份文件到所掛載的容器即可。
[root@localhost ~]# ls
backup.tar
[root@localhost ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
03b1be98f3f9: Pull complete
Digest: sha256:3e8fa85ddfef1af9ca85a5cfb714148956984e02f00bec3f7f49d3925a91e0e7
Status: Downloaded newer image for busybox:latest
dbdata/
5、網(wǎng)絡(luò)基礎(chǔ)配置
5.1氮兵、端口映射
在啟動(dòng)容器時(shí),如果不指定對(duì)應(yīng)參數(shù)歹鱼,在容器外部是無(wú)法通過(guò)網(wǎng)絡(luò)來(lái)訪問容器內(nèi)的網(wǎng)絡(luò)應(yīng)用和服務(wù)的泣栈。
當(dāng)容器中運(yùn)行的一些網(wǎng)絡(luò)應(yīng)用要讓外部訪問時(shí),可以通過(guò)-P
或-p
參數(shù)來(lái)指定端口映射。-P
標(biāo)記會(huì)隨機(jī)映射一個(gè)49000~49900的端口至容器內(nèi)部開放的網(wǎng)絡(luò)端口南片。
[root@localhost ~]# docker run -d -P training/webapp python app.py
3fcaa6c3a4985ffb4bc2b6063550ef3e7827877c4dda7dda814d23c9fd782739
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fcaa6c3a498 training/webapp "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:32768->5000/tcp mystifying_lichterman
-p
則可以指定要映射的端口掺涛,并且在一個(gè)指定端口上只能綁定一個(gè)容器。支持的格式有:ip:hostPort:containerPort | ip:containerPort | hostPort:containerPort
使用hostPort:containerPort
格式將本地的指定端口映射到容器的指定端口疼进。默認(rèn)綁定本地所有接口上的所有地址薪缆。多次使用-p
標(biāo)簽可以綁定多個(gè)端口。
[root@localhost ~]# docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
dddb3ced729f593951bc42b4bf1fb69920bca23ff0d79557010ce89fff835c1a
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dddb3ced729f training/webapp "python app.py" 6 seconds ago Up 5 seconds 0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp quizzical_agnesi
可以使用ip:hostPort:containerPort
格式指定映射使用一個(gè)特定地址伞广。
[root@localhost ~]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
4e6d5d31d00213b8d30c45f776b68d5f87bc96dcf87deab65e67386a0cec903b
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e6d5d31d002 training/webapp "python app.py" 8 seconds ago Up 7 seconds 127.0.0.1:5000->5000/tcp quizzical_banach
使用ip::containerPort
綁定localhost的任意端口到容器的指定端口拣帽,本地主機(jī)會(huì)自動(dòng)分配一個(gè)端口。
[root@localhost ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
9965b7919951f9a0febd6614a7b8392cb6b625cb3b612ea8975fc23ccc81ae69
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9965b7919951 training/webapp "python app.py" 5 seconds ago Up 4 seconds 127.0.0.1:32768->5000/tcp optimistic_mahavira
還可以使用udp
標(biāo)記來(lái)指定udp端口嚼锄。
[root@localhost ~]# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
e48e3dfd1b20b20514c2009ab7ee942e88020971cfbcf3e5525ac9ce18c0e3eb
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e48e3dfd1b20 training/webapp "python app.py" 8 seconds ago Up 7 seconds 5000/tcp, 127.0.0.1:5000->5000/udp gracious_colden
使用docker port
來(lái)查看當(dāng)前映射的端口配置减拭,也可查看到綁定的地址。
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e48e3dfd1b20 training/webapp "python app.py" 8 seconds ago Up 7 seconds 5000/tcp, 127.0.0.1:5000->5000/udp gracious_colden
[root@localhost ~]# docker port gracious_colden 5000/udp
127.0.0.1:5000
5.2区丑、容器互聯(lián)
容器的連接(linking)系統(tǒng)是除了端口映射外另一種可以與容器中應(yīng)用進(jìn)行交互的方式拧粪,它會(huì)在源和接收容器間創(chuàng)建一個(gè)隧道,接收容器可以看到源容器指定的信息沧侥。
連接系統(tǒng)是依據(jù)容器的名稱來(lái)執(zhí)行的可霎,首先需要自定義一個(gè)好記的容器命名,使用--name
標(biāo)記可為容器自定義命名宴杀。
容器的名稱是唯一的癣朗,如果命名已存在,需要先用docker rm
來(lái)刪除之前創(chuàng)建的同名容器婴氮。
在執(zhí)行docker run
的時(shí)候如果添加--rm
標(biāo)記斯棒,則容器在終止后會(huì)立刻刪除,--rm
和-d
參數(shù)不能同時(shí)使用主经。
[root@localhost ~]# docker run -d -P --name web training/webapp python app.py
0fad509942452cf778130a4fe48ee1ee1b5b7ac90d1722e87a57bf935edcdcd8
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fad50994245 training/webapp "python app.py" 9 seconds ago Up 8 seconds 0.0.0.0:32769->5000/tcp web
[root@localhost ~]# docker inspect -f "{{ .Name }}" 0fad50994245
/web
使用--link
參數(shù)可以讓容器之間安全的進(jìn)行交互荣暮。格式為:--link name:alias
,其中name是要連接的容器的名稱罩驻,alias是這個(gè)連接的別名穗酥。
Docker在兩個(gè)互聯(lián)的容器間創(chuàng)建了一個(gè)安全隧道,且不用映射它們的端口到宿主主機(jī)上惠遏,避免了暴露數(shù)據(jù)庫(kù)端口到外部網(wǎng)絡(luò)砾跃。
[root@localhost ~]# docker run -d --name db training/postgres
050e569cc50e20cb3b8d41b028204fa51a6d862850b6bb20b2390270de748e2b
[root@localhost ~]# docker run -d -P --name web --link db:db training/webapp python app.py
f8e68cadc083afad5401b001ee223ee9b47ebd447c8fcac71a961be13de39c8a
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8e68cadc083 training/webapp "python app.py" 8 seconds ago Up 7 seconds 0.0.0.0:32771->5000/tcp web
050e569cc50e training/postgres "su postgres -c '/..." About a minute ago Up About a minute 5432/tcp db, web/db
可以看到自定義命名的容器:db和web,db容器的names列有db也有web//db节吮,這表示web容器連接到db容器抽高,允許web容器訪問db容器的信息。
Docker通過(guò)兩種方式為容器公開連接信息:環(huán)境變量透绩;更新/etc/hosts文件翘骂。
使用env
命令來(lái)查看web容器的環(huán)境變量壁熄。
[root@localhost ~]# docker run --rm --name web2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=08f24c59f079
DB_PORT=tcp://172.17.0.3:5432
DB_PORT_5432_TCP=tcp://172.17.0.3:5432
DB_PORT_5432_TCP_ADDR=172.17.0.3
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root
其中DB_開頭的環(huán)境變量是提供web容器連接db容器使用,前綴采用大寫的連接別名碳竟。
除了環(huán)境變量草丧,Docker還添加host信息到父容器的/etc/hosts
文件。
[root@localhost ~]# docker run -ti --rm --link db:db training/webapp /bin/bash
root@924a157de540:/opt/webapp# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 db 050e569cc50e
172.17.0.5 924a157de540
root@924a157de540:/opt/webapp# ping db
PING db (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.202 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.157 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.160 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.156 ms
^C--- db ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.156/0.169/0.202/0.000 ms
root@924a157de540:/opt/webapp#
用戶可連接多個(gè)子容器到父容器莹桅。
6昌执、Dockerfile
Dockerfile是一個(gè)文本格式的配置文件,用戶可使用Dockerfile快速創(chuàng)建自定義鏡像诈泼。
6.1懂拾、基本結(jié)構(gòu)
Dockerfile由一行行命令語(yǔ)句組成,主要分為基礎(chǔ)鏡像信息铐达、維護(hù)者信息委粉、鏡像操作指令和容器啟動(dòng)時(shí)指令這四部分,并支持以#
開頭的注釋行娶桦。
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command fromat: Instruction [arguments / command] ..
# 第一行必須指定基于的基礎(chǔ)鏡像
FROM ubuntu
# 維護(hù)者信息
MAINTAINER docker_user docker_user@email.com
# 鏡像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器啟動(dòng)時(shí)執(zhí)行指令
CMD /usr/sbin/nginx
...
在ubuntu父鏡像基礎(chǔ)上安裝inotify-tools、nginx汁汗、apache2衷畦、openssh-server等軟件,創(chuàng)建一個(gè)新的Nginx鏡像知牌。
# Nginx
#
# VERSION 0.0.1
FROM ubuntu
MAINTAINER Victor View <victor@docker.com>
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
基于ubuntu父鏡像祈争,安裝firefox和vnc軟件,啟動(dòng)后角寸,可通過(guò)5900端口通過(guò)vnc方式使用firefox菩混。
# Firefox over VNC
#
# VERSION 0.3
FROM ubuntu
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir /.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["x11vnc", "-forever", "-usepw", "-create"]
6.2、指令
指令的一般格式為INSTRUCTION arguments
扁藕,下面分別做詳細(xì)介紹沮峡。
FROM
格式為FROM <image>
或FROM <image>:<tag>
。第一條指令必須為FROM
指令亿柑,在同一個(gè)Dockerfile中創(chuàng)建多個(gè)鏡像時(shí)可以使用多個(gè)FROM
指令(每個(gè)鏡像一次)邢疙。
MAINTAINER
格式為MAINTAINER <name>
,指定維護(hù)者信息望薄。
RUN
格式為RUN <command>
或RUN ["executable", "param1", "param2"]
疟游。前者將在shell終端中運(yùn)行命令,即/bin/sh -c
痕支;后者則使用exec執(zhí)行颁虐。指定使用其他終端可以通過(guò)第二種方式實(shí)現(xiàn)。
RUN ["/bin/bash", "-c", "echo hello"]
每條RUN
指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令卧须,并提交為新的鏡像另绩,當(dāng)命令較長(zhǎng)時(shí)可使用\
來(lái)?yè)Q行儒陨。
CMD
支持三種格式:
CMD ["executable", "param1", "param2"]
,使用exec
執(zhí)行板熊,推薦方式框全。CMD command param1 param2
,在/bin/sh
中執(zhí)行干签,提供給需要交互的應(yīng)用津辩。CMD ["param1", "param2"]
,提供給ENTRYPOINT
的默認(rèn)參數(shù)
指定啟動(dòng)容器時(shí)執(zhí)行的命令容劳,每個(gè)Dockerfile只能有一條CMD
命令喘沿,如果指定了多條命令,只有最后一條會(huì)被執(zhí)行竭贩。如果用戶啟動(dòng)容器時(shí)指定了運(yùn)行的命令則會(huì)覆蓋掉CMD
指定的命令蚜印。
EXPOSE
格式為EXPOSE <port> [<port>...]
,告訴Docker服務(wù)端容器暴露的端口號(hào)留量,供互聯(lián)系統(tǒng)使用窄赋。
在啟動(dòng)容器時(shí)需要通過(guò)-P
,Docker主機(jī)會(huì)自動(dòng)分配一個(gè)端口轉(zhuǎn)發(fā)到指定的端口楼熄;使用-p
則可以具體指定哪個(gè)本地端口映射過(guò)來(lái)忆绰。
ENV
格式ENV <key> <value>
,指定一個(gè)環(huán)境變量可岂,會(huì)被后續(xù)RUN
指令使用错敢,并在容器運(yùn)行時(shí)保持。
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgres && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD
格式ADD <src> <dest>
缕粹,復(fù)制指定的<src>
到容器中的<dest>
稚茅,其中<src>
可以是Dockerfile所在目錄的一個(gè)相對(duì)路徑(文件或目錄);也可以是一個(gè)URL平斩;還可以是一個(gè)tar文件(自動(dòng)解壓為目錄)亚享。
COPY
格式COPY <src> <dest>
,復(fù)制本地主機(jī)的<src>
(為Dockerfile所在目錄的相對(duì)路徑双戳,文件或目錄)為容器中的<dest>
虹蒋,目標(biāo)路徑不存在時(shí)會(huì)自動(dòng)創(chuàng)建。
ENTRYPOINT
配置容器啟動(dòng)后執(zhí)行的命令飒货,且不可被docker run
提供的參數(shù)覆蓋魄衅。有兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
,shell中執(zhí)行塘辅。
每個(gè)Dockerfile中只能有一個(gè)ENTRYPOINT
晃虫,當(dāng)指定多個(gè)ENTRYPOINT時(shí)
,只有最后一個(gè)生效扣墩。
VOLUME
格式VOLUME ["/data"]
哲银,創(chuàng)建一個(gè)可以從本地主機(jī)或其他容器掛載的掛載點(diǎn)扛吞,一般用來(lái)存放數(shù)據(jù)庫(kù)和需要保持的數(shù)據(jù)等。
USER
格式USER daemon
荆责,指定運(yùn)行容器時(shí)的用戶名或UID滥比,后續(xù)的RUN
也會(huì)使用指定用戶。
當(dāng)服務(wù)不需要管理員權(quán)限時(shí)做院,可通過(guò)該命令指定運(yùn)行用戶盲泛,并可在之前創(chuàng)建所需要的用戶。要臨時(shí)獲取管理員權(quán)限可使用gosu
键耕,而不推薦sudo
寺滚。
WORKDIR
格式WORKDIR /path/to/workdir
,為后續(xù)的RUN
屈雄、CMD
村视、ENTRYPOINT
指令配置工作目錄。
可以使用多個(gè)WORKDIR
指令酒奶,后續(xù)命令如果參數(shù)是相對(duì)路徑蚁孔,則會(huì)基于之前命令指定的路徑。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 最終路徑為/a/b/c
ONBUILD
格式ONBUILD [INSTRUCTION]
惋嚎,配置當(dāng)前所創(chuàng)建的鏡像作為其他新創(chuàng)建的基礎(chǔ)鏡像時(shí)所執(zhí)行的操作指令勒虾。
鏡像image-A Dockerfile
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
基于image-A創(chuàng)建新鏡像,新的Dockerfile中使用FROM images-A
指定基礎(chǔ)鏡像時(shí)瘸彤,會(huì)自動(dòng)執(zhí)行ONBUILD
指令內(nèi)容,等價(jià)于在后面添加了兩條指令笛钝。
FROM images-A
# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用ONBUILD
指令的鏡像推薦在標(biāo)簽中注明质况。例如ruby:1.9-onbuild
。
6.3玻靡、創(chuàng)建鏡像
編寫完Dockerfile后结榄,可以通過(guò)docker build
命令來(lái)創(chuàng)建鏡像。
基本格式為docker build[選項(xiàng)] 路徑
囤捻,該命令讀取指定路徑下(包括子目錄)的Dockerfile臼朗,并將該路徑下所有內(nèi)容發(fā)送給Docker服務(wù)端,由服務(wù)端來(lái)創(chuàng)建鏡像蝎土,因此视哑,一般建議放置Dockerfile的目錄為空目錄。也可通過(guò).dockerignore
文件(每行添加一條匹配模式)來(lái)讓Docker忽略路徑下的目錄和文件誊涯。
要指定鏡像的標(biāo)簽信息挡毅,可通過(guò)-t
選項(xiàng)。
# 指定Dockerfile所在路徑為/tmp/docker_builder/暴构,且希望生成鏡像標(biāo)簽為build_repo/first_image
[root@localhost ~]# docker build -t build_repo/first_image /tmp/docker_builder/