0%

Docker 入门

  • Docker 是什么
  • Docker 核心概念
  • Docker 怎么使用

Docker 是什么

  • Docker 是 Linux 容器的一种封装,提供简单易用的容器使用接口
  • Docker 和传统虚拟化方式的不同之处在于容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现
  • 相较于 VM 虚拟化方法,Docker 的好处是启动速度快,资源利用率高,性能开销小

Container vs VMs

Docker 核心概念

Docker 技术的三大核心概念,分别是:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

docker 是一个 client-server 的结构!先看看官网给出的架构图:

three

联合文件系统 - UnionFS

镜像

Docker 镜像就是一个只读的模板。一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。任何镜像的创建会基于其他的父镜像,也就是说镜像是一层套一层。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角:
Image

统一文件系统 (Union File System) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角。这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

容器

Docker 运行的最小单位。它是通过镜像实例化出来的一个可运行对象。容器的修改,可以提交反作用于镜像,更新这个容器的模板。Docker 利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件:image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。

容器的最上面那一层是可读可写的。
Image

容器数据卷

容器数据卷的设计目的是做数据的持久化和容器间的数据共享,数据卷完全独立于容器的生命周期,也就是说就算容器关闭或者删除,数据也不会丢失。将宿主机的目录挂在到容器,应用在容器内的数据可以同步到宿主机磁盘上,这样容器内产生的数据就可以持久化了。

仓库

官方仓库 Docker Hub 是最重要、最常用的 image 仓库。

Dockerfile

Dockerfile 是一个包含用户能够构建镜像的所有命令的文本文档,它有自己的语法以及命令,Docker 能够从 Dockerfile 中读取指令自动的构建镜像! 可以将 Dockerfile 分为四个部分:

  1. 基础镜像(父镜像)信息指令 FROM
  2. 维护者信息指令 MAINTAINER
  3. 镜像操作指令 RUNEVNADDWORKDIR
  4. 容器启动指令 CMDENTRYPOINTUSER

常用命令:

  • FROM 指定基础镜像,当前镜像是基于哪个镜像创建的, FROM 指令必是 Dockerfile 文件中的首条命令
  • ENV 设置环境变量,设置的变量可供后面指令使用
  • WORKDIR 设置工作目录,在该指令后的 RUNCMDENTRYPOINTCOPYADD 指令都会在该目录执行
  • RUN 在当前镜像的最上面创建一个新层,并且能执行任何的命令,然后对执行的结果进行提交。提交后的结果镜像在 Dockerfile 的后续步骤中可以使用
  • ADD 从宿主机拷贝文件或者文件夹到镜像,也可以复制一个网络文件!如果拷贝的文件是一个压缩包,会自动解压缩
  • COPY 从宿主机拷贝文件或者文件夹到镜像,不能复制网络文件也不会自动解压缩
  • VOLUME 用于创建挂载点,一般配合 run 命令的 -v 参数使用
  • CMD 指定容器启动时默认运行的命令,在一个 Dockerfile 文件中,如果有多个 CMD 命令,只有一个最后一个会生效
  • ENTRYPOINTCMD 指令类似,都是指定启动容器时要运行的命令,如果指定了 ENTRYPOINT,则 CMD 指定的命令不会执行
  • SHELL 用于设置执行命令所使用的默认的 shell 类型
  • EXPOSE 允许外部连接这个端口

Dockerfile 执行顺序是从上到下,顺序执行!每条指令都会创建一个新的镜像层,并对镜像进行提交。编写好 Dockerfile 文件后,就需要使用 docker build 命令对镜像进行构建。

Docker 怎么使用

命令图

镜像基本操作

  • 获取镜像
    $ docker search centos
    $ docker pull centos
    $ docker images
    $ docker rmi repository:tag
  • 将容器改动更新到镜像
    $ docker commit container_name/container_id [REPOSITORY[:TAG]]
    $ docker images
  • 使用 Dockerfile 构建镜像,使用 commit 生成的镜像也被称为黑箱镜像,不推荐使用
    $ docker build -t [REPOSITORY[:TAG]] .
  • 查看镜像详情 docker inspect image_id
  • 查看镜像、容器、数据卷所占用的空间
    $ docker system df
  • 删除无主数据卷
    $ docker volume prune

容器基本操作

  • 创建容器 docker run -t -i rangalo/debian /bin/bash
  • 查看容器 docker ps -a
  • 启动、停止、重启容器 docker start/stop/restart container_name/container_id
  • 登录后台容器 docker attach container_name/container_id
  • 删除容器 docker rm container_name/container_id
  • 停止所有容器 docker stop $(docker ps -aq)
  • 删除所有容器 docker rm $(docker ps -aq)
  • 查看容器详情 docker inspect container_id
  • 查看容器日志 docker logs container_id

仓库基本操作

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。当然,用户也可以在本地网络内创建一个私有仓库。

公共仓库

  • 注册帐号 https://hub.docker.com/
  • 登录 docker login
  • 推出登录 docker logout
  • 标记本地镜像 docker tag image_id|repository:tag user_id/image_name:tag

    docker tag fce289e99eb9 breezetemple/hello-world:test
    docker tag hello-world:latest breezetemple/hello-world:latest

  • 推送镜像 docker pull [OPTIONS] NAME[:TAG|@DIGEST]

    docker push breezetemple/hello-world:test

  • 获取镜像 docker push [OPTIONS] NAME[:TAG]

私有仓库

docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。

  • 使用官方 registry 镜像

    docker pull registry
    docker run -d -p 5000:5000 -v /home/workspace/registry:/var/lib/registry registry
    -v / 宿主机:/ 容器内目录

  • 查看镜像 docker images
  • 标记本地镜像 docker tag hello-world:latest 127.0.0.1:5000/hello-world:latest
  • 上传镜像 docker push 127.0.0.1:5000/hello-world:latest
  • 检查结果 curl 127.0.0.1:5000/v2/_catalog
  • 删除本地镜像 docker image rm 127.0.0.1:5000/hello-world:latest
  • 获取私有仓库镜像 docker pull 127.0.0.1:5000/hello-world:latest

Ref

  1. 10 分钟带你从入门操作到实战上手
  2. 这可能是最为详细的 Docker 入门吐血总结