什么是Docker
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,
它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,
主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
为什么要使用Docker
1.更高效的利用系统资源
2.更快速的启动时间
3.一致的运行环境
4.持续交付和部署
5.更轻松地迁移
6.更轻松的维护和扩展
Docker包括三个基本概念
镜像Image
容器Container
仓库Repository
Docker镜像
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,
还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker容器
1.镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,
容器是镜像运行的时的尸体。容器可以被创建、启动、停止、删除、暂停等。
2.容器的实质是进程,但与直接在宿主机执行的进程不同,容器进程运行属于自己
独立的命名空间,可以拥有自己的root文件系统、网络配置、进程空间、用户ID空间。
容器内的进程是运行在一个隔离的环境里,使用起来,就好像在一个独立于宿主的系统
下操作一样,这种容器封装的应用比直接在宿主机上运行更加的安全。
3.容器的存储和镜像一样是分层存储,每一个容器运行时是以镜像为基础层
在其上面创建一个当前容器的存储层,称这个为容器运行时读写而准备的存储曾为
容器存储层。
4.容器存储成的生命周期和容器一样,容器消亡时,容器存储层也随之消亡,
任何保存于容器存储层的信息都会和容器删除而丢失。
5.Docker最佳实践需求,容器不应该向存储层内写入任何数据,存储层要保持无状态化。
所有文件的写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录、这些操作会直接
跳过容器存储层,直接对宿主发生读写,性能和稳定性更高。
6.数据卷的生命周期独立于容器,容器消亡,数据卷不会消亡。容器删除或者重新
运行之后,数据不会丢失。
7.获取镜像仓库的命令是 docker pull
8.运行容器的命令是 docker run -it --rm \
ubuntu:18.04 \
bash
-it:这是两个参数,一个是
-i:交互式操作,一个是
-t 终端。
我们这里打算进入 bash 执行一些命令并查看返回结果,
因此我们需要交互式终端。
--rm:这个参数是说容器退出后随之将其删除。
默认情况下,为了排障需求,退出的容器并不会立即删除,
除非手动 docker rm。我们这里只是随便执行个命令,看看结果,
不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,
因此用的是 bash。
9.列出镜像 docker images ls(注意:Docker Hub上显示的镜像体积是压缩后的)
10.虚悬镜像
这个镜像既没有仓库名字也没有标签均为
因官方镜像维护后,docker pull mongo:3.2获取这个镜像的时候这个镜像名字被转移到
新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成
为了
11.中层镜像
docker image ls 只会显示最上层的镜像
docker image ls -a显示中层需要加参数
12.列出特定的某个镜像,也就是指定的仓库名字和标签
docker image ls --filter(简写:-f 作用:过滤)
docker image ls -f since(before)=mongo:3.2查看在mongo:3.2之后(之前)建立的镜像
docker image ls -f label=com.example.version=0.1通过标签来过滤
docker image ls -q--filter 配合 -q 产生出指定范围的 ID 列表
13.删除本地镜像
docker image rm [选项] <镜像1> [<镜像2> ...]
14.查看镜像、容器、数据卷所占用的空间
docker system df
Docker Registry
作用:集中存储,分发镜像服务
1.Docker Registry可以包含多个仓库,每个仓库可以包含多个标签,每个标签对应一个镜像。
2.一个仓库会包含一个软件不同版本的镜像,标签就常用于对应用该软件的各个版本
通过<仓库名>:<标签>的格式来指定具体是这个软件那个版本的镜像,如果不给出标签
,将以latest为默认标签
3.仓库名经常以两段路径形式出现
4.Docker Registry 公开服务开放给用户使用、允许用户管理镜像的 Registry 服务。
一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
5.私有 Docker Registry
利用commit理解镜像的构成
不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成
docker diff webserver 修改了容器的存储层 可查看具体改动
Dockerfile
每一个命令就是建立一个镜像,run也是
运行多个命令仅使用一个run指令,并使用&&连接起来可表示为一层
容器
守护态运行(后台运行)
docker在后台运行的时不直接把执行命令的结果输出在当前宿主机下
使用-d来实现,输出结果不会显示在宿主机上 结果可以用docker logs查看
使用-d启动后会返回一个唯一的id,也可以通过docker container ls 查看容器信息
docker container logs [container ID or NAMES]
终止容器
docker container stop 终止容器的运行
当docker容器中指定的应用终结时,容器也自动终止
docker container ls -a查看容器的状态
docker container start 将一个已经终止的容器启动运行
docker container restart 命令会将一个运行态的容器终止,然后再重新启动它
进入容器
docker attach 或者 docker exec(推荐使用)
exit或Ctrl+d来退出终端
attach命令
docker attach ubuntu:18.04
从这个stdin中exit,会导致容器的停止
exec命令(后可跟-i t)
只用-i参数时,由于没有分配伪终端,界面没有我们熟悉的Linux运算符,但命令执行结果仍可以返回
当-i -t 一起使用的时候 可看到Linux命令提示符号
从这个stdin中exit,不会导致容器的停止
导出容器
docker export
示例:docker export 7691a814370e > ubuntu.tar这样将导出快照到本地文件
导入容器快照
docker import 从快照文件中再导入为镜像
示例:
cat ubuntu.tar | docker import - test/ubuntu:v1.0
也可以通过指定URL或者某个目录来导入
示例:
docker import http://example.com/exampleimage.tgz example/imagerepo