Docker概述
Docker是基于Go语言开发的容器管理工具,而且抽象级别比lxc这些管理工具高,目前官方默认通过libcontainer管理容器。lxc是一些kernel patch(namespaces)和userspace tool(cgroup)的集合,通过cgroup这个用户态管理工具实现对隔离资源的管理。Docker相比LXC增加了镜像服务(通过UnionFS和DeviceMapper),同时简化了操作复杂度,可以很方便实现应用分发部署,甚至是扩容。目前也有一些周边管理工具(Compose、Flocker、weaver)在创新,在docker基础上实现更多实用功能,如迁移,流程编排,网络管理等。跟openstack相比,docker更年轻,也更轻量级,但两者在某些场景下又可以很好结合起来,比如通过docker将openstack的管理节点实现高可用、可扩展。
docker的部署在发行版上比较简单,但对内核版本有不同要求,比如在centos6.5上要求内核版本至少2.6.32-431。
1 2 3 4 5
| $ yum install -y docker-io $ chkconfig docker on $ service docker start $ docker run -it ubuntu /bin/bash $ docker info
|
Docker基本用法
基本命令使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| $ docker run ubuntu:14.04 /bin/echo 'Hello world' $ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" $ docker ps -a $ docker logs instance_name $ docker logs -f instance_name $ docker stop/start/restart instance_name $ docker ps -aq | xargs docker rm $ docker images # -tree参数可以看层级关系,最大128层 $ docker save -o ubuntu.tar ubuntu:14.04 $ tar -tf ubuntu.tar $ docker rmi ubuntu $ docker run -d -P training/webapp python app.py $ docker port instance_name 5000 $ docker run -d -p 5000:5000 training/webapp python app.py $ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py $ docker top instance_name $ docker inspect instance_name $ docker inspect -f '{{ .NetworkSettings.IPAddress }}' instance_name $ docker pull centos $ docker commit -m "some modify hints" -a "author info" contain_id repo_name/image_name:tags $ docker tag container_id repo_name/image_name:tags $ docker exec -it CONTAINER_NAME /bin/bash
|
使用Dockerfile创建image
mkdir myimage && cd $_ && vim Dockerfile
:
1
| # This is a comment
FROM ubuntu:14.04
MAINTAINER Promise John <promise.jon@gmail.com>
RUN apt-get update && apt-get install -y nginx
|
使用Linking
Docker主要通过环境变量和/etc/hosts
文件来提供访问途径:
1 2 3 4 5 6
| $ docker run -d --name db training/postgres $ docker run -d -P --name web --link db:db training/webapp python app.py $ docker inspect -f "{{ .Name }}" instance_id $ docker inspect -f "{{ .HostConfig.Links }}" web $ docker run --rm --name web2 --link db:db training/webapp env $ docker run --rm --name web2 --link db:db training/webapp cat /etc/hosts
|
Storage
主要包括独立的卷和共享本地文件系统:
1 2 3 4 5
| $ docker run -d -P --name web -v /webapp training/webapp python app.py $ docker inspect web $ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py $ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py $ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
|
Container间共享数据:
1 2 3 4 5
| $ docker create -v /dbdata --name dbdata training/postgres /bin/true $ docker run -d --volumes-from dbdata --name db1 training/postgres $ docker run -d --volumes-from dbdata --name db2 training/postgres $ docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata $ docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
|
Docker本地仓库
Docker Hub基本用法:
1 2 3 4
| $ docker search ubuntu $ docker pull ubuntu:14.04 $ docker login $ docker push yourname/newimage
|
配置本地的registry:
1 2 3 4 5 6 7 8 9
| $ docker run -d -p 5000:5000 registry $ docker tag ubuntu:14.04 localhost:5000/ubuntu:14.04 $ docker push localhost:5000/ubuntu:14.04 $ curl -v http://localhost:5000/v1/repositories/ubuntu/tags/14.04 $ docker run -d -p 5000:5000 \ -e STANDALONE=false \ -e MIRROR_SOURCE=https://registry-1.docker.io \ -e MIRROR_SOURCE_INDEX=https://index.docker.io \ registry
|
使用本地的registry:
可以使用--registry-mirror
参数启动:
1
| $ docker --registry-mirror=http://10.101.29.26 -d
|
Docker Compose
Docker Compose可以方便地实现应用的组合。
1 2
| $ pip install docker-compose $ mkdir compose && cd $_
|
增加app.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13
| from flask import Flask from redis import Redis import os app = Flask(__name__) redis = Redis(host='redis', port=6379)
@app.route('/') def hello(): redis.incr('hits') return 'Hello World! I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
|
增加requirements.txt
:
增加Dockerfile
:
1
| FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
|
增加docker-compose.yml
:
1
| web:
build: .
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis
|
启动并管理服务:
1 2 3 4
| $ docker-compose up -d $ docker-compose ps $ docker-compose run web env $ docker-compose stop
|
小结
Docker在快速应用分发、扩展等方面有很高的自动化能力,但是跟主机虚拟化一样,网络也是需要重点考虑的难点。默认情况下都是通过本地的一个bridge提供容器之间的通信,通过NAT为应用提供地址,一般的应用部署足以应付,但如果要实现更复杂的网络场景,如多主机上container组成大规模的L3负载均衡集群、应用无缝迁移等,还是需要大量的定制,目前这方面的周边产品开发比较活跃。
参考
- Official Docs
- Docker with aufs and devicemapper
- LXC Tools
- Docker Compose