linux各发行版详细安装教程 https://docs.docker.com/engine/installation/linux/ubuntulinux/
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 删除文件中所有已存在的入口后,添加新入口
deb https://apt.dockerproject.org/repo ubuntu-precise main
deb https://apt.dockerproject.org/repo ubuntu-trusty main
deb https://apt.dockerproject.org/repo ubuntu-xenial main
保存并退出
更新,清除旧包,下载安装
sudo apt-get update && sudo apt-get purge lxc-docker && apt-cache policy docker-engine
64位,内核版本高于3.10
查看内核版本
uname -r
更新
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
根据不同发行版,进程管理程序不同,命令可能不同
sudo systemctl enable docker.service
sudo systemctl start docker
sudo docker info
利用 sudo docker search 命令或者登陆DockerHub网站搜索 https://hub.docker.com/
我们这里需要的镜像是 kaixhin/caffe,镜像的内容是 Ubuntu Core 14.04 + Caffe.
sudo docker pull kaixhin/caffe
查看镜像
sudo docker images
以下是一条范例:
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
类似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/
运行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
本地分发
下载镜像
sudo docker pull image-name
上传镜像
sudo docker login
sudo docker push fangpin/caffe_tensorflow_opencv
sudo docker save > /path/to/image.docker
通过ftp等分发到目的host机中
sudo docker load < /path/to/image.docker
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由数层只读的layer构成,不可修改.
container是一个image的实例.一个image可以创建多个实例,即多个container.1个image产生的多个container的layer栈的下方同为image的只读layer,因为只读,可以共享.因此极大节约了磁盘空间.
一个container是在其image的只读layer栈上加了一层可读写的layer,一切对container的操作发生在这一层layer上.
如果需要修改container中属于image只读layer层的内容,docker使用的是copy and write机制.