Matthew Note

Docker

Docker vs Vagrant

为了解决固件编译环境的种种问题,我们尝试了使用vagrant来创建一个编译环境的镜像,但是vagrant基于VM的实现导致了对于宿主机的要求很高,同时编译多个release耗费相当多的系统资源,并且严重拖慢编译速度。

所以我考虑用Docker来替代vagrant,Docker提供了足够的隔离,所以可以像一个虚拟机一样运行,但是非常轻且高效,能满足所有编译环境的需求。

Build RBE Image

1
2
3
4
# Build a docker image
`mkdir docker-builder && cd docker-builder`
`rsync -av this_Dockerfile .`
`docker build -t release_name .`

Run It

1
2
3
4
5
# Run this docker image
`docker run -itd -v tip_on_host:tip_on_container /bin/bash`
# Access to the console
`docker attach <CID or name>` or `docker exec -it <CID or name>`

Util

1
2
3
4
5
# How to get the CID or name
`docker ps`
# List all the image which avaiable in your host
`docker images`

Dockerfile

FROM

指定base image

MAINTAINER

Author信息

LABEL

描述性的,不重要

RUN

运行一些命令

CMD

每个container时候启动的,只能有一个

ENV

设置环境变量

Attach or Exec

我们有两种方式来attach到container的TTY

1
2
docker attach <CID or name>
docker exec -it <CID>

Attach会有个问题是如果从container中exit,那么container会被结束,而exec不会,但是exec每次执行会返回一个exit code,因为他是stdout到了stdin来得到tty结果的

配置文件

/etc/default/docker管理docker所有启动的配置

1
echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker

网络

docker的网络依赖于一个linux网桥docker0, 所以你也可以使用自己建立的网桥来处理docker container之间的网络

存储

docker支持建立数据容器,那么正常的容易可以通过--volume-from挂载数据容器