本文首發(fā):http://m0nkee.github.io/2015/11/30/about-docker/
Docker簡介
Docker可以解決虛擬機能夠解決的問題,同時也能夠解決虛擬機由于資源要求過高而無法解決的問題。Docker能處理的事情包括:
- 隔離應(yīng)用依賴
- 創(chuàng)建應(yīng)用鏡像并進行復(fù)制
- 創(chuàng)建容易分發(fā)的即啟即用的應(yīng)用
- 允許實例簡單、快速地擴展
- 測試應(yīng)用并隨后銷毀它們
Docker三大核心概念
- 鏡像 image :類似于虛擬機的快照,但更輕量。
- 容器 container :鏡像的一個運行實例,可以獨立運行一個或一組應(yīng)用。
- 倉庫 repository :集中存放鏡像的地方
Docker安裝
OS:Ubuntu 14.04 #主要docker 默認為64位系統(tǒng),32位會出現(xiàn)問題
要求kernel >= 3.8,若不滿足執(zhí)行下面操作
#安裝內(nèi)核
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
#重啟
sudo reboot
- 添加docker的repository到本地密鑰庫
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
- 將Docker添加到你的apt軟件安裝源中,然后update和install lxc-docker
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
鏡像
- 獲取鏡像
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
- 使用鏡像創(chuàng)建一個容器
sudo docker run -t -i ubuntu /bin/bash
- 查看鏡像信息
sudo docker images
#添加新標(biāo)簽
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,以及一個供人閱讀的名字和標(biāo)簽對。鏡像可以命名為類似ubuntu:latest、ubuntu:14.04等。
image id相同說明標(biāo)簽指向了同一個鏡像文件。
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
}
}
]
- 搜索鏡像
#搜索帶關(guān)鍵字的鏡像
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]
- 刪除鏡像
sudo docker rmi [TAG | IMAGE ID]
注意
刪除鏡像前先要刪除依賴該鏡像的所有容器。
- 創(chuàng)建鏡像
三種方法:基于已有鏡像的容器創(chuàng)建、基于本地模板導(dǎo)入、基于Dockerfile創(chuàng)建
1). 基于已有鏡像的容器創(chuàng)建
首先啟動一個鏡像,并進行修改
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
現(xiàn)在可以創(chuàng)建一個新的鏡像了
monkee@ubuntu:~$ sudo docker commit -m "add a test file" -a "Docker test" 3b776d7e84c3 test
879f386d63fcf1c7b7a9c5550970bf4cc06b66241a3f61d3ce4dae24b49ae86b #返回新創(chuàng)建鏡像的ID信息
monkee@ubuntu:~$ sudo docker images #查看新創(chuàng)建的鏡像
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)2.基于本地模板創(chuàng)建
首先,從OpenVZ下載模板here。
然后,解壓倒入方可
sudo cat ubuntu-15.04-x86_64-minimal.tar.gz | docker import - ubuntu:15.04
- 存出和載入鏡像
#存出鏡像
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創(chuàng)建鏡像
Dockerfile是一個文本格式的配置文件,用戶可以使用Dockerfile來快速創(chuàng)建鏡像文件。
容器
容器與虛擬機一樣也是隔離的,它們都擁有這一個唯一標(biāo)識自己的ID和名字。容器需要對外提供服務(wù),所以Docker允許容器公開容器的特定端口。

