文章目录
  1. 1. Docker简介
  2. 2. Docker安装
  3. 3. 镜像
  4. 4. 容器
  5. 5. 仓库
  6. 6. 数据
    1. 6.1. 数据卷
    2. 6.2. 数据卷容器
    3. 6.3. 备份和恢复
  7. 7. 网络
  8. 8. 参考

Docker简介

Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。Docker能处理的事情包括:

  • 隔离应用依赖
  • 创建应用镜像并进行复制
  • 创建容易分发的即启即用的应用
  • 允许实例简单、快速地扩展
  • 测试应用并随后销毁它们

Docker三大核心概念

  • 镜像 image :类似于虚拟机的快照,但更轻量。
  • 容器 container :镜像的一个运行实例,可以独立运行一个或一组应用。
  • 仓库 repository :集中存放镜像的地方

Docker安装

OS:Ubuntu 14.04 #主要docker 默认为64位系统,32位会出现问题

1
2
3
4
5
6
要求kernel >= 3.8,若不满足执行下面操作
#安装内核
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
#重启
sudo reboot
  1. 添加docker的repository到本地密钥库
1
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
  1. 将Docker添加到你的apt软件安装源中,然后update和install lxc-docker
1
2
3
sudo sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker

镜像

  • 获取镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    sudo docker pull ubuntu [TAG]
    #TAG:14.04 表示特定版本, 默认下载最新版本

    #eg:
    monkee@ubuntu:~$ sudo docker pull ubuntu
    Using default tag: latest
    latest: Pulling from library/ubuntu
    0a85502c06c9: Pull complete
    0998bf8fb9e9: Pull complete
    a6785352b25c: Pull complete
    e9ae3c220b23: Pull complete
    Digest: sha256:f91f9bab1fe6d0db0bfecc751d127a29d36e85483b1c68e69a246cf1df9b4251
    Status: Downloaded newer image for ubuntu:latest
    monkee@ubuntu:~$ sudo docker pull ubuntu:14.04
    14.04: Pulling from library/ubuntu
    Digest: sha256:28bd2edcebe82d41c3494bf6205016fe08e681452f1448acd44d55e2cda7e3c0
    Status: Downloaded newer image for ubuntu:14.04
    monkee@ubuntu:~$ sudo docker pull ubuntu:13.04
    13.04: Pulling from library/ubuntu
    d634beec75db: Pull complete
    acc11bd60981: Pull complete
    307e4bfe3398: Pull complete
    2dd5ccb60cc5: Pull complete
    e754e00b59af: Pull complete
    Digest: sha256:bc48dd7075ce920ebbaa4581d3200e9fb3aaec31591061d7e3a280a04ef0248c
    Status: Downloaded newer image for ubuntu:13.04
  • 使用镜像创建一个容器

1
sudo docker run -t -i ubuntu /bin/bash
  • 查看镜像信息
1
2
3
4
5
6
7
8
9
10
sudo docker images
#添加新标签
sudo docker tag [OLD_REPOSITORY]:[OLD_TAG] [NEW_REPOSITORY]:[NEW_TAG]

#eg.
monkee@ubuntu:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 e9ae3c220b23 2 weeks ago 187.9 MB
ubuntu latest e9ae3c220b23 2 weeks ago 187.9 MB
ubuntu 13.04 e754e00b59af 17 months ago 169.4 MB

镜像拥有唯一ID,以及一个供人阅读的名字和标签对。镜像可以命名为类似ubuntu:latest、ubuntu:14.04等。
image id相同说明标签指向了同一个镜像文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
sudo docker inspect [image id] #获取镜像的详细信息

