Docker学习笔记

86 阅读8分钟

Docker基础

本文主要用于记录自己的学习,摘自知乎,侵删

导语:Docker,近两年才流行起来的超轻量级虚拟机,它可以让你轻松完成持续集成、自动交付、自动部署,并且实现开发环境、测试环境、运维环境三方环境的真正同步。本文从Docker定义,作用,技术架构,安装和使用等全方位带你看懂Docker

什么是Docker

Docker从狭义上来讲就是一个进程,从广义上来讲是一个虚拟容器,其实更专业的叫法是应用容器( Application Container ),Docker进程和普通的进程没有任何区别,它就是一个普通的应用进程。不过是用来操作镜像文件的。所以Docker进程+构建的应用镜像文件就等于Docker容器

使软件具备超强的可移植性

Docker可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器

要了解Docker要先了解一些基本概念,镜像,容器,仓库

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类

镜像

镜像 (Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件

所谓镜像文件其实和ZIP压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用,例如一个测试版的操作系统、游戏等。镜像文件不仅具有ZIP压缩包的“合成”功能,它最重要的特点是可以被特定的软件识别并可直接刻录到光盘上

镜像是分层的,有基础镜像,仅仅包含操作系统,比如centos镜像;有中间件镜像,比如redis等数据库镜像;最后是应用镜像,就是指具体的应用服务了,应用镜像可以非常丰富,随时可以发布,这三者之间依次叠加

所以当我们在使用 Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一个新镜像层

容器

容器Docker containers,你可以从镜像中创建容器,这如同从快照中创建虚拟机,不过更轻量,启动更快,秒启

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

快照的定义:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。

场景一:存储快照,是一种数据保护措施,可以对源数据进行一定程度的保护,通俗地讲,可以理解为----后悔药。

场景2:前言中说过,快照是一份完全可用的副本,那么,它完全可以被上层业务当做源数据

需要注意的是:快照是完全可用的拷贝,但不是一份完整的拷贝,至于为什么,后面会详细讲

仓库

仓库(Repository) :仓库可看成一个代码控制中心,用来保存镜像

仓库Docker registeries,docker仓库和存放集装箱的仓库是一样的,不过docker使用来存放镜像的。仓库存在公有和私有之分,公有仓库docker hub提供了非常多的镜像文件,这些镜像直接拉取下来就可以运行了,你也可以上传自己的镜像到docker hub上面。同时也可以自己搭建私有仓库用于团队项目管理。

Docker步骤

1、 开发构建镜像并将镜像push到Docker仓库
2、 测试或者运维从Docker仓库拷贝一份镜像到本地
3、 通过镜像文件开启Docker容器并提供服务

Docker作用

1.构建容易分发简单

2.隔离应用解除依赖

3.快速部署测完就销

Docker是个进程级的轻量化虚拟机,和传统虚拟机有啥区别

1.启动速度快,容器启动本质就是一个开启一个进程而已,因此都是秒启,而 VM 通常要更久。

2.资源利用率高,一台普通 PC 可以跑成百上千个容器,你跑十个 VM 试试。

3.性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源。

Docker 原理

从Docker依赖的底层技术来看,Docker原生态是不能直接在Windows平台上运行的,只支持linux系统,原因是Docker依赖linux kernel三项最基本的技术,namespaces充当隔离的第一级,是对Docker容器进行隔离,让容器拥有独立的hostname,ip,pid,同时确保一个容器中运行一个进程而且不能看到或影响容器外的其它进程;Cgroups是容器对使用的宿主机资源进行核算并限制的关键功能。

常用命令

systemctl --user start docker-desktop

systemctl --user stop docker-desktop

docker pull image(拉取最新镜像)

docker run image(运行指定镜像并产生容器)

docker run -d image 守护式容器,在后台运行

docker run -it image 交互式容器

docker rm containerID 删除指定容器

docker inspect image/container 查看指定镜像容器的运行状态

自动化操作流程

1.RD推送代码到git 仓库或者svn等代码服务器上面,git服务器就会通过hook通知jenkins。

2.jenkine 克隆git代码到本地,并通过dockerFile文件进行编译 。

3.打包生成一个新版本的镜像并推送到仓库 ,删除当前容器 ,通过新版本镜像重新运行

镜像

base 镜像

1.不依赖其他镜像,从scratch构建

2.其他镜像可以之为基础扩展

eg.Ubuntu,debian,centos

a.对于base镜像,底层直接用host的kernel,自己只需要提供rootfs(用户空间的文件系统)

b.base镜像提供最小的Linux发行版

base镜像只在用户空间与发行版一致,kernel版本与发行版不同,如果容器对kernel版本有要求,不建议使用容器,虚拟机更合适

分层结构

从base镜像基础上构建,一层层叠加,共享资源,修改会被限制在单个容器内

可写容器层 1.容器启动时,一个新的可写容器层加载到镜像顶部,之下的叫做镜像层

2.如果不同层中有相同的路径文件,上层覆盖下层

只有当需要修改时才复制一份数据,容器层保存的时镜像变化的部分,不会对镜像本身进行任何修改

构建镜像

两种构建方法:1.docker commit 2.Dockerfile

docker commit

1.运行容器

2.修改容器

3.保存为新的镜像

不建议使用这种办法

1.手工创建,可重复率低

2.用户不知道如何构建

是Dockerfile的底层构建方法,可帮助理解

Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

运行步骤

新建Dockerfile

FROM 和 RUN 指令的作用

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式

RUN <命令行命令>

<命令行命令> 等同于,在终端操作的 shell 命令。

RUN ["可执行文件", "参数1", "参数2"]

例如:

RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

开始构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)

docker build -t nginx:v3 .
上下文路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会 造成过程缓慢

运行

构建镜像后就可以直接运行了

eg. docker run nginx:v3