频道栏目
首页 > 网络 > 云计算 > 正文
docker初探
2017-01-11 11:08:00         来源:方品  
收藏   我要投稿
本文以搭建 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机制.

点击复制链接 与好友分享!回本站首页
上一篇:SkyDNS2源码分析
下一篇:CentOS7从零开始搭建Hadoop2.7集群
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站