#eg.
monkee@ubuntu:~$ sudo docker inspect e9ae3c220b23
[
{
"Id": "e9ae3c220b23b699cb5e6914af806219b028c78d5cf6fed8eeca98ffaa8c9b43",
"RepoTags": [
"ubuntu:14.04",
"ubuntu:latest"
],
"RepoDigests": [],
"Parent": "a6785352b25c7398637e5ab5a6e989b8371f5dfdf72d9a6cdb00742f262a223e",
"Comment": "",
"Created": "2015-11-10T00:35:07.49709192Z",
"Container": "84382e3b0cae0e65ad88f32aee022f08bd2b88ba703b3b52b2f5af6bafdedc62",
"ContainerConfig": {
"Hostname": "a52c17016130",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) CMD [\"/bin/bash\"]"
],
"Image": "a467a7c6794fd7ebd5bd0e2dcb83a656ac8302e549c4a2cc29c524aea5c5623b",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "1.9.0",
"Author": "",
"Config": {
"Hostname": "a52c17016130",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [],
"Cmd": [
"/bin/bash"
],
"Image": "a467a7c6794fd7ebd5bd0e2dcb83a656ac8302e549c4a2cc29c524aea5c5623b",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 0,
"VirtualSize": 187919300,
"GraphDriver": {
"Name": "aufs",
"Data": null
}
}
]
  • 搜索镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #搜索带关键字的镜像
    sudo docker search KEYWORDS

    #eg.
    monkee@ubuntu:~$ sudo docker search docker
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    jenkins Official Jenkins Docker image 837 [OK]
    registry Containerized docker registry 499 [OK]
    alpine A minimal Docker image based on Alpine Lin... 346 [OK]
    fedora Official Docker builds of Fedora 251 [OK]
    swarm Swarm: a Docker-native clustering system. 87 [OK]
    dockerui/dockerui A web interface to interact with the Docke... 71 [OK]
    konradkleine/docker-registry-frontend Browse and modify your Docker registry in ... 56 [OK]
    jdubois/jhipster-docker Official JHipster Docker image, by the JHi... 44 [OK]
    docker Docker in Docker! 41 [OK]
    docker-dev Docker is an open source project to pack, ... 36 [OK]
    hello-world Hello World! (an example of minimal Docker... 30 [OK]
    martin/docker-cleanup-volumes Delete orphaned docker volumes 24 [OK]
    devalx/docker-teamspeak3 Docker Container with Teamspeak 3. Contain... 16 [OK]
    twiecki/pydata-docker-jupyterhub PyData multi-user IPython/Jupyter notebook... 15 [OK]
    datadog/docker-dd-agent Docker container for the Datadog Agent. 15 [OK]
    grahamdumpleton/mod-wsgi-docker Docker images for Apache/mod_wsgi. 13 [OK]
    spotify/docker-gc Garbage collection of Docker containers an... 10 [OK]
    dockercore/docker 5 [OK]
    cgal/testsuite-docker Docker images for the CGAL testsuite 2 [OK]
    dockerimages/docker-tools 1 [OK]
    docker/migrator Tool to migrate Docker images from a v1 re... 1 [OK]
    sematext/spm-agent-docker Performance Monitoring, Events and Logs fo... 1 [OK]
    docker/docker-bench-security Docker Bench checks for dozens of common b... 1 [OK]
    piefke3000/helma-docker Dockerizing the old and wise odd-toed ungu... 1 [OK]
    pylam/docker Build Fedora docker container 0 [OK]
  • 删除镜像

1
sudo docker rmi [TAG | IMAGE ID]

注意

删除镜像前先要删除依赖该镜像的所有容器。

  • 创建镜像

三种方法:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建

1)基于已有镜像的容器创建
首先启动一个镜像,并进行修改

1
2
3
4
5
monkee@ubuntu:~$ sudo docker run -t -i  ubuntu:14.04 /bin/bash
root@3b776d7e84c3:/# touch test
root@3b776d7e84c3:/# echo "this is a test :)" > test
root@3b776d7e84c3:/# exit
exit

容器ID为:3b776d7e84c3

现在可以创建一个新的镜像了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
monkee@ubuntu:~$ sudo docker commit -m "add a test file" -a "Docker test" 3b776d7e84c3 test
879f386d63fcf1c7b7a9c5550970bf4cc06b66241a3f61d3ce4dae24b49ae86b #返回新创建镜像的ID信息
monkee@ubuntu:~$ sudo docker images #查看新创建的镜像
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test latest 879f386d63fc 2 minutes ago 187.9 MB
ubuntu 14.04 e9ae3c220b23 2 weeks ago 187.9 MB
ubuntu latest e9ae3c220b23 2 weeks ago 187.9 MB
ubuntu 13.04 e754e00b59af 17 months ago 169.4 MB

monkee@ubuntu:~$ sudo docker run -t -i test:latest /bin/bash
root@f57c9ec148db:/# ls
bin dev home lib64 mnt proc run srv test usr
boot etc lib media opt root sbin sys tmp var
root@f57c9ec148db:/# cat test
this is a test :)

