如果我们试图传递-al选项给ls以显示更详细的信息:
$ docker docker run --rm ls -al container_linux.go:265: starting container process caused "exec: \"-al\": executable file not found in $PATH"根据docker run的语法我们试图让ls镜像执行-al命令代替默认命令, 这当然行不通。
用ENTRYPOINT代替CMD:
FROM ubuntu ENTRYPOINT ["ls"]
重新创建:
$ docker build -t ls:v2 . $ docker run --rm ls:v2 -al total 72 drwxr-xr-x 1 root root 4096 Jan 14 13:29 . drwxr-xr-x 1 root root 4096 Jan 14 13:29 .. -rwxr-xr-x 1 root root 0 Jan 14 13:29 .dockerenv drwxr-xr-x 2 root root 4096 Dec 1 21:53 bin drwxr-xr-x 2 root root 4096 Apr 12 2016 boot drwxr-xr-x 5 root root 340 Jan 14 13:29 devENTRYPOINT通常用于在执行容器CMD做一些准备工作, 比如官方redis镜像中:
FROM alpine:3.4 ... RUN addgroup -S redis && adduser -S -G redis redis ... ENTRYPOINT ["docker-entrypoint.sh"]
docker run --entrypoint CMD可以用来更改容器的ENTRYPOINT。
共享镜像现在我们已经了解如何构造自己的镜像,接下来的问题是如何将镜像分享给其它开发者或者部署到服务器。
docker exportdocker export命令用于导出容器的快照, 默认输出到标准输出流,需要将输出重定向到文件进行保存。
# format: docker export CONTAINER > TAR $ docker export my_ubuntu > my_ubuntu.tar或者使用-o或--output选项
$ docker export -o my_ubuntu.tar my_ubuntudocker export命令导出时会新建一个空白镜像然后将容器文件系统的内容写入,不包含容器基础镜像各层和tag等信息。
docker savedocker save用于将镜像存储为tar压缩包,默认导出到标准输出流需要重定向以写入文件
# format: docker save IMAGE > TAR $ docker save ubuntu > ubuntu.tar或者使用-o或--output选项
$ docker save -o ubuntu.tar ubuntudocker save命令会将镜像各层及其tag信息导出到文件。
docker importdocker import命令用于导入tar格式的快照,生成的镜像只有一层不导入各层和tag信息。
$ docker import my_ubuntu.tar my_ubuntu:v2该指令与docker export相对用于导入容器镜像,但也可以导入docker save生成的tar文件。
docker loaddocker load用于导入tar格式的镜像副本,导入时保留各层和tag等元数据, 因此不需要指定镜像名和tag。
默认从标准输入流导入:
$ cat ubuntu.tar | docker load或者使用-i或--input选项:
docker load -i ubuntu.tardocker load命令与docker save命令相对,因为缺少元数据不能导入docker export生成的tar文件。
Registry虽然docker支持以文件的形式导入导出镜像,但这种方式对于共享镜像来说仍十分不便。
Docker官方提供了一个registry镜像,我们可以使用它轻松搭建私有仓库。
$ mkdir registry $ docker run -d \ -p 5000:5000 \ -v registry:/var/lib/registry \ registry-v选项将./registry目录挂载到了容器中,这个目录将用来实际存储镜像。
docker默认采用HTTPS方式推送和拉取镜像,本文不再介绍如何为私有仓库配置HTTPS证书。
私有仓库可以配置权限认证,仅授权用户才能推送或拉取镜像,这里也不再详细介绍权限认证相关功能。
docker pushdocker push命令用于将镜像推送到仓库,推送到的仓库由镜像的REPOSITORY属性决定。
$ docker tag ubuntu 127.0.0.1:5000/finley/my_ubuntu:v1 $ docker docker push 127.0.0.1:5000/finley/my_ubuntu:v1 The push refers to a repository [127.0.0.1:5000/finley/my_ubuntu] f17fc24fb8d0: Mounted from registry/my_ubuntu 6458f770d435: Mounted from registry/my_ubuntu 5a876f8f1a3d: Mounted from registry/my_ubuntu d2f8c05d353b: Mounted from registry/my_ubuntu 48e0baf45d4d: Mounted from registry/my_ubuntu v1: digest: sha256:f871d0805ee3ce1c52b0608108dbdf1b447a34d22d5c7278a3a9dd78fc12c663 size: 1357 $ curl 127.0.0.1:5000/v2/_catalog {"repositories":["registry/my_ubuntu"]}首先,使用docker tag命令给想要推送的镜像unbuntu:latest创建一个别名127.0.0.1:5000/registry/my_ubuntu:v1。
在这个URI中, 127.0.0.1:5000是Registry的地址,finley是私有仓库中的一个命名空间, my_ubuntu是私有仓库中的一个REPOSITORY。
访问127.0.0.1:5000/v2/_catalog来查看私有仓库中的镜像。
更多Docker相关教程见以下内容: