所在位置:

docker的基础知识及安装

docker 的基本概念比较多,要熟悉地掌握 docker,一定要好好地去理解这些概念,下面是一些主要的概念:

Docker和传统虚拟化的区别

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为 轻便,下面是一个简单的对比图:

Docker和Vagrant的区别

DockerVagrant 都是虚拟化的技术,但 Vagrant 只是在虚拟机上封装了一层,方便开发人员使用,而 Docker 是基于容器技术的虚拟技术,可以用在正式环境部署,一般来说,Vagrant 方便统一开发环境,而 Docker 方便持续化部署环境,很少有人会有正式的环境用 Vagrant 来部署的。

镜像( Image )

概念

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变

镜像的构建
  1. 可以使用 docker commit 来构建新的镜像( 不建议这样做

  2. 使用 Dockerfile 来构建新的镜像

镜像的常用命令
  • 查看已经下载的镜像
docker image ls
  • 列出具体的镜像
docker image ls ubuntu
  • 只显示镜像的 id
docker image ls -q
  • 删除已经下载的镜像
docker image rm [选项] <镜像1> [<镜像2> ...]

容器( Container )

概念

镜像(Image)容器(Container) 的关系,就像是面向对象程序设计中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定 宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

注意: 后面我们会说到 数据卷(Volume) 的使用,这个其实有点类似于文件映射的功能,这个功能的好处是明显的,可以用 docker 来运行在宿主的文件

容器的常用命令
  • 运行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] [flags]
  • 查看运行容器的所有命令参数
docker run --help
  • 查看所有容器运行的信息
docker ps -a
  • 查看所有容器运行的id
docker ps -a -q
  • 结束容器
docker stop 容器id
  • 结束所有容器
docker stop $(docker ps -a -q)
  • 重新运行容器
docker restart 容器id
  • 删除已经结束的容器
docker container rm 容器的名字(可以使用 docker ps -a查看)
  • 删除所有已经结束的容器
docker container prune

仓库( Repository )

概念

一个 Docker Registry 中可以包含多个仓库( Repository );每个仓库可以包含多个标签( Tag );每个标签对应一个镜像。

一个集中的存储、分发镜像的服务, 一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签,例如:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               f975c5035748        7 days ago          112MB
ubuntu              latest              f975c5035748        7 days ago          112MB
公开仓库

常用的公开仓库:

  1. https://quay.io/repository/

  2. https://hub.docker.com/

私有仓库中

这个后面讲到如何建立自己的私有仓库

镜像的获取
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

例如: 获取 ubuntu 的最新版本

docker pull ubuntu

安装

MAC安装

现在的 Docker 分为两个版本,一个是 CE版 (免费),一个是 EE版 (商业),我们下面安装的都是 CE版

使用 brew 安装

brew cask install docker

或者使用下面的方法:

去 docker 官网下载 mac 的 docker 版本

https://download.docker.com/mac/stable/Docker.dmg

下载镜像太慢的问题解决:

对于使用 macOS 的用户,在任务栏点击 Docker for mac 应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中填写加速器地址 https://registry.docker-cn.com,修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。

查看是镜像下载慢的问题是否生效:

  • 在命令行输入 docker info

  • 是否出现下面的问题

Registry Mirrors:
 https://registry.docker-cn.com/
Centos7安装

使用 yum 命令安装,请依次执行下面的命令:

  • 安装依赖包:
sudo yum install -y yum-utils device-mapper-persisitent-data lvm2
  • 添加源
sudo yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
  • 安装配置 docker-ce
sudo yum-config-manager --enable docker-ce-edge

sudo yum makecache fast
sudo yum install docker-ce
  • 启动 docker-ce
sudo systemctl enable docker
sudo systemctl start docker
  • 建立 docker 用户组
sudo groupadd docker
sudo usermod -aG docker $USER

或者用脚本来安装,使用下面的方法:

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

下载镜像太慢的问题解决:

  • 在 /etc/docker/ 目录下编辑 daemon.jsp 文件 (如果没有就新建)

  • 添加下面的内容:

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}
  • 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker

查看是镜像下载慢的问题是否生效:

  • 在命令行输入 docker info

  • 是否出现下面的问题

Registry Mirrors:
 https://registry.docker-cn.com/

Docker 中镜像、容器、仓库和客户端的关系与交互图:

从这个图中,我们可以看到,在 Docker主机里有一个 Docker 的守护进程,这个守护进程就把 镜像容器仓库客户端 连接在一起了

Docker 的命令图表

参考链接

【上一篇】自动电子书发送到kindle

【下一篇】Dockfile创建自定义镜像及数据卷的应用