Docker入门

目录

Docker入门,来自Docker官方文档 《Docker User Guide

Docker安装

参见之前的博文

使用Docker Hub

从Docker Hub中下载镜像比较慢,可以从docker.cn网站下载。

docker@boot2docker:~$ sudo docker pull docker.cn/docker/ubuntu
Pulling repository docker.cn/docker/ubuntu
b39b81afc8ca: Download complete
511136ea3c5a: Download complete
53f858aaaf03: Download complete
837339b91538: Download complete
615c102e2290: Download complete
Status: Downloaded newer image for docker.cn/docker/ubuntu:latest

查看本机镜像

docker@boot2docker:~$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.cn/docker/ubuntu   14.04               b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   14.04.1             b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   trusty              b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   latest              b39b81afc8ca        2 weeks ago         192.7 MB

打包应用:Hello, World

Hillo World

可以在容器中直接运行命令:

docker@boot2docker:~$ sudo docker run docker.cn/docker/centos:7 /bin/echo 'Hello world'
Hello world

交互容器

在容器中运行可交互的终端

docker@boot2docker:~$ sudo docker run -t -i docker.cn/docker/ubuntu:14.04 /bin/bash
root@5a8de7e19c28:/#
root@5a8de7e19c28:/# pwd
/
root@5a8de7e19c28:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

守护程序

使用选项-d创建后台运行的容器

docker@boot2docker:~$ sudo docker run -d docker.cn/docker/ubuntu:14.04 /bin/bash -c "while true; do echo hello world; sleep 1; done"
a920deccbc11b5c21cd2d21503e300db3ee731541004475072cfcdd90cd46675

返回的字符串为容器的ID号。
查看当前容器:docker ps

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE                           COMMAND                CREATED             STATUS              PORTS               NAMES
a920deccbc11        docker.cn/docker/ubuntu:14.04   "/bin/bash -c 'while   40 seconds ago      Up 40 seconds                           prickly_lumiere

NAMES是自动生成的容器名,可以使用参数人为指定。
查看某个容器的输出:docker logs

docker@boot2docker:~$ sudo docker logs prickly_lumiere
hello world
hello world
hello world
hello world
hello world
hello world

停止容器运行:docker stop

docker@boot2docker:~$ sudo docker stop prickly_lumiere
prickly_lumiere

操控容器

在容器中运行web应用

docker@boot2docker:~$ sudo docker run -d -P training/webapp python app.py
bc1bc53376983ca3129d2d8a05184be3f5fdd1442e04ad019e8d71f917b3e4e2

参数-P表示让Docker自动将容器所有需要的端口映射到宿主机上。

查看web应用容器

docker@boot2docker:~$ sudo docker ps -l
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
bc1bc5337698        training/webapp:latest   "python app.py"     18 seconds ago      Up 18 seconds       0.0.0.0:49153->5000/tcp   sick_kirch

PORTS列显示将容器内的5000端口映射到宿主机的49153端口,这就是应为设置-P选项。
可以用-p选项指定映射的端口:

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

查看web应用日志

使用-f选项动态更新

docker@boot2docker:~$ sudo docker logs -f sick_kirch
 * Running on //0.0.0.0:5000/
172.17.42.1 - - [04/Feb/2015 12:57:50] "GET / HTTP/1.1" 200 -

查看web应用容器进程

docker@boot2docker:~$ sudo docker top sick_kirch
PID                 USER                COMMAND
1996                root                python app.py

查看web应用容器

