Docker vs Vagrant

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

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

Build RBE Image

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

Run It

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

Util

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

Dockerfile

FROM

指定base image

MAINTAINER

Author信息

LABEL

描述性的,不重要

RUN

运行一些命令

CMD

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

ENV

设置环境变量

Attach or Exec

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

  1. docker attach <CID or name>
  2. 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挂载数据容器

删除无效镜像

docker rmi $(docker images -f "dangling=true" -q)

FROM scratch

  1. From Ubuntu:18.04
  2. Do something, build code or something
  3. From scratch
  4. COPY build code /usr/local/bin/xxx

Tip

  • docker —restart always 可以自动重启
  • 清理 docker system prune —force