Docker 实践指北(上)

Author Avatar
我爱吃包子 4月 11, 2019

前言

本文将会介绍 docker 的基础知识,docker 的组成以及通过 docker 搭建一个服务,包括数据库、后端服务、前端服务。项目的源码 已经放到了我的的 github 上,详情可以点击下面链接。https://github.com/wangcheng007/blog

本来想一篇文章描述下的,发现一篇文章篇幅太长,这篇文章先讲解下 Docker 的基础知识以及一些常用的命令,下篇文章介绍通过 Dockerfile 创建镜像以及通过 docker-compose 来管理容器。

docker 简介

docker 与虚拟化

docker 容器技术是一种全新意义上的虚拟化技术,我们通常说的虚拟化是一种将计算机物理资源进行抽象、转换为虚拟的计算机资源提供给程序使用的技术。docker 容器按分类或者实现方式来说,其应该属于操作系统虚拟化的范畴,也就是在由操作系统提供虚拟化的支持。这里我们直接通过虚拟机和容器技术的剖析图来分析,就更容易看出容器虚拟化是如何在效率上完胜虚拟机的。

avatar

Docker 容器不使用硬件虚拟化,它的守护进程是宿主机上的一个进程,换句话说,应用直接运行在宿主机内核上。因为容器中运行的程序和计算机的操作系统之间没有额外的中间层,没有资源被冗余软件的运行或虚拟硬件的模拟而浪费掉。docker 的具体实现这里就不多描述了,主要依赖三大技术命名空间、资源控制组和联合文件系统。感兴趣的同学可以自己去搜索了解下。

docker 的安装

对于 mac 用户来说,可以直接安装 docker for mac 。下载下来是一个界面化工具,里面包括 docker、docker-compose 等下面需要用到的软件。安装完成 运行 就可以看到下面的界面。不过我不是很喜欢使用界面化工具,还是习惯直接敲命令。

docker

docker 的构成

docker 主要由四大部分组成镜像(Image)、容器(Container)、网络(Network)和数据卷(Volume)。下面就简单介绍下这四个部分以及整理一些常用命令。

  • 镜像

    镜像 ( Image ) 这个概念相信大家不会陌生,因为它是其他虚拟化技术 ( 特别是虚拟机 ) 中常常被使用的一个概念。所谓镜像,可以理解为一个只读的文件包,其中包含了虚拟环境运行最原始文件系统的内容。Docker 通过底层的文件系统实现了一种增量式的镜像结构。

    images

    每次对镜像内容的修改,Docker 都会将这些修改铸造成一个镜像层,而一个镜像其实就是由其下层所有的镜像层所组成的。当然,每一个镜像层单独拿出来,与它之下的镜像层都可以组成一个镜像。并且每个镜像层都有唯一的编码,这带来了另外一项好处就是就是可以让镜像可以共用一些存储空间,达到1+1 < 2的效果,为我们在同一台机器里存放众多镜像提供了可能。

  • 容器

    容器 ( Container ) 就更好理解了,在容器技术中,容器就是用来隔离虚拟环境的基础设施,而在 Docker 里,它也被引申为隔离出来的虚拟环境。一个容器由 一个 Docker 镜像、一个程序运行环境和一个指令集合是哪个部分组成。Docker 容器崇尚的理念是一个应用一个容器,用完即删。但我们知道,如今纷繁的系统服务,没有几个是可以通过单一的应用程序支撑的。所以我们可以通过网络来进行容器间的通信。

  • 网络

    对于大部分程序来说,它们的运行都不会是孤立的,而是要与外界或者更准确的说是与其他程序进行交互的,这里的交互绝大多数情况下指的就是数据信息的交换。网络通讯是目前最常用的一种程序间的数据交换方式了。在 Docker 中,实现了强大的网络功能,我们不但能够十分轻松的对每个容器的网络进行配置,还能在容器间建立虚拟网络,将数个容器包裹其中,同时与其他网络环境隔离。

    network

  • 数据卷

    除了通信之外,对应用程序来说至关重要的就是数据了。Docker 提供了三种不同的挂载方式来应对不同场景下的需求。

    volume

    1、bind mount 能够直接将宿主操作系统中的目录和文件挂载到容器内的文件系统中,通过指定容器外的路径和容器内的路径,就可以形成挂载映射关系,在容器内外对文件的读写,都是相互可见的。一般用来挂载一些配置,比如 nginx 、mysql 配置等。还有当我们需要 Docker 来部署开发的时候,这种挂载方式就非常合适,只需要我们重新打包程序即可。

    2、tmpfs mount 是一种特殊的挂载方式,它主要利用内存来存储数据。由于内存不是持久性存储设备,所以其带给 Tmpfs Mount 的特征就是临时性挂载。它非常适用 应用中用到但是不需要持久化保存的数据 以及对读写要求高但是不需要持久化的数据。

    3、volume 数据卷,这个主要由容器内部管理,我们不需要知道他被挂载到宿主环境何处,只需要给定容器中的哪个目录会被挂载即可。适用于需要数据在多个容器内共享时,使用数据卷可以保证在持久化的前提下完成更多自动化操作。

Docker关于镜像、容器、网络和数据卷的一些命令

在使用过程中我整理了一个表格来记录下我常用的一些命令,可以直接跳过,建议收藏便于查阅。想要知道更加详细的命令可以点击这个链接查看我的学习笔记或者可以去官网查阅。

命令 描述
docker pull 从 docker 仓库中拉取镜像
docker push 推送本地镜像到远端 docker 仓库
docker search 在远端 docker 仓库搜索关键字
docker rmi 删除本地镜像
docker create 通过镜像创建容器
docker start 启动容器
docker ps 查看容器运行状况
docker stop 停止容器
docker rm 删除容器
docker exec 启动容器内命令(通常配合 -it 来启动bash或者shell)
docker network create 创建网络
docker network ls 查看已经存在的网络
docker volume ls 查看所有数据卷
docker volume rm 删除数据卷