docker

Docker

实战应用

  • 搭建php环境
  • 在win上熟练使用

目录

前言

开发者常常会说「 这个程序在我的机器里是可以跑通的 」

那么在别的机器里可能因为环境不一致而导致出现异常

环境配置如此麻烦,你每换一台机器就要重来一次

能不能在部署代码的时候,将原始环境一模一样的复制过来呢?

Docker 确保了执行环境的一致性,使得应用迁移更加容易

Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的

因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化

虚拟机与Docker

虚拟机就是开发环境安装的一种解决方案,它可以在一个操作系里面运行另一个操作系统

比如在 windows 上运行 Linux 系统

应用程序对此毫无感知,因为虚拟机跟真实的系统一模一样,但是缺点是:

  1. 资源占用多

    虚拟机会独占一部分内存和硬盘,它运行的时候,其他程序就不能使用这些资源了

  2. 启动慢

    启动操作系统需要多久,启动虚拟机就需要多久

Docker 在 Linux 容器上进行进一步封装,提供简单易用的容器使用接口

优点在于:

  1. 由于容器不用硬件虚拟以及运行完整的操作系统

    启动容器相当于启动本机的一个进程,而不是启动一个操作系统

  2. 容器只占用需要的资源,不占用那些没有用到的资源

    多个容器可以共享资源,而虚拟机都是独享资源

  3. 容器体积小,只包含用到的组件即可

Docker的用途

  1. 提供一次性的环境:比如本地测试他人的软件
  2. 提供弹性的云服务:因为 Docker 容器可以随开随关,很适合动态扩容
  3. 组件微服务架构:通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构
  4. 方便团队理解开发环境:使用 Dockerfile 让镜像构建透明化

不仅仅开发团队可以理解应用环境

也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像

镜像

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外

还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

镜像不包含任何动态数据 ,其内容在构建之后也不会被改变

镜像并非像一个 ISO 那样的打包文件,由多层文件系统联合组成

镜像构建时,会一层层构建,前一层是后一层的基础。

每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层

任何额外的东西在该层构建结束前清理掉

这样使得镜像的复用、定制更为容易

容器

容器实质是进程,容器可以被创建、启动、停止、删除、暂停等

但是与直接运行在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间

因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间

每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层

我们可以称这个为容器运行时读写而准备的存储层为 容器存储层

容器存储层的生命周期和容器一样,容器消亡时,容器存储层也随之消亡

因此,任何存于容器存储层的信息都会随容器删除而丢失

关于文件写入操作

Docker 最佳实践要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化

所有的文件写入操作都应该使用 「 数据卷(Volume) 」、或者绑定宿主目录

在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高

数据卷的生命周期独立于容器,容器消亡 ,数据卷不会消亡

因此使用数据卷后,容器删除或者重新运行之后,数据不会丢失

容器与镜像

镜像和容器的关系更像是面向对象程序设计中的类和实例的关系一样

镜像是静态的定义,容器是镜像运行时的主体

有个坑容器如果启动后没有一直挂起的命令,就会自动退出

也就是docker容器后台运行必须有一个前台进程

可以使用 tail -f /code/test.log

仓库

镜像构建完成后,可以很容易在当前宿主机器上运行

但是如果需要在其他服务器上使用这个镜像

我们就需要一个集中存储分发镜像的服务

Docker Registry 就是一个这样的服务

Docker Registry 中可以包含多个仓库

每个仓库可以包含多个标签

每一个标签对应一个镜像

以 Ubuntu 为例, ubuntu 是仓库的名字,里面包含有不同的版本标签,如 16.0418.04

我们可以通过 ubuntu:16:04 来具体指定所需哪个版本的镜像

如果忽略了标签,那么最终将视为 ubuntu:latest

感谢您的阅读,本文由 Double-c 版权所有。如若转载,请注明出处:Double-c(https://double-c.github.io/2019/12/12/docker/
code-life
git常用操作