Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
1. 拉取镜像
拉取最新版ubuntu镜像
1 | runoob@runoob:~$ docker pull ubuntu #等效于docker pull ubuntu:latest |
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
查看本地镜像
1 | runoob@runoob:~$ docker images |
查看本地容器运行信息(注意对象和类的区别)
1 | runoob@runoob:~$ docker ps |
删除镜像
1 | runoob@runoob:~$ docker rmi +镜像名称或ID |
2. 运行容器
docker run +参数 +镜像名 +要执行的命令
例1: 无参数,执行echo "Hello World"指令,即回显之
1 | runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world" |
例2:-it参数(常用)i参数表示可以用标准输入STDIN交互,t参数表示终端。以下进入Ubuntu容器交互式终端
1 | runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash |
exit
或CTRL+D
可以退出交互式容器,返回系统主机
例3:-d参数,后台模式,创建一个以进程方式运行的容器
1 | runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" |
在输出中,我们没有看到期望的 "hello world",而是一串长字符,叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。
docker ps
可以看所有容器状态,根据ID可确定目标容器,以及其他信息。若加-a
参数,则可以看见历史容器,包括结束运行的,便于restartdocker logs +ID
可以看到容器内STDOUT标准输出,这里使用ID的前若干位特有字符就行,和ps显示的对应,不需要上面那么长docker stop +ID
可以终止指定容器运行,这里使用ID的前若干位特有字符就行,和ps显示的对应,不需要上面那么长docker restart +ID
可以重新执行某个容器
3. 删除容器
先停再删哦
1 | $ docker rm -f 1e560fca3906 |
下面的命令可以清理掉所有处于终止状态的容器
1 | $ docker container prune |
4. 容器的导出与导入
如果要导出本地某个容器,可以使用 docker export
命令。
1 | $ docker export 1e560fca3906 > ubuntu.tar |
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。这样将导出容器快照到本地文件。
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
1 | $ cat docker/ubuntu.tar | docker import - test/ubuntu:v1 |
此外,也可以通过指定 URL 或者某个目录来导入,例如:
1 | $ docker import http://example.com/exampleimage.tgz example/imagerepo |
5. 从容器更新镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
本节介绍第一种情况。
更新镜像之前,我们需要使用镜像来创建一个容器。
1 | runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash |
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
1 | runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 |
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- e218edb10161:容器 ID
- runoob/ubuntu:v2: 指定要创建的目标镜像名
我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2
6. 构建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
本节介绍第二种情况。
使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
1 | runoob@runoob:~$ cat Dockerfile |
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
1 | runoob@runoob:~$ docker build -t runoob/centos:6.7 . |
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在
7.Docker仓库管理
https://www.runoob.com/docker/docker-repository.html