docker@boot2docker:~$ sudo docker inspect sick_kirch
[{
    "AppArmorProfile": "",
    "Args": [
        "app.py"
    ],
    "Config": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "python",
            "app.py"
        ],
        "CpuShares": 0,
        "Cpuset": "",
        "Domainname": "",
        "Entrypoint": null,
        "Env": [
            "HOME=/",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "ExposedPorts": {
            "5000/tcp": {}
        },
        "Hostname": "bc1bc5337698",
        "Image": "training/webapp",
        "MacAddress": "",
        "Memory": 0,
        "MemorySwap": 0,
        "NetworkDisabled": false,
        "OnBuild": null,
        "OpenStdin": false,
        "PortSpecs": null,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": null,
        "WorkingDir": "/opt/webapp"
    },
    "Created": "2015-02-04T12:56:20.532265159Z",
    "Driver": "aufs",
    "ExecDriver": "native-0.2",
    "HostConfig": {
        "Binds": null,
        "CapAdd": null,
        "CapDrop": null,
        "ContainerIDFile": "",
        "Devices": [],
        "Dns": null,
        "DnsSearch": null,
        "ExtraHosts": null,
        "IpcMode": "",
        "Links": null,
        "LxcConf": [],
        "NetworkMode": "bridge",
        "PortBindings": {},
        "Privileged": false,
        "PublishAllPorts": true,
        "RestartPolicy": {
            "MaximumRetryCount": 0,
            "Name": ""
        },
        "SecurityOpt": null,
        "VolumesFrom": null
    },
    "HostnamePath": "/mnt/sda1/var/lib/docker/containers/bc1bc53376983ca3129d2d8a05184be3f5fdd1442e04ad019e8d71f917b3e4e2/hostname",
    "HostsPath": "/mnt/sda1/var/lib/docker/containers/bc1bc53376983ca3129d2d8a05184be3f5fdd1442e04ad019e8d71f917b3e4e2/hosts",
    "Id": "bc1bc53376983ca3129d2d8a05184be3f5fdd1442e04ad019e8d71f917b3e4e2",
    "Image": "31fa814ba25ae3426f8710df7a48d567d4022527ef2c14964bb8bc45e653417c",
    "MountLabel": "",
    "Name": "/sick_kirch",
    "NetworkSettings": {
        "Bridge": "docker0",
        "Gateway": "172.17.42.1",
        "IPAddress": "172.17.0.5",
        "IPPrefixLen": 16,
        "MacAddress": "02:42:ac:11:00:05",
        "PortMapping": null,
        "Ports": {
            "5000/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "49153"
                }
            ]
        }
    },
    "Path": "python",
    "ProcessLabel": "",
    "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/bc1bc53376983ca3129d2d8a05184be3f5fdd1442e04ad019e8d71f917b3e4e2/resolv.conf",
    "State": {
        "Error": "",
        "ExitCode": 0,
        "FinishedAt": "0001-01-01T00:00:00Z",
        "OOMKilled": false,
        "Paused": false,
        "Pid": 1996,
        "Restarting": false,
        "Running": true,
        "StartedAt": "2015-02-04T12:56:20.831535966Z"
    },
    "Volumes": {},
    "VolumesRW": {}
}
]

停止容器

docker@boot2docker:~$ sudo docker stop sick_kirch
sick_kirch
docker@boot2docker:~$ sudo docker ps -l
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS                       PORTS               NAMES
bc1bc5337698        training/webapp:latest   "python app.py"     6 minutes ago       Exited (-1) 28 seconds ago                       sick_kirch

重新启动容器

docker@boot2docker:~$ sudo docker start sick_kirch
sick_kirch
docker@boot2docker:~$ docker ps -l
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
bc1bc5337698        training/webapp:latest   "python app.py"     11 hours ago        Up 25 seconds       0.0.0.0:49154->5000/tcp   sick_kirch 

也可以使用docker restart重新启动。

删除容器

删除正在运行的容器会出错

docker@boot2docker:~$ sudo docker rm sick_kirch
Error response from daemon: You cannot remove a running container. Stop the container before attempting removal or use -f
FATA[0000] Error: failed to remove one or more containers

需要先停止容器

docker@boot2docker:~$ sudo docker stop sick_kirch
sick_kirch
docker@boot2docker:~$ sudo docker rm sick_kirch
sick_kirch

操控docker镜像

列出宿主机上的所有docker镜像

docker@boot2docker:~$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.cn/docker/ubuntu   14.04               b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   14.04.1             b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   latest              b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   trusty              b39b81afc8ca        2 weeks ago         192.7 MB
training/webapp           latest              31fa814ba25a        8 months ago        278.8 MB

使用image时最好指定标签。

获取镜像

docker@boot2docker:~$ sudo docker pull training/sinatra
Pulling repository training/sinatra
f0f4ab557f95: Download complete
f0f4ab557f95: Pulling image (latest) from training/sinatra
3e76c0a80540: Download complete
be88c4c27e80: Download complete
bfab314f3b76: Download complete
e809f156dc98: Download complete
ce80548340bb: Download complete
79e6bf39f993: Download complete
Status: Downloaded newer image for training/sinatra:latest

