docker入门的一些个人理解

777 阅读5分钟

TIP:可以把docker认为是git,有助于初学者们去理解其中的一些流程和操作。

一.docker的好处

我认识持续交付和部署是最重要的一点,对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

二.初步认识docker的三大概念(镜像、容器、仓库)

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

  2. 镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

  3. 容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

  4. 仓库(以官网为例)是Docker Hub,也就是默认的Registry,镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

三.安装docker(macOS为例)

  1. 如果Mac安装了Homebrew,可以直接使用命令 $ brew cask install docker 进行安装。

    brew cask install docker
    
  2. 如果需要手动下载,请去官网点击下载 Stable(稳定) 或 Edge(超前最新) 版本的 Docker Desktop for Mac。

  3. 初次运行docker,可以先启动终端,通过命令可以检查安装后的 Docker 版本

    docker -v
    Docker version 19.03.12, build 48
    
  4. 尝试运行一个NGINX服务器,run指令的参数具体可以文档查询,这里暂不描述,服务运行后,可以访问 http://localhost,如果看到了 "Welcome to nginx!",就说明 Docker Desktop for Mac 安装成功

    docker run -d -p 80:80 --name webserver nginx 
    
  5. 停止 Nginx 服务器并删除执行下面的命令

    docker stop webserver
    docker rm webserver
    

四.docker最常用的操作命令(pull tag images push)

  1. Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像,从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 

    docker pull ubuntu:18.04
    
  2. 上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:18.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 18.04 的镜像

  3. docker images类似于 git branch -a,主要用于查看已经下载下来的镜像

  4. 删除本地镜像

    docker image rmid

并非所有的 docker image rm 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。 当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变得非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。这就是为什么,有时候会奇怪,为什么明明没有别的标签指向这个镜像,但是它还是存在的原因,也是为什么有时候会发现所删除的层数和自己 docker pull 看到的层数不一样的原因。

   5.用户也可以在登录docker hub后通过 docker push 命令来将自己的镜像推送到 Docker Hub

    docker tag ubuntu:18.04 username(username 请替换为你的 Docker 账号用户名)/ubuntu:18.04
    docker push username/ubuntu:18.04

五.操作容器

  1. 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

  2. 新建并启动容器 主要语法为 docker run

    docker run
    
  3. Docker 在后台运行的标准操作包括: 

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止