- 創(chuàng)建容器
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
對于終止?fàn)顟B(tài)的容器,可以通過命令sudo docker ps -a -q命令查看
通過sudo docker start 20e來啟動上述新建的容器;
通過sudo docker stop 20e來終止上述新建的容器。
- 新建并啟動容器
#開啟一個bash終端
sudo docker -t -i unbuntu:14.04 /bin/bash
其中
-t選項是讓Docker分配一個偽終端
-i選項是讓容器的標(biāo)準輸入保持打開
另外,-d容器守護態(tài)運行
- 進入容器
對于使用-d選項進入后臺運行的容器,有時需要進入容器進行操作。
1)1. 使用attack命令
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命令
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:/#
- 刪除容器
sudo docker rm [container id]
- 查看本機存在的所有容器
sudo docker ps -a #查看本機存在的所有容器
倉庫
倉庫分私有倉庫和公共倉庫,Docker官方提供并維護了一個公共倉庫:https://hub.docker.com/
Docker Pool是國內(nèi)專業(yè)的Docker技術(shù)社區(qū),也提供鏡像下載服務(wù)。
對于私有倉庫,可以通過該Docker提供的registry鏡像來搭建簡單的私有倉庫。
數(shù)據(jù)
容器中的數(shù)據(jù)一般需要備份、恢復(fù)操作,容器和主機以及容器和容器之間需要進行數(shù)據(jù)交互。
容器中管理數(shù)據(jù)有兩種方式:
- 數(shù)據(jù)卷(Data Volumes)
- 數(shù)據(jù)卷容器(Data Volume Containers)
數(shù)據(jù)卷
數(shù)據(jù)卷是一個可提供容器使用的特殊目錄,其保存在運行Docker的宿主機的文件系統(tǒng)上。
數(shù)據(jù)卷的使用相當(dāng)于Linux下的mount。
- 創(chuàng)建一個數(shù)據(jù)卷
在docker run命令后加-v選項可以創(chuàng)建一個數(shù)據(jù)卷,多次使用-v可以創(chuàng)建多個數(shù)據(jù)卷。
#使用training/webapp鏡像創(chuàng)建一個容器,并在容器內(nèi)/webapp目錄下創(chuàng)建一個數(shù)據(jù)卷
sudo docker run -d -P --name web -v /webapp training/webapp python app.py
#掛載一個主機目錄最為數(shù)據(jù)卷,例如將主機的/src/webapp目錄掛載到容器的/opt/webapp,目錄默認可讀寫
sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
#目錄的權(quán)限也可以設(shè)定為只讀
sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
#也可以掛載一個主機文件作為數(shù)據(jù)卷
-P選項是運行外部訪問容器提供的服務(wù)端口
數(shù)據(jù)卷容器
數(shù)據(jù)卷容器其實就是一個專門提供數(shù)據(jù)卷的普通容器。一般應(yīng)用于容器之間共享持續(xù)更新的數(shù)據(jù)的情景。
創(chuàng)建一個名為dbdata的數(shù)據(jù)卷容器,并掛載到/dbdata上
sudo docker run -it -v /dbdata --name dbdata ubuntu
創(chuàng)建容器并使用--volumes-from來掛載dbdata容器中的數(shù)據(jù)卷
sudo docker run -it --volumes-from dbdata --name db1 ubuntu
# 創(chuàng)建數(shù)據(jù)卷容器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
#創(chuàng)建db1容器,并掛載dbdata容器
monkee@ubuntu:~$ sudo docker run -it --volumes-from dbdata --name db1 ubuntu:14.04
[sudo] password for monkee:
root@c20f50dc54fd:/#
#創(chuàng)建db2容器,并掛載dbdata容器
monkee@ubuntu:~$ sudo docker run -it --volumes-from dbdata --name db2 ubuntu:14.04
[sudo] password for monkee:
root@a71fc85d1451:/#
#在容器db1中的/dbdata目錄創(chuàng)建test文件
root@c20f50dc54fd:/# touch /dbdata/test
root@c20f50dc54fd:/# echo "test fun :)">/dbdata/test
root@c20f50dc54fd:/# cat /dbdata/test
test fun :)
#在容器db2和數(shù)據(jù)卷容器dbdata中可以查看到共享文件test
root@a71fc85d1451:/# cat /dbdata/test
test fun :)
root@03dc8fef808f:/# cat /dbdata/test
test fun :)
多次使用--volumes-from可以從多個容器掛載多個數(shù)據(jù)卷,同時也可以從已掛載的容器掛載數(shù)據(jù)卷
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 :)
備份和恢復(fù)
備份操作如下
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
恢復(fù)數(shù)據(jù)到一個容器如下
#新建一個帶有數(shù)據(jù)卷的容器
sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
#再創(chuàng)建一個新容器,并掛載dbdata2
sudo docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
網(wǎng)絡(luò)
沒個容器擁有一個私有的IP。
- 端口映射
為實現(xiàn)端口映射,需要在docker run命令后加選項-p或-P。
sudo docker run -d -p localport:containerport ubuntu python server.py
通過多次使用-p選項可以映射多個端口。
若要指定特定的IP地址
sudo docker run -d -p ip:localport:containerport ubuntu python server.py
若localport缺省,則會映射到任意的本地端口。
查看映射端口
sudo docker port [containerNAME] [containerport]
or
sudo docker inspect containerID
- 容器間互聯(lián)
容器的名稱是唯一的,可以使用--name選項自定義。
使用--link name:alias選項實現(xiàn)容器間互聯(lián),其中name為鏈接容器的名字,alias為這個鏈接的別名
#先新建一個容器
sudo docker run -d --name db Ubuntu
#然后再創(chuàng)建一個關(guān)聯(lián)的容器
sudo docker run -d -P --name web --link db:webdb Ubuntu python sever.py
這樣web容器就可以直接訪問db容器了。如ping db。
關(guān)于Docker的原理剖析后續(xù)再接上:)