2)基于本地模板创建
首先,从OpenVZ下载模板here

然后,解压倒入方可

1
sudo cat ubuntu-15.04-x86_64-minimal.tar.gz | docker import - ubuntu:15.04

  • 存出和载入镜像
1
2
3
4
5
6
7
#存出镜像
sudo docker save -o ubuntu-test.tar test:latest

#载入镜像
sudo docker load --input ubuntu-test.tar
or
sudo docker load < ubuntu-test.tar

3)使用Dockerfile创建镜像
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建镜像。

容器

容器与虚拟机一样也是隔离的,它们都拥有这一个唯一标识自己的ID和名字。容器需要对外提供服务,所以Docker允许容器公开容器的特定端口。

Docker容器

  • 创建容器
1
2
3
4
5
6
monkee@ubuntu:~$ sudo docker create -it test:latest
[sudo] password for monkee:
20eaf1df8114e74bd93dac72d4abcd34ccf07f68887c1e20f9bf4d417ce6f769
monkee@ubuntu:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20eaf1df8114 test:latest "/bin/bash" 23 seconds ago Created amazing_engelbart

对于终止状态的容器,可以通过命令sudo docker ps -a -q命令查看
通过sudo docker start 20e来启动上述新建的容器;
通过sudo docker stop 20e来终止上述新建的容器。

  • 新建并启动容器
1
2
#开启一个bash终端
sudo docker -t -i unbuntu:14.04 /bin/bash

其中

-t 选项是让Docker分配一个伪终端
-i选项是让容器的标准输入保持打开
另外,-d 容器守护态运行

  • 进入容器

对于使用-d选项进入后台运行的容器,有时需要进入容器进行操作。

1)使用attack命令

1
2
3
4
5
6
7
8
9
monkee@ubuntu:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
monkee@ubuntu:~$ sudo docker run -idt test:latest
aabf150e0fb3900f0e1854a83a9c92375275f3e24c026315926b580a7ffe5568
monkee@ubuntu:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aabf150e0fb3 test:latest "/bin/bash" 8 seconds ago Up 6 seconds compassionate_jones
monkee@ubuntu:~$ sudo docker attach compassionate_jones
root@aabf150e0fb3:/#

2)使用exec命令

1
2
3
4
5
6
monkee@ubuntu:~$ sudo docker ps 
[sudo] password for monkee:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
670f5153659c test:latest "/bin/bash" 13 hours ago Up 13 hours happy_hawking
monkee@ubuntu:~$ sudo docker exec -ti happy_hawking /bin/bash
root@670f5153659c:/#

  • 删除容器
1
sudo docker rm [container id]
  • 查看本机存在的所有容器
1
sudo docker ps -a #查看本机存在的所有容器

仓库

仓库分私有仓库和公共仓库,Docker官方提供并维护了一个公共仓库:https://hub.docker.com/

Docker Pool是国内专业的Docker技术社区,也提供镜像下载服务。

对于私有仓库,可以通过该Docker提供的registry镜像来搭建简单的私有仓库。

数据

容器中的数据一般需要备份、恢复操作,容器和主机以及容器和容器之间需要进行数据交互。
容器中管理数据有两种方式:

  • 数据卷(Data Volumes)
  • 数据卷容器(Data Volume Containers)

数据卷

数据卷是一个可提供容器使用的特殊目录,其保存在运行Docker的宿主机的文件系统上。
数据卷的使用相当于Linux下的mount

  • 创建一个数据卷

docker run命令后加-v选项可以创建一个数据卷,多次使用-v可以创建多个数据卷。

1
2
3
4
5
6
7
8
9
10
#使用training/webapp镜像创建一个容器,并在容器内/webapp目录下创建一个数据卷
sudo docker run -d -P --name web -v /webapp training/webapp python app.py