查找镜像

docker@boot2docker:~$ sudo docker search redis
NAME                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis                        Redis is an open source key-value store th...   483       [OK]
dockerfile/redis             Trusted automated Redis (//redis.io/)...   84                   [OK]
…

创建自己的镜像

docker@boot2docker:~$ sudo docker run -t -i training/sinatra /bin/bash
root@1ed4657f2410:/# gem install json
Fetching: json-1.8.2.gem (100%)
Building native extensions.  This could take a while...
Successfully installed json-1.8.2
1 gem installed
Installing ri documentation for json-1.8.2...
Installing RDoc documentation for json-1.8.2...
root@1ed4657f2410:/# exit
exit

提交镜像

docker@boot2docker:~$ sudo docker commit -m "Added json gem" -a "Perilla Roc" 1ed4657f2410 perillaroc/sinatra:v2
25391254d3343d1aab9595fd3581ce8d5c1992214eb6b307b7321107a02c4de2

查看是否生成镜像

docker@boot2docker:~$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
perillaroc/sinatra        v2                  25391254d334        22 seconds ago      451.9 MB
docker.cn/docker/ubuntu   14.04               b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   14.04.1             b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   latest              b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   trusty              b39b81afc8ca        2 weeks ago         192.7 MB
training/sinatra          latest              f0f4ab557f95        8 months ago        447 MB
training/webapp           latest              31fa814ba25a        8 months ago        278.8 MB

从Dockerfile创建镜像

折腾一上午没有搞定ubuntu,更新时总出错。只好改为用centos。
gem安装时也需要添加国内淘宝源地址,删掉原有的地址。
Dockerfile

ROM docker.cn/docker/centos:7
MAINTAINER Perilla Roc <perillaroch@gmail.com>
RUN yum install -y ruby ruby-dev
RUN gem sources --remove https://rubygems.org/
RUN gem sources -a //ruby.taobao.org/
RUN gem install sinatra

创建镜像

docker@boot2docker:~/sinatra$ sudo docker build -t perillaroc/sinatra:v2 .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon
Step 0 : FROM docker.cn/docker/centos:7
 ---> 8efe422e6104
Step 1 : MAINTAINER Perilla Roc <perillaroch@gmail.com>
 ---> Using cache
 ---> beabb310825d
Step 2 : RUN yum install -y ruby ruby-dev
 ---> Using cache
 ---> dc2dd2888cee
Step 3 : RUN gem sources -a //ruby.taobao.org/
 ---> Running in e3d2f7198396
//ruby.taobao.org/ added to sources
 ---> 3854da67967c
Removing intermediate container e3d2f7198396
Step 4 : RUN gem install sinatra
 ---> Running in 3c635f2ee88e
docker@boot2docker:~/sinatra$ vi Dockerfile
docker@boot2docker:~/sinatra$ sudo docker build -t perillaroc/sinatra:v2 .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon
Step 0 : FROM docker.cn/docker/centos:7
 ---> 8efe422e6104
Step 1 : MAINTAINER Perilla Roc <perillaroch@gmail.com>
 ---> Using cache
 ---> beabb310825d
Step 2 : RUN yum install -y ruby ruby-dev
 ---> Using cache
 ---> dc2dd2888cee
Step 3 : RUN gem sources --remove https://rubygems.org/
 ---> Running in cc78a36ba221
https://rubygems.org/ removed from sources
 ---> 351a2610b26e
Removing intermediate container cc78a36ba221
Step 4 : RUN gem sources -a //ruby.taobao.org/
 ---> Running in 52036271a4a8
//ruby.taobao.org/ added to sources
 ---> 25bc1357a6b3
Removing intermediate container 52036271a4a8
Step 5 : RUN gem install sinatra
 ---> Running in c52754722cd8
unable to convert "\x89" from ASCII-8BIT to UTF-8 for lib/sinatra/images/404.png, skipping
unable to convert "\x89" from ASCII-8BIT to UTF-8 for lib/sinatra/images/500.png, skipping
Successfully installed rack-1.6.0
Successfully installed tilt-1.4.1
Successfully installed rack-protection-1.5.3
Successfully installed sinatra-1.4.5
Parsing documentation for rack-1.6.0
Installing ri documentation for rack-1.6.0
Parsing documentation for tilt-1.4.1
Installing ri documentation for tilt-1.4.1
Parsing documentation for rack-protection-1.5.3
Installing ri documentation for rack-protection-1.5.3
Parsing documentation for sinatra-1.4.5
Installing ri documentation for sinatra-1.4.5
4 gems installed
 ---> ad9bcb3d31e8
Removing intermediate container c52754722cd8
Successfully built ad9bcb3d31e8

当前镜像

docker@boot2docker:~/sinatra$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
perillaroc/sinatra        v2                  ad9bcb3d31e8        30 minutes ago      329.4 MB
ubuntu                    14.04               5ba9dab47459        7 days ago          188.3 MB
docker.cn/docker/ubuntu   14.04               b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   14.04.1             b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   latest              b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/ubuntu   trusty              b39b81afc8ca        2 weeks ago         192.7 MB
docker.cn/docker/centos   latest              8efe422e6104        4 weeks ago         210 MB
docker.cn/docker/centos   7                   8efe422e6104        4 weeks ago         210 MB
docker.cn/docker/centos   centos7             8efe422e6104        4 weeks ago         210 MB
training/sinatra          latest              f0f4ab557f95        8 months ago        447 MB
training/webapp           latest              31fa814ba25a        8 months ago        278.8 MB

设置镜像标签

docker@boot2docker:~/sinatra$ sudo docker tag ad9bcb3d31e8 perillaroc/sinatra:devel
docker@boot2docker:~/sinatra$ sudo docker images perillaroc/sinatra
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
perillaroc/sinatra   v2                  ad9bcb3d31e8        33 minutes ago      329.4 MB
perillaroc/sinatra   devel               ad9bcb3d31e8        33 minutes ago      329.4 MB

上传镜像

上传镜像到Docker Hub

docker@boot2docker:~/sinatra$ sudo docker push perillaroc/sinatra

从宿主机删除镜像

docker@boot2docker:~$ docker rmi training/sinatra
Untagged: training/sinatra:latest
Deleted: f0f4ab557f954f3e04177663a3af90e88641bcdcce1f02ac900dbd9768ef4945
Deleted: 79e6bf39f99322cc062a79bec4a09de0dd19cb7f5f735b4b6b7832c04b13bb45
Deleted: ce80548340bb03726d391bb8fa4d134f8418c2fff90be9a7323560debdea9bd2
Deleted: e809f156dc985e07105fdc86ec05eb03eb7aac8636dc210e8595d31b55787f4a
Deleted: bfab314f3b766eddf9778f8dce089f44e84ea028f4a44ce68740dce81a844ec8
Deleted: be88c4c27e80023b6aea82f0f2e15fb21c6f4193fe814e5b58010d356dd7846b
Deleted: 3e76c0a80540a0d36493ae7110796fc92f559a191454e3ac19c1d4c650bdd9e0

链接容器

之前介绍过可以通过端口链接docker容器,本节先复习网络端口映射方法,再介绍一种新的方法:容器链接。

网络端口映射

-P参数

docker@boot2docker:~$ sudo docker run -d -P training/webapp python app.py
65137a2370b0c34c2a44f0b48e0d71324a4799e2551d64ea7938a2c20132a0d1
docker@boot2docker:~$ sudo docker ps -a
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
65137a2370b0        training/webapp:latest   "python app.py"     10 seconds ago      Up 9 seconds        0.0.0.0:49155->5000/tcp   determined_poincare 

-p参数

docker@boot2docker:~$ sudo docker run -d -p 5000:5000 training/webapp python app.py
43d21d4291b8df1950fd5e8fcdb4edb3698cec43dd5264023d399ec2f0f58756
docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
43d21d4291b8        training/webapp:latest   "python app.py"     13 seconds ago      Up 13 seconds       0.0.0.0:5000->5000/tcp    insane_stallman
65137a2370b0        training/webapp:latest   "python app.py"     4 minutes ago       Up 4 minutes        0.0.0.0:49155->5000/tcp   determined_poincare 

指定ip地址+端口

docker@boot2docker:~$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
b6499e6e79ad4236e728fedbc0b40607dea08fa9081a9a2bee1c3c81f8cf2e9f
docker@boot2docker:~$ sudo docker ps -a
CONTAINER ID        IMAGE                    COMMAND             CREATED              STATUS              PORTS                      NAMES
b6499e6e79ad        training/webapp:latest   "python app.py"     9 seconds ago        Up 8 seconds        127.0.0.1:5000->5000/tcp   ecstatic_darwin

使用udp

docker@boot2docker:~$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
e83db66af8dcb5fd785e37212b4e87d07fa88f8d72e03a99cdf0f81cbff0c916
docker@boot2docker:~$ sudo docker ps -a
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                                NAMES
e83db66af8dc        training/webapp:latest   "python app.py"     8 seconds ago       Up 7 seconds        5000/tcp, 127.0.0.1:5000->5000/udp   compassionate_ptolemy

查看端口映射

docker@boot2docker:~$ docker port insane_stallman 5000
0.0.0.0:5000

容器链接

容器命名

容器链接需要用到容器名,之前已经看到docker会自动给容器命名,也可以使用–name给容器命名。

docker@boot2docker:~$ sudo docker run -d -P --name web training/webapp python app.py
f40febde7b8df75c3b3af89e81daac88f662f1e0ecf8b8eb43690a5ad68ddd12
docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
f40febde7b8d        training/webapp:latest   "python app.py"     4 seconds ago       Up 4 seconds        0.0.0.0:49156->5000/tcp   web  

容器链接

运行postgres镜像,并命名为db

ocker@boot2docker:~$ sudo docker run -d --name db training/postgres
Unable to find image 'training/postgres:latest' locally
Pulling repository training/postgres
258105bea10d: Download complete
258105bea10d: Pulling image (latest) from training/postgres
35f6dd4dd141: Download complete
7baf0ef6f14a: Download complete
e497c7c1bfbb: Download complete
5cf8fd909c6c: Download complete
8726e050fbc9: Download complete
043c01407567: Download complete
65a89e6a06f8: Download complete
6af9ddfabfd3: Download complete
316f4525806b: Download complete
bfbc096044e3: Download complete
444db2eae2c3: Download complete
e06e512105c3: Download complete
Status: Downloaded newer image for training/postgres:latest
50a082a75f0249c3e1210232fdc11a84abff6b1dfc447641bd00940a51d40df7

删除之前创建的web容器

docker@boot2docker:~$ sudo docker rm -f web
web

创建web容器,连接db容器

docker@boot2docker:~$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
75236101aa2e87dbac0df57d531213833da0d9dd1f1e545e868e774c4eae064d

查看信息

docker@boot2docker:~$ sudo docker inspect -f "{{ .HostConfig.Links }}" web
[/db:/web/db]

容器链接使得源容器向目标容器提供信息,两种方式暴露信息:
环境变量
更新/etc/hosts文件

环境变量

详情参看docker文档

docker@boot2docker:~$ sudo 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=10280270bd64
DB_PORT=tcp://172.17.0.45:5432
DB_PORT_5432_TCP=tcp://172.17.0.45:5432
DB_PORT_5432_TCP_ADDR=172.17.0.45
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/

推荐使用hosts方式

更新/etc/hosts文件

打开一个容器终端

docker@boot2docker:~$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@06a865e78435:/opt/webapp# 

查看hosts文件

root@06a865e78435:/opt/webapp# cat /etc/hosts
172.17.0.48	06a865e78435
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.45	db

测试

root@06a865e78435:/opt/webapp# apt-get install -yqq inetutils-ping
root@06a865e78435:/opt/webapp# ping db
PING db (172.17.0.45): 48 data bytes
56 bytes from 172.17.0.45: icmp_seq=0 ttl=64 time=0.214 ms
56 bytes from 172.17.0.45: icmp_seq=1 ttl=64 time=0.093 ms
56 bytes from 172.17.0.45: icmp_seq=2 ttl=64 time=0.121 ms
^C--- db ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.093/0.143/0.214/0.052 ms

重启source容器,连接容器的hosts会自动更新

docker@boot2docker:~$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@a9222435bf31:/opt/webapp# cat /etc/hosts
172.17.0.50	a9222435bf31
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.49	db

另一个窗口中重启源容器

docker@boot2docker:~$ docker restart db
db

当前窗口再次查看hosts

root@a9222435bf31:/opt/webapp# cat /etc/hosts
172.17.0.50	a9222435bf31
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.51	db

操控容器中的数据

两种方式:
Data volumes
Data volume containers

Data volumes

添加data volumes

docker@boot2docker:~$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
98ae22fa1d6b4f36e98785034574130d394015ff330378752458a1b582870828

Dockerfile中使用VOLUME设置

挂载主机目录

docker@boot2docker:~$ sudo docker run -d -P --name web -v /opt/webapp:/opt/webapp training/webapp python app.py
ad27c5b88dacaf969f2abcefccd70297c478ffe06d9987fb70653820a299014a
docker@boot2docker:~$ docker inspect web
…
"HostConfig": {
        "Binds": [
            "/opt/webapp:/opt/webapp"
        ],
…

只读挂载

docker@boot2docker:~$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
fe5f6051d4d26acc07585f79837f26011c3d123c841a61f9119d153c822ef646
    "HostConfig": {
        "Binds": [
            "/src/webapp:/opt/webapp:ro"
        ],

挂载文件

可以挂载文件,但推荐挂载父目录

创建并加载Data volume container

docker@boot2docker:~$ sudo docker create -v /dbdata --name dbdata training/postgres
977e296a5c1581b86c2598d86853e529d66155ccf51e83fe5a14ddb62b9cf713
docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS               NAMES
977e296a5c15        training/postgres:latest   "su postgres -c '/us   2 seconds ago                                               dbdata
50a082a75f02        training/postgres:latest   "su postgres -c '/us   14 hours ago        Up 13 hours         5432/tcp            db
docker@boot2docker:~$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
df092111f49caea21bec767c37224d86a9eff068368756295c43e7df4b426c87
docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS               NAMES
df092111f49c        training/postgres:latest   "su postgres -c '/us   4 seconds ago       Up 3 seconds        5432/tcp            db1
977e296a5c15        training/postgres:latest   "su postgres -c '/us   30 seconds ago                                              dbdata
50a082a75f02        training/postgres:latest   "su postgres -c '/us   14 hours ago        Up 13 hours         5432/tcp            db
docker@boot2docker:~$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
0f65c4d1fe52ad30a15c1da57fb872a1bacbe3f986d5e9f7bfbd287564cead29
docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS               NAMES
0f65c4d1fe52        training/postgres:latest   "su postgres -c '/us   2 seconds ago       Up 2 seconds        5432/tcp            db2
df092111f49c        training/postgres:latest   "su postgres -c '/us   24 seconds ago      Up 24 seconds       5432/tcp            db1
977e296a5c15        training/postgres:latest   "su postgres -c '/us   50 seconds ago                                              dbdata
50a082a75f02        training/postgres:latest   "su postgres -c '/us   14 hours ago        Up 13 hours         5432/tcp            db
docker@boot2docker:~$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
f7209c0ec9ff210e0260a830eb79088c009d6ca934c1ac3400e0451a5283c749
docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED              STATUS              PORTS               NAMES
f7209c0ec9ff        training/postgres:latest   "su postgres -c '/us   2 seconds ago        Up 1 seconds        5432/tcp            db3
0f65c4d1fe52        training/postgres:latest   "su postgres -c '/us   24 seconds ago       Up 23 seconds       5432/tcp            db2
df092111f49c        training/postgres:latest   "su postgres -c '/us   46 seconds ago       Up 45 seconds       5432/tcp            db1
977e296a5c15        training/postgres:latest   "su postgres -c '/us   About a minute ago                                           dbdata
50a082a75f02        training/postgres:latest   "su postgres -c '/us   14 hours ago         Up 13 hours         5432/tcp            db  

备份、恢复或迁移data volume

备份

docker@boot2docker:~$ sudo docker run --volumes-from dbdata -v $(pwd):/backup docker.cn/docker/ubuntu tar cvf /backup/backup.tar /dbdata
tar: Removing leading `/' from member names
/dbdata/

恢复

docker@boot2docker:~$ sudo docker run -v /dbdata --name dbdata2 docker.cn/docker/ubuntu /bin/bash
docker@boot2docker:~$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

该部分还没有实际应用过,待以后补充。