Docker的三大核心概念
镜像(Image)、容器(Container)、仓库(Respository)
镜像( Image )和容器( Container )的关系,就像是面向对象程序设计中的 类 和 实例
一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删
除、暂停等。
Docker镜像 *
镜像是运行容器的前提
获取镜像
- docker [image] pull NAME[:TAG]
- NAME:镜像仓库名称(用来区分镜像)
- TAG:镜像的标签(表示版本信息),不显示指定,默认会下载latest标签
- docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
- Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号] 。默认地址是 Docker
Hub。 - 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名> 。对于 Docker
Hub,如果不给出用户名,则默认为 library ,也就是官方镜像。
- Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号] 。默认地址是 Docker
docker pull ubuntu:16.04
--> docker pull registry.hub.docker.com/ubutun:16.04
命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。(如果配置了其它源,从配置的源下载)
而镜像名称是 ubuntu:16.04 ,因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜
像。
基本命令
都需要获得权限sudo
启动Docker服务
- $ sudo service docker start (Ubuntu 14.04)
- $ sudo systemctl enable docker
$ sudo systemctl start docker
配置国内镜像加速器
- /etc/docker/daemon.json 中写入如下内容(如果文件不存在新建该文件)
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
查看信息
- docker info
使用Docker镜像
1. 获取镜像
- docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
- 支持的选项
- -a, --all-tags=true|false:是否获取仓库中的所有镜像,默认为否
- –disable-content-trust:取消镜像中的内容校验,默认为真
- 支持的选项
dockr pull hub.c.163.com/public/ubuntu:18.04
2. 运行镜像
以这个镜像为基础启动并运行一个容器
-
docker run -it ubuntu:18.04 bash
- -it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入
bash 执行一些命令并查看返回结果,因此我们需要交互式终端。 - –rm :这个参数是说容器退出后随之将其删除。
- ubuntu:18.04 :这是指用 ubuntu:16.04 镜像为基础来启动容器。
- bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。
- -p,端口
- -it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入
-
docker run --name web2 -d -p 81:80 nginx:v2
命名为新的服务为 web2 ,并且映射到 81 端口。
-
exit 退出容器
3. 查看镜像信息
- 使用image命令列出镜像
-
docker images 或 docker image ls
- docker images ubuntu|ubuntu:18.04:根据仓库名或特定的镜像
- -a ,–all=true|false:列出所有(包括临时文件)(包括中间层镜像)镜像文件,默认为否
- –digests=true|false:列出镜像的数字摘要值,默认为否
- -f,–filter=[]:过滤列出的镜像,如danglin=true,只显示没有被使用的镜像、before、since
如:docker image ls -f dangling=true
- –format=“TEMPLATE”:控制输出格式
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
- –no-trunc=true|false:对输出太长的内容进行截断,默认为是
- -q,–quiet=true|false:仅输出ID信息,默认为否
-
使用tag命令添加镜像标签
docker tag ubuntu:18.04 myubuntu:latest
别名而已,起到了类似链接的命令
- inspect命令查看详细信息
docker [image] inspect ubuntu:18.04
只获取镜像的Architecture
docker inspect -f {{".Architecture}} ubuntu:18.04
- 使用history命令查看镜像历史
docker history ubuntu:18.04
如果字段太长被截断,使用 --no-trunc
4. 搜寻镜像
- docker search [option] keyword
- -f ,–filter:过滤输出的内容
- –format string :格式化输出内容
- limit int :限制输出结果个数,默认为25个
- –no-trunc:不截断输出结果
搜索官方提供的带nginx关键字的镜像
docker search --filter=is-offical=true nginx
搜索收藏数超过4的关键字包括tensorflow的镜像
docker search --filter=stars=4 tensorflow
5. 删除和清理镜像
-
使用docker rmi 或 docker image rm 命令,格式为
docker rmi [选项] <镜像1> [<镜像2> ...]
- -f,-force:强制删除镜像,即使有容器依赖它
- -no-prune:不要清理未带标签的父镜像
5.1 使用标签删除镜像
当一个镜像具有多个标签时,删除一个标签不会影响镜像文件。但当镜像只剩下一个标签时,再次删除会彻底删除镜像文件
5.2 使用镜像ID来删除镜像
会先删除所有指向该镜像的标签,然后删除该镜像文件本身
注意:
- 当该镜像创建的容器存在时,镜像文件默认是无法被删除的
- 使用 docker ps -a 查看本机上存在的所有容器
- 先删除容器 docker rm CONTAINER ID
用 docker image ls 命令来配合
使用 docker image ls -q 来配合使用 docker image rm ,这样可以成批的删除希望删除的镜像。
-
删除所有仓库名为 redis 的镜像:
docker image rm $(docker image ls -q redis)
-
删除所有在 mongo:3.2 之前的镜像:
docker image rm $(docker image ls -q -f before=mongo:3.2)
6. 创建镜像
主要有三种方式:
基于已有镜像创建(commit方式,不用)
基于本地模板导入
Dockerfile创建 *
commit方式(不使用)
-
由于命令的执行,还有很多文件被改动或添加了。会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。
-
使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑
箱镜像
DockerFile方式 *
-
在一个空白目录中,建立一个文本文件,并命名为 Dockerfile :
$ mkdir mynginx $ cd mynginx $ touch Dockerfile
-
内容例如
FROM nginx RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
Dockerfile 很简单,一共就两行。涉及到了两条指令, FROM 和 RUN 。
- FROM 指定基础镜像
定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
-
RUN 执行命令
格式分为两种:
- shell 格式: RUN <命令>
- exec 格式: RUN [“可执行文件”, “参数1”, “参数2”]
-
要点:
- 使用一个 RUN 指令,并使用 && 将各个所需命令串联起来,因为每一个 RUN 的行为,就和手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像。会变的臃肿。
- Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式
- && apt-get purge -y --auto-remove $buildDeps:最后添加了清理工作的命令,删除了为了编译构建所需要的软件,清理了所有下载、展开的文件,并且还清理了 apt 缓存文件
-
构建镜像
-
在 Dockerfile 文件所在目录执行 docker build 命令,格式为:
docker build [选项] <上下文路径/URL/-> 如 docker build -t nginx:v3 . 指定了最终镜像的名称 -t nginx:v3
-
-
镜像构建上下文(Context)
- 在 docker build 命令最后面有一个 . 。 . 表示当前目录
存出和载入镜像
-
存出镜像
docker [image] save 支持-o、-output string 参数,导出镜像到指定文件中 例子:导出本地的ubuntu:18.04 镜像为文件 ubuntu_18.04.tar(保存在当前目录) : $ docker save -o ubuntu_18.04.tar ubuntu:18.04
-
载入镜像
docker [image] load 支持-i、-input string参数,从指定文件读取内容 例子:从文件ubuntu_18.08.tar 到入境想到本地镜像列表 docker load -iubuntu_18.04.tar 或者 docker load < ubuntu_18.04.tar
Dockerfile指定详解
COPY 复制文件
-
格式
COPY <源路径>... <目标路径> COPY ["<源路径1>",... "<目标路径>"]
操作Docker容器
1. 创建容器
-
新建容器(此命令新建的容器处于停止状态,使用 start 命令启动)
docker [container] create 例如: docker create -it ubuntu:latest docker ps -a 显示所有容器
-
启动容器
docker [container] start<NAMES/CONTAINER ID> 通过 docker ps 命令可以查看当前运行的容器
-
新建并启动容器
docker [container] run 等价于 先执行 docker [container] create 命令,在执行 docker [container] start命令