#挂载一个主机目录最为数据卷,例如将主机的/src/webapp目录挂载到容器的/opt/webapp,目录默认可读写
sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

#目录的权限也可以设定为只读
sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

#也可以挂载一个主机文件作为数据卷

-P选项是运行外部访问容器提供的服务端口

数据卷容器

数据卷容器其实就是一个专门提供数据卷的普通容器。一般应用于容器之间共享持续更新的数据的情景。

创建一个名为dbdata的数据卷容器,并挂载到/dbdata

1
sudo docker run -it -v /dbdata --name dbdata ubuntu

创建容器并使用--volumes-from来挂载dbdata容器中的数据卷

1
sudo docker run -it --volumes-from dbdata --name db1 ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建数据卷容器dbdata
monkee@ubuntu:~$ sudo docker run -i -t -v /dbdata --name dbdata ubuntu:14.04
root@03dc8fef808f:/# ls
bin dbdata etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var

#创建db1容器,并挂载dbdata容器
monkee@ubuntu:~$ sudo docker run -it --volumes-from dbdata --name db1 ubuntu:14.04
[sudo] password for monkee:
root@c20f50dc54fd:/#

#创建db2容器,并挂载dbdata容器
monkee@ubuntu:~$ sudo docker run -it --volumes-from dbdata --name db2 ubuntu:14.04
[sudo] password for monkee:
root@a71fc85d1451:/#

#在容器db1中的/dbdata目录创建test文件
root@c20f50dc54fd:/# touch /dbdata/test
root@c20f50dc54fd:/# echo "test fun :)">/dbdata/test
root@c20f50dc54fd:/# cat /dbdata/test
test fun :)

#在容器db2和数据卷容器dbdata中可以查看到共享文件test
root@a71fc85d1451:/# cat /dbdata/test
test fun :)

root@03dc8fef808f:/# cat /dbdata/test
test fun :)

多次使用--volumes-from可以从多个容器挂载多个数据卷,同时也可以从已挂载的容器挂载数据卷

1
2
3
4
5
6
monkee@ubuntu:~$ sudo docker run -it --volumes-from db1 --name db3 ubuntu:14.04[sudo] password for monkee: 
root@ae89fcba3b48:/# ls
bin dbdata etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
root@ae89fcba3b48:/# cat dbdata/test
test fun :)

备份和恢复

备份操作如下

1
2
3
4
5
6
7
monkee@ubuntu:~$ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu:14.04 tar cvf /backup/backup.tar /dbdata
tar: Removing leading `/' from member names
/dbdata/
/dbdata/test
monkee@ubuntu:~$ ls
backup.tar Documents examples.desktop Pictures Templates
Desktop Downloads Music Public Videos

恢复数据到一个容器如下

1
2
3
4
5
#新建一个带有数据卷的容器
sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

#再创建一个新容器,并挂载dbdata2
sudo docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar

网络

没个容器拥有一个私有的IP。

  • 端口映射

为实现端口映射,需要在docker run命令后加选项-p-P

1
sudo docker run -d -p localport:containerport ubuntu python server.py

通过多次使用-p选项可以映射多个端口。
若要指定特定的IP地址

1
sudo docker run -d -p ip:localport:containerport ubuntu python server.py

若localport缺省,则会映射到任意的本地端口。

查看映射端口

1
2
3
sudo docker port [containerNAME] [containerport]
or
sudo docker inspect containerID

  • 容器间互联

容器的名称是唯一的,可以使用--name选项自定义。
使用--link name:alias选项实现容器间互联,其中name为链接容器的名字,alias为这个链接的别名

1
2
3
4
5
#先新建一个容器
sudo docker run -d --name db Ubuntu

#然后再创建一个关联的容器
sudo docker run -d -P --name web --link db:webdb Ubuntu python sever.py

这样web容器就可以直接访问db容器了。如ping db

关于Docker的原理剖析后续再接上:)


参考

文章目录
  1. 1. Docker简介
  2. 2. Docker安装
  3. 3. 镜像
  4. 4. 容器
  5. 5. 仓库
  6. 6. 数据
    1. 6.1. 数据卷
    2. 6.2. 数据卷容器
    3. 6.3. 备份和恢复
  7. 7. 网络
  8. 8. 参考