docker初探

本文以搭建 caffe,tensorflow,opencv,ubuntu-14.04-core docker镜像的过程,简要说明docker工作流和一些入门级知识.

安装docker

linux各发行版详细安装教程 https://docs.docker.com/engine/installation/linux/ubuntulinux/

ubuntu

要求

64位,内核版本高于3.10

查看内核版本号

uname -r

安装方法

  • 更新源

    sudo apt-get update
    sudo apt-get install apt-transport-https ca-certificates

  • 更新GPG key

    sudo apt-key adv –keyserver hkp://p80.pool.sks-keyservers.net:80 –recv-keys 58118E89F3A912897C070ADBF76221572C52609D

  • 编辑文件 /etc/apt/sources.list.d/docker.list 删除文件中所有已存在的入口后,添加新入口

    On Ubuntu Precise 12.04 (LTS)

    deb https://apt.dockerproject.org/repo ubuntu-precise main

    On Ubuntu Trusty 14.04 (LTS)

    deb https://apt.dockerproject.org/repo ubuntu-trusty main

    Ubuntu Xenial 16.04 (LTS)

    deb https://apt.dockerproject.org/repo ubuntu-xenial main

  • 保存并退出

  • 更新,清除旧包,下载安装

    sudo apt-get update && sudo apt-get purge lxc-docker && apt-cache policy docker-engine

fedora

要求

64位,内核版本高于3.10

查看内核版本

uname -r

dnf安装

  • 更新

    sudo dnf update

  • 添加yum repo

    $ sudo tee /etc/yum.repos.d/docker.repo <<-‘EOF’
    [dockerrepo]
    name=Docker Repository
    baseurl=https://yum.dockerproject.org/repo/main/fedora/$releasever/
    enabled=1
    gpgcheck=1
    gpgkey=https://yum.dockerproject.org/gpg
    EOF

  • install

    sudo dnf install docker-engine

脚本安装

  • 更新

    sudo dnf update

  • 脚本安装

    curl -fsSL https://get.docker.com/ | sh

启动docker服务

根据不同发行版,进程管理程序不同,命令可能不同

允许服务

sudo systemctl enable docker.service

启动docker 守护进程

sudo systemctl start docker

测试安装,启动是否成功

sudo docker info

从docker hub下载镜像

寻找镜像

利用 sudo docker search 命令或者登陆DockerHub网站搜索 https://hub.docker.com/

从DockerHub下载镜像

  • 我们这里需要的镜像是 kaixhin/caffe,镜像的内容是 Ubuntu Core 14.04 + Caffe.

    sudo docker pull kaixhin/caffe

    命令后可选跟 :tag,默认tag为latest.

    可能需要为docker设代理 ubuntu下配置文件为/etc/default/docker,其他发行版本请参考官方教程

  • 查看镜像

    sudo docker images

从image创建container

以下是一条范例:

docker run -itd -p port1:port2 --name=cf -v /path/of/host:/path/of/container kaixhin/caffe /bin/bash

常用参数说明

-i interactive 交互式,container stdin读取键盘输入

-t tty,屏幕输出

-d detach,后台运行容器

-p 端口映射

–name 为容器命名,否则系统随机命名

-v volume,挂载host磁盘到容器下,可设置读写权限

kaixhin/caffe 镜像名

/bin/bash 容器初始完成后执行的命令

其他常用命令

  • 退出容器

    exit

  • 删除镜像

    sudo docker rmi image-name-or-id

  • 删除容器

    sudo docker rm container-name-or-id

  • 查看正在运行的容器

    sudo docker ps

  • 进入后台运行的容器

    sudo docker attach container-name-or-id

  • 查看所有容器

    sudo docker ps -a

  • 重启停止的容器

    sudo docker restart container-name-or-id

创建你的镜像

方法有二:

  • From a container

  • From a Dockerfile

Dockerfile

类似makefile,方便实现自动化

新建文件夹,在文件夹新建Dockerfile

FROM kaixhin/caffe:latest
MAINTAINER xxx
RUN pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

创建镜像

sudo docker build -t caffe-tensorflow .

这样理论上便构建了一个新安装了tensorflow的镜像.

但由于还要源码安装opencv,以及pip代理的问题,采用下一种方法安装

更多Dockerfile的作用,命令,及其最佳实践可参考 https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/

从container打包生成新镜像

  • 运行caffe镜像,生成新容器

    sudo docker run -it –name=caffe-tensorflow-opencv -v /dir/of/host:/dir/of/container kaixhin/caffe /bin/bash

  • 我将opencv的源码,和host机中的python package放入/dir/of/host中(这样是为更快,也可pip重新安装tensorflow等)

  • 将python package cp到container中的python package下

  • 编译安装opencv,参见opencv官网cmake安装即可

  • 退出容器

    exit

  • 创建镜像

查看container-id

sudo docker ps -a

打包镜像

sudo docker commit -m='message' -a='author' container-id fangpin/caffe_tensorflow_opencv

最后一个参数名为导出的镜像名字,为push 到Dockerhub方便,可以加上你Dockerhub的用户名前缀.

  • 查看新镜像信息

    sudo docker inspect fangpin/caffe_tensorflow_opencv

镜像的管理和分发

  • docker regisitry

  • 本地分发

Dockerhub

  • 下载镜像

    sudo docker pull image-name

  • 上传镜像

    登陆

    sudo docker login

    提交 + image-name

    sudo docker push fangpin/caffe_tensorflow_opencv

本地分发

导出

sudo docker save > /path/to/image.docker

分发

通过ftp等分发到目的host机中

导入

sudo docker load < /path/to/image.docker

理解image,container,layer的概念

layer

docker的文件系统称作unionFS,是一种特殊的文件系统。它像栈一样由一层一层的layer组成。比如前文中提到的image fangpin/caffe_tensorflow_opencv就是由 数层layer组成,最底层是ubuntu image的layer,在这个image上build好caffe构成一个新的image,则新的image相当于在之前的image的layer stack上新增加 了一层caffe的layer,再在上面依次添加tensorflow和opencv的layer就构成了我最终需要的镜像。

docker server daemon确保了上述文件系统对外表现的一致性。

docker为满足跨平台性,提供了多种不同的fs driver,如aufs,vfs等,没有万能的driver,针对不同任务各种driver各有优缺点,一般使用在安装docker时docker为你指定的默认driver就行了。更多进阶的选择需求可以参考docker官方的user guide。

layer的思想是docker 保持运行高效,空间节约的关键技术,docker中无处不在使用这一关键技术。

docker会为各层layer产生一个基于layer内容的hash值作为layer的id,即一个 layer内容到id 的一一对应。以此来实现layer的复用。

例如,你的host机中有多个docker的image中都建立在ubuntu上,这几个image中的ububtu layer层会使用相同host机磁盘空间,这极大的节约了磁盘空间。

上述特性的实现需要满足image各层的layer不可修改,即为只读。否则一个image修改了一层共享的layer就乱套了。想要理解以上问题的解决办法,还要 进一步理解image和container的概念。

image

image由数层只读的layer构成,不可修改.

container

container是一个image的实例.一个image可以创建多个实例,即多个container.1个image产生的多个container的layer栈的下方同为image的只读layer,因为只读,可以共享.因此极大节约了磁盘空间.

一个container是在其image的只读layer栈上加了一层可读写的layer,一切对container的操作发生在这一层layer上.

如果需要修改container中属于image只读layer层的内容,docker使用的是copy and write机制.

你可能感兴趣的:(docker初探)