镜像管理
build
用法:docker build [OPTIONS] PATH | URL | -
功能:使用指定路径中的Dockerfile生成构建一个新的image
选项:常用选项参数如下,更多选项可以查看docker help build
表 4 参数说明
Dockerfile介绍:
Dockerfile是一个镜像的表示,可以通过Dockerfile来描述构建镜像的步骤,并自动构建一个容器,所有的 Dockerfile 命令格式都是:INSTRUCTION arguments
FROM命令
格式:FROM <image> 或 FROM <image>:<tag>
功能:该命令指定基本镜像,是所有Dockerfile文件的第一个命令,如果没有指定基本镜像的tag,使用默认tag名latest。
RUN命令
格式:RUN <command> (the command is run in a shell - `/bin/sh -c`) 或者
RUN ["executable", "param1", "param2" ... ] (exec form)
功能:RUN命令会在上面FROM指定的镜像里执行指定的任何命令,然后提交(commit)结果,提交的镜像会在后面继续用到。RUN命令等价于:
docker run image command
docker commit container_id
注释
使用"#"注释
MAINTAINER命令
格式:MAINTAINER <name>
功能:命令用来指定维护者的姓名和联系方式
ENTRYPOINT命令
格式:ENTRYPOINT cmd param1 param2 ... 或者ENTRYPOINT ["cmd", "param1", "param2"...]
功能:设置在容器启动时执行命令
USER命令
格式:USER name
功能:指定 memcached 的运行用户
EXPOSE命令
格式:EXPOSE <port> [<port>...]
功能:开放镜像的一个或多个端口
ENV命令
格式:ENV <key> <value>
功能:设置环境变量,设置了后,后续的RUN命令都可以使用
ADD命令
格式:ADD <src> <dst>
功能:从src复制文件到container的dest路径,<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url,<dest> 是container中的绝对路径
VOLUME命令
格式:VOLUME ["<mountpoint>"]
功能:创建一个挂载点用于共享目录
WORKDIR命令
格式:workdir <path>
功能:配置RUN, CMD, ENTRYPOINT 命令设置当前工作路径可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令
CMD命令
格式:CMD ["executable","param1","param2"] (like an exec, preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (as a shell)
功能:一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效
ONBUILD命令
格式:ONBUILD [其它指令]
功能:后面跟其它指令,比如 RUN、COPY 等,这些指令,在当前镜像构建时并不会被执行,只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
下面是Dockerfile的一个完整例子,该Dockerfile将构建一个安装了sshd服务的image
FROM busybox
ENV http_proxy http://192.168.0.226:3128
ENV https_proxy https://192.168.0.226:3128
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
EXPOSE 22
ENTRYPOINT /usr/sbin/sshd -D
示例:
以上文的Dockerfile构建一个image
$ sudo docker build -t busybox:latest
通过以下命令可以看到这个生成的image:
docker images | grep busybox
history
用法:docker history [OPTIONS] IMAGE
功能:显示一个image的变化历史
选项:
-H, --human=true
--no-trunc=false 不对输出进行删减
-q, --quiet=false 只显示ID
示例:
$ sudo docker history busybox:test
IMAGE CREATED CREATED BY SIZE COMMENT
be4672959e8b 15 minutes ago bash 23B
21970dfada48 4 weeks ago 128MB Imported from -
images
用法:docker images [OPTIONS] [NAME]
功能:列出存在的image,不加选项时不显示中间的image
选项:
-a, --all=false 显示所有的镜像,
-f, --filter=[] 指定一个过滤值(i.e. 'dangling=true')
--no-trunc=false 不对输出进行删减
-q, --quiet=false 只显示ID
示例:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest e02e811dd08f 2 years ago 1.09MB
import
用法:docker import URL|- [REPOSITORY[:TAG]]
功能:把包含了一个rootfs的tar包导入为镜像。与docker export相对应。
选项:无
示例:
从上文介绍的docker export命令时导出的busybox.tar用docker import命令生成一个新的image
$ sudo docker import busybox.tar busybox:test
sha256:a79d8ae1240388fd3f6c49697733c8bac4d87283920defc51fb0fe4469e30a4f
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox test a79d8ae12403 2 seconds ago 1.3MB
load
用法:docker load [OPTIONS]
功能:把docker save出来的tar包重新加载一个镜像。与docker save相对应。
选项:
-i, --input=""
示例:
$ sudo docker load -i busybox.tar
Loaded image ID: sha256:e02e811dd08fd49e7f6032625495118e63f597eb150403d02e3238af1df240ba
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest e02e811dd08f 2 years ago 1.09MB
login
用法:docker login [OPTIONS] [SERVER]
功能:登录到一个镜像服务库,没有指定server时,默认登录到https://index.docker.io/v1/
选项:
-e, --email="" Email
-p, --password="" 密码
-u, --username="" 用户名
示例:
$ sudo docker login
logout
用法:docker logout [SERVER]
功能:从一个镜像服务器中登出,没有指定server时,默认登出https://index.docker.io/v1/
选项:无
示例:
$ sudo docker logout
pull
用法:docker pull [OPTIONS] NAME[:TAG]
功能:从一个镜像库(官方的或私有的)中拉取一个镜像
选项:
-a, --all-tags=false 下载一个镜像仓库的所有镜像(一个镜像仓库可以被打多个标签,比如一个busybox镜像库,可能有多个标签如busybox:14.04,busybox:13.10,busybox:latest等,使用-a选项后,将所有标签的busybox镜像拉取下来)
示例:
从官方镜像库中拉取nginx镜像
$ sudo docker pull nginx Using default tag: latest latest: Pulling from official/nginx 94ed0c431eb5: Pull complete 9406c100a1c3: Pull complete aa74daafd50c: Pull complete Digest: sha256:788fa27763db6d69ad3444e8ba72f947df9e7e163bad7c1f5614f8fd27a311c3 Status: Downloaded newer image for nginx:latest
拉取镜像时会检测所依赖的层是否存在,如果存在就用本地的层。
从私有镜像库中拉取镜像
从私有镜像库中拉取Fedora镜像,比如所使用的私有镜像库的地址是192.168.1.110:5000:
$ sudo docker pull 192.168.1.110:5000/fedora
push
用法:docker push NAME[:TAG]
功能:将一个image推送到镜像库中
选项:无
示例:
将一个image推送到私有镜像库192.168.1.110:5000中
将要推送的镜像打标签(docker tag命令将在下文介绍),本例中要推送的镜像为busybox:sshd
$ sudo docker tag ubuntu:sshd 192.168.1.110:5000/busybox:sshd
将打好标签的镜像推送到私有镜像库中
$ sudo docker push 192.168.1.110:5000/busybox:sshd
推送的时候会自动检测所依赖的层在镜像库中是否已存在,如果以存在,跳过该层。
rmi
用法:docker rmi [OPTIONS] IMAGE [IMAGE...]
功能:删除一个或多个镜像,如果一个镜像在镜像库中有多个标签,删除镜像的时候只是进行untag操作,当删除的是只有一个标签的镜像时,将依次删除所依赖的层。
选项:
-f, --force=false 强制删除image
--no-prune=false 不删除没有标签的父镜像
示例:
$ sudo docker rmi 192.168.1.110:5000/busybox:sshd
save
用法:docker save [OPTIONS] IMAGE [IMAGE...]
功能:保存一个image到一个tar包,输出默认是到STDOUT
选项:
-o, --output="" 输出到文件中而不是STDOUT
示例:
$ sudo docker save -o nginx.tar nginx:latest
$ ls
nginx.tar
search
用法:docker search [OPTIONS] TERM
功能:在镜像库中查找特定的镜像
选项:
--automated=false 显示自动构建的image
--no-trunc=false 不对输出进行删减
-s, --stars=0 只显示特定星级以上的image
示例:
在官方镜像库中搜寻nginx
$ sudo docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 11873 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1645 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 739 [OK] linuxserver/nginx An Nginx container, brought to you by LinuxS… 74 bitnami/nginx Bitnami nginx Docker Image 70 [OK] tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 51 [OK]
在私有镜像库中搜寻busybox,在私有镜像库中搜寻时要加上私有镜像库的地址
$ sudo docker search 192.168.1.110:5000/busybox
tag
用法:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
功能:将一个镜像打标签到一个库中
选项:
-f, --force=false 如果存在相同的tag名将强制替换原来的image
示例:
$ sudo docker tag busybox:latest busybox:test