1 基本概念
Docker包括三个基本概念:
- 镜像(Image)
Docker镜像相当于一个特殊文件系统,除了提供容器运行时所需的程序、库、资源和配置等文件外,还包含一些运行时准备的配置从那数(如环境变量、用户等),镜像不包含任何动态数据。
镜像被设计成分层存储的架构,镜像是由多层文件系统联合组成,镜像构建是会一层层构建,每一层构建完不再改变。(比如删除前一层文件,实际上仅是在当前层标记目标文件为已删除)。因此每层应只包含最基础的东西,额外的东西应该在构建结束后立即删除。
- 容器(Container)
容器的实质是进程,但是是运行在属于自己的独立的命名空间,因此可以拥有自己的root文件系统、网络配置、进程空间、甚至是自己的用空ID空间。每一个容器运行时,都是以镜像为基础,在其上创建一个当前容器的存储层,称这个为容器运行时读写而准备的存储层为容器存储层。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)或者绑定宿主目录,在这些位置进行读写会跳过容器存储层。
- 仓库(Repository)
一个Docker Reistry可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。
可以通过<仓库名>:<标签>来指定镜像:
仓库名通常为<用户名>/<软件名>,用户名缺省为library;
标签缺省为latest。
2 安装
注意要建立docker用户组
默认情况下,docker命令会使用Unix socket与Docker引擎通信,而只有root用户和docker组用户才可以访问Docker引擎的Unix socket.
# 建立`docker`组:
$ sudo groupadd docker
# 将当前用户加入docker组
$ sudo usermod -aG docker $USER
# 退出终端,并重新登入
3 使用镜像
3.1 获取镜像
通过docker pull 仓库名获取镜像:
$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker镜像仓库地址:<域名/IP>[:端口号]。默认地址为Docker Hub(docker.io)
测试运行:
$ docker run -it --rm ubuntu:18.04 bash
-i 交互式操作
-t 终端,-i可以进行交互式操作,但是没有prompt
–rm 运行后删除,否则运行后只是终止(exited)
3.2 列出镜像
列出已经下载的镜像(顶层镜像):
$ docker image ls
列出所有镜像:
$ docker image ls -a
Docker为了加速镜像构建、重复利用资源,docker会利用中间层镜像,是其他上层镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为缺失依赖。
删除虚悬镜像:
$ docker image prune
3.3 删除本地镜像
$ docker image rm [选项] <镜像1> [<镜像2> ...]
可以用 ID、镜像名、摘要 删除镜像
可以与docker image ls 命令来配合使用:
$ docker image rm $(docker image ls -q -f before=mongo:3.2)