[TOC]
1.基本概念
Docker 包括三个基本概念
镜像(
Image
)Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会改变。
容器(
Container
)容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(
Repository
)一个集中的存储、分发镜像的服务。
理解了这三个概念,就理解了 Docker 的整个生命周期。
2.docker安装
1 | #ubuntu |
3.docker命令
a、镜像相关
1 | docker image --help |
1.docker images
列出主机上已存在镜像
1 | $ docker images |
2.docker pull
下载新的镜像文件, 公共的image可在docker hub上查找
1 | $ docker pull deepchemio/deepchem:2.0.0-cpu |
3.docker push
推送本地主机上的镜像(image)到仓库(Repository)中 。
1 | $ docker push hooby/deepchem:2.0.0-cpu |
4.docker rmi
删除本地镜像
1 | docker rmi hooby/deepchem:2.0.0-cpu |
5.docker save
将本地image保存为一个压缩包
1 | docker save hooby/deepchem:2.0.0-cpu -o deepchem.tar |
6.docker load
导入image
1 | docker load -i deepchem.tar |
7.docker history
查看image构建过程中的命令历史
1 | docker history deepchemio/deepchem:2.0.0-cpu |
8.docker inspect
查看image的元数据信息
1 | $ docker inspect deepchemio/deepchem:2.0.0-cpu |
9.docker tag
从现有的image中创建一个新的tag标签
1 | docker image tag deepchemio/deepchem:2.0.0-cpu hooby/deepchem-cpu |
这样 deepchemio/deepchem:2.0.0-cpu
和 hooby/deepchem-cpu
其实内容是一样的,只是名字不一样而已。
10.docker build
通过dockerfile,构建image.
1 | docker build -t alex/deepchem:v1.0 . |
###b、容器相关
1 | docker container --help |
常用参数
1 | -it #以交互模式执行 |
1.docker ps
显示container
1 | $ docker ps #显示正在运行状态下的container |
2.docker run
从image启动,运行一个container
1 | docker run deepchemio/deepchem:2.0.0-cpu |
3.docker stop
停掉一个正在运行的container
1 | docker stop deepchem |
4.docker rm
删除停掉的container
1 | docker rm deepchem |
5.docker start
启动停掉的container
1 | docker start deepchem |
6.docker restart
重启或者启动停掉的container
1 | docker restart deepchem |
7.docker exec
在运行中的container中执行命令
1 | docker exec -it --user 0 deepchem bash |
8.docker commit
将container构建成一个image
1 | docker commit deepchem alex_deepchem |
9.docker rename
修改container的name
1 | docker rename deepchem deepchem-cpu |
10.docker port
显示container映射的端口
1 | $ docker port crossbar-test |
11.docker cp
复制主机文件到container中,或者从container中复制文件到主机目录。
1 | docker cp test.file deepchem:/tmp |
12.docker logs
查看container运行输出信息
1 | docker logs crossbar |
13.docker top
查看docker中的进程
1 | $ docker top deepchem-cpu |
14.docker container prune
移除所有停掉的container
4.Dockerfile定制镜像
Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
以定制 nginx
镜像为例,在一个空白目录中,建立一个文本文件,并命名为 Dockerfile
:
1 | $ mkdir mynginx |
Dockerfile内容为:
1 | FROM nginx |
这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM
和 RUN
。
再使用构建image命令,生成mynginx:v1
镜像
1 | $ docker build -t mynginx:v1 . |
对于最后这个.
的理解可以参考这里。简单来说就是除了Dockerfile和构建image需要用的文件,不要在这里放其他文件。
FROM 指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。而 FROM
就是指定基础镜像,因此一个 Dockerfile
中 FROM
是必备的指令,并且必须是第一条指令 。
在 Docker Store 上有非常多的高质量的官方镜像,可以直接拿来使用或者作为基础镜像。
RUN 执行命令
RUN
指令是用来执行命令行命令的。RUN
指令在定制镜像时是最常用的指令之一。其格式有两种:
- shell 格式:
RUN <命令>
,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的RUN
指令就是这种格式。
1 | RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html |
- exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
,这更像是函数调用中的格式。
COPY 复制文件
COPY
指令将从构建上下文目录中 <源路径>
的文件/目录复制到新的一层的镜像内的 <目标路径>
位置。比如:
1 | COPY package.json /usr/src/app/ |
格式:
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
CMD 容器启动命令
在启动容器的时候,需要指定所运行的程序及参数。CMD
指令就是用于指定默认的容器主进程的启动命令的。
CMD
指令的格式和 RUN
相似,也是两种格式:
shell
格式:CMD <命令>
exec
格式:CMD ["可执行文件", "参数1", "参数2"...]
- 参数列表格式:
CMD ["参数1", "参数2"...]
。在指定了ENTRYPOINT
指令后,用CMD
指定具体的参数。
ENV 设置环境变量
设置环境变量,无论是后面的其它指令,如 RUN
,还是运行时的应用,都可以直接使用这里定义的环境变量。
1 | ENV VERSION=1.0 DEBUG=on NAME="Happy Feet" |
格式有两种:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
WORKDIR 指定工作目录
格式为 WORKDIR <工作目录路径>
。
使用 WORKDIR
指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR
会帮你建立目录。
USER 指定当前用户
USER
切换到指定用户,这个用户必须是事先建立好的,否则无法切换。
1 | RUN groupadd -r redis && useradd -r -g redis redis |
格式:USER <用户名>
USER
指令和 WORKDIR
相似,都是改变环境状态并影响以后的层。WORKDIR
是改变工作目录,USER
则是改变之后层的执行 RUN
, CMD
以及 ENTRYPOINT
这类命令的身份。
5.集群docker使用
好处
1、速度快
2、节省带宽
3、属于私有,可以不公开
查看集群已经拥有的docker镜像
1 | curl http://172.16.10.10:5000/v2/_catalog|python2 -m json.tool |
查看集群已拥有的docker镜像有哪些tag
1 | curl http://172.16.10.10:5000/v2/paddlepaddle/paddle/tags/list|python2 -m json.tool |
集群docker镜像下载方法
1 | docker pull 172.16.10.10:5000/paddlepaddle/paddle:0.10.0 |
集群docker镜像上传方法
1 | docker push 172.16.10.10:5000/python:2.7 |
6.一些补充
构建出来的image有些不是基于centos
或者ubuntu
的,而是Alpine 。
docker pull
的时候注意查看tag,例如nvidia/cuda
就有众多不同的tags: https://hub.docker.com/r/nvidia/cuda/tags/
不同系统安装软件包的命令也有所不同:
1 | centos: yum install app |
相关资源
docker
入门:https://yeasy.gitbooks.io/docker_practice/content/docker hub
: https://hub.docker.com/docker docs
: https://docs.docker.com/Alpine
官网:http://alpinelinux.org/Alpine
官方仓库:https://github.com/alpinelinuxAlpine
官方镜像:https://hub.docker.com/_/alpine/Alpine
官方镜像仓库:https://github.com/gliderlabs/docker-alpine