Skip to main content
 Web开发网 » 站长学院 » 浏览器插件

小白docker求入门!求大佬帮忙?

2021年11月10日8680百度已收录

本文邀请yeedom来解答,通过大量的图片、示例介绍,帮助你快速、全面地从入门到实战~

1、docker是什么Docker使用go基于linux lxc(linux containers)技术实现的开源容器,诞生于2013年年初,最开始叫dotcloud公司,13年年底改名为docker inc。

2017年下载次数达到了百亿次,估值达13亿美元,通过对应用封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)全生命周期管理,达到“一次封装,到处运行”

小白docker求入门!求大佬帮忙?  Docker教程 第1张

为何使用docker?

Docker直译码头工人,将各种大小和形状的物品装进船里。这对从事软件行业的人来说,听起来很熟悉,花了大量时间和精力把一个应用放在另一个应用里。

小白docker求入门!求大佬帮忙?  Docker教程 第2张

docker出现之前,对不同环境的安装、配置、维护工作量很多,如部署,配置文件,crontab,依赖等等。使用docker,无需关心环境,只需要一些配置就能构建镜像,而部署则用一条run命令。

小白docker求入门!求大佬帮忙?  Docker教程 第3张

虚拟机VS容器

虚拟机需要有额外的虚拟机管理应用和虚拟机操作系统层,操作系统层不仅占用空间而且运行速度也相对慢。docker容器是在本机操作系统层面上实现虚拟化,因此很轻量,速度接近原生系统速度。

小白docker求入门!求大佬帮忙?  Docker教程 第4张

虚拟机启动速度是分钟级别,性能较弱、内存和硬盘占用大,一个物理机最多跑几十个虚拟机,但它的隔离性比较好。docker启停都是秒级实现,内存和硬盘占用非常小,单机支持上千个容器,在ibm服务器上可运行上万个容器。容器跟虚机相比,有着巨大的优势。

小白docker求入门!求大佬帮忙?  Docker教程 第5张

docker优点

只关心应用:以往我们需要关心操作系统、软件、项目,有了docker我们可以只关心应用而不是操作系统,docker发展迅速,基于docker的paas平台也层出不穷,使得我们能更方便的使用docker;

快速交付:docker可在秒级提供沙箱环境,开发,测试,运维使用完全相同的环境来部署代码

微服务:docker有助于将一个复杂系统分解,让用户用更离散的方式思考服务

离线开发:将服务编排在笔记本中移动办公,使用docker可在本机秒级别启动一个本地开发环境;

降低调试成本:在测试和上线时产生无效的类、有问题的依赖、缺少的配置等问题,docker可让一个问题调试和环境重现变得更简单;

CD:docker让持续交付实现变得更容易,特别是对于蓝绿部署就更简单。

第一版上线时,需要上第二版新功能,两个版本功能会有冲突,这时用docker实现蓝绿部署就非常方便了;

如:可以部署两个版本同时在线,新版本测试没问题了把老版本流量切到新版本就可以了

迁移:可以很快的迁移到其他云或服务器

与传统虚拟机方式相比,容器化方式在很多场景下都是存在极为明显的优势。无论是开发、测试、运维都应该尽快掌握docker,尽早享受其带来的巨大便利;

小白docker求入门!求大佬帮忙?  Docker教程 第6张

容器化方式在很多场景下都有极大的优势。无论是开发、测试、运维都应该尽快掌握docker,尽早享受其带来的巨大便利。

小白docker求入门!求大佬帮忙?  Docker教程 第7张

概念

再来了解docker非常关键的概念,这样才能理解docker容器整个生命周期。

小白docker求入门!求大佬帮忙?  Docker教程 第8张

概念-镜像

镜像(类)=文件系统+数据,我常常用开发语言中的类比作镜像,对象比作容器镜像由多个层加上一些docker元数据组成,容器运行着由镜像定义的系统。

小白docker求入门!求大佬帮忙?  Docker教程 第9张

概念-容器

容器(对象)=镜像运行实例

容器是镜像的运行实例,可以使用同一个镜像运行多个实例。如图所示,一个ubuntu docker镜像产生了三个ubuntu容器,docker利用容器运行和隔离应用。

小白docker求入门!求大佬帮忙?  Docker教程 第10张

从读写角度来说,镜像是只读的,容器是在镜像上添加了一层可读写的文件系统。

小白docker求入门!求大佬帮忙?  Docker教程 第11张

小白docker求入门!求大佬帮忙?  Docker教程 第12张

概念-层

层=文件变更集合

像传统虚机应用,每个应用都需要拷贝一份文件副本,运行成百上千上磁盘空间会迅速耗光,而docker采用写时复制来减少磁盘空间,当一个运行中的容器要写入一个文件时,它会把该文件复制到新区域来记录这次的修改,在执行docker提交时将这次修改记录下并产生一个新的层。docker分层解决大规模使用容器时碰到的磁盘和效率问题。

小白docker求入门!求大佬帮忙?  Docker教程 第13张

概念-仓库

docker借鉴了大量git优秀的经验。docker仓库分公有库和私有库,最大的公开仓库是docker hub,国内也有很多仓库源。

小白docker求入门!求大佬帮忙?  Docker教程 第14张

2、创建第一个docker应用

通过创建一个docker应用来看看docker是怎么方便使用的。

创建docker镜像方式

创建docker有四种方式

小白docker求入门!求大佬帮忙?  Docker教程 第15张

但最常用的docker命令+手工提交和Dockerfile的方式

小白docker求入门!求大佬帮忙?  Docker教程 第16张

对于我们来说Dockerfile是最常用也是最有用的。

小白docker求入门!求大佬帮忙?  Docker教程 第17张

那创建一个docker应用只需要三步:编写dockerfile、构建镜像、运行容器

编写dockerfile

那我们就开始用dockerfile来创建一个应用

Dockerfile是包含一系列命令的文本文件,这个文件包含6条命令

1、FROM是使用php官方镜像,左边是镜像名字,右边是标签名字,标签名字不写默认是latest

2、声明维护人员

3、RUN运行一条linux命令,我们把php代码重定向到/tmp/index.php

4、EXPOSE声明要开放的端口

5、WORKDIR启动容器后默认目录

6、CMD容器启动后,默认执行的命令,相当于应用的入口,用php自带的webserver监听8000

小白docker求入门!求大佬帮忙?  Docker教程 第18张

构建镜像

使用docker build命令生成镜像,—tag指定镜像的名字,左边是名字,右边是标签,最后有个.表示在当前目录查找Dockerfile。可以看到,每个命令都会有个输入输出,输入是命令,输出是给到层的id,所以,基本上每个命令都会产生一个层。最后提示镜像构建成功,并打上镜像标签。

小白docker求入门!求大佬帮忙?  Docker教程 第19张

运行容器

第三,使用docker run命令运行镜像,-p将容器的8000端口映射到本机8000端口,—name给容器起个名字。用curl对本机8000端口请求,服务器返回当前时间,说明我们构建的容器运行成功了。

小白docker求入门!求大佬帮忙?  Docker教程 第20张

请求本地8000端口,服务器返回当前时间

小白docker求入门!求大佬帮忙?  Docker教程 第21张

dockerfile常用命令

其实Dockerfile常用命令就5个:from、add、run、workdir、cmd

创建docker应用步骤

•编写dockerfile

•构建镜像

•运行容器

使用docker应用步骤

•拉取镜像

•运行容器

dockerfile最佳实践

•精简镜像用途

尽量让每个镜像的用途单一

•选择合适基础镜像

选择以alpine、busybox等基础的镜像

busybox:号称操作系统里的瑞士军刀,只有……这么大,但却有一百多常用命令

如果你的目标是小而精,busybox是首选,因为它已经精简到没有bash,使用的是ash,一个兼容posix的shell

小白docker求入门!求大佬帮忙?  Docker教程 第22张

Alpine:你的目标是小但是又有一些工具的话,可以选择alpine,它是一个面向安全的轻量linux发行版,它关注安全、性能和资源效能,比busybox功能更完善,还提供apk查询和安装软件包,大小只有2-3兆。

小白docker求入门!求大佬帮忙?  Docker教程 第23张

很多官方的镜像都有alpine的镜像,像刚刚使用的php镜像。

小白docker求入门!求大佬帮忙?  Docker教程 第24张

•提供维护者信息

•正确使用版本

使用明确的版本号,而非依赖于默认的latest,避免环境不一致导致的问题

小白docker求入门!求大佬帮忙?  Docker教程 第25张

•删除临时文件

如安装软件后的安装包,如上图2、3步骤

•提高生成速度

如内容不变的指令尽量放在前面,这样可以复用

•减少镜像层数

多条命令写在一起,使生成的镜像层数少,如上图2、3步骤

•恰当使用multi-stage

保证最终生成镜像最小化

3、常用命令想使用一个镜像,用这个命令就可以了,默认按评分排序。official如果是ok表示是官方镜,Auto标示它是否用dickerfile进行自动化镜像构建。

小白docker求入门!求大佬帮忙?  Docker教程 第26张

pull

一旦确定一个镜像,通过对其名称执行docker pull来下载。标签默认是latest,严格来讲,镜像的仓库名还应该添加仓库地址的,默认是registry.hub.docker.com Docker images命令查找下载的镜像。

小白docker求入门!求大佬帮忙?  Docker教程 第27张

run

使用docker run运行一个容器,it表示用交互式方式运行,最后表示要执行的命令。

小白docker求入门!求大佬帮忙?  Docker教程 第28张

其实更常用的方式是以后台方式来执行,这时用d参数在后台运行,运行后用exec命令进去到容器。

tag

Docker tag给镜像一个新tag名字。

Docker images查看centos镜像,把centos:latest打上centos:yeedomliu,这时再看会有3个centos,latest和yeedomliu的镜像id是相同的。把centos:yeedomliu删除,再查看latest还会存在,最后用rmi命令删除latest就会真正把latest镜像删除掉。如果相同镜像存在多个标签,只有最后一次的rmi命令会真正删除镜像。

小白docker求入门!求大佬帮忙?  Docker教程 第29张

ps

Ps可以查看运行中的容器

小白docker求入门!求大佬帮忙?  Docker教程 第30张

rmi

删除一个镜像,同一个镜像id的不同标签的镜像,使用rmi删除最后一个镜像才会真正删除这个镜像。

小白docker求入门!求大佬帮忙?  Docker教程 第31张

rm

删除docker容器,如果运行中的容器需要加-f

小白docker求入门!求大佬帮忙?  Docker教程 第32张

diff

容器启动后文件变化情况

小白docker求入门!求大佬帮忙?  Docker教程 第33张

logs

查看容器运行后的日志

小白docker求入门!求大佬帮忙?  Docker教程 第34张

cp

我们想从容器里面拷贝文件到宿主机,或相反的过程就可以用到cp命令

小白docker求入门!求大佬帮忙?  Docker教程 第35张

container prune

随着使用docker时间越长,停止状态下的容器会越来越多,这些都会占据磁盘空间

小白docker求入门!求大佬帮忙?  Docker教程 第36张

image prune

未被打标签的镜像可以用image prune命令清理

小白docker求入门!求大佬帮忙?  Docker教程 第37张

system prune/df

如果你觉得刚刚两条命令执行起来麻烦,可以用docker system prune一条命令搞定

另外用system df查看docker磁盘空间

小白docker求入门!求大佬帮忙?  Docker教程 第38张

实战了解了docker基础知识后,可进入相对实战的环节

小白docker求入门!求大佬帮忙?  Docker教程 第39张

•本地开发

我们的项目使用了很多服务,如redis/mysql/mongodb等等,如果一个个运行起来,还加上配置,容易出手,也比较麻烦

小白docker求入门!求大佬帮忙?  Docker教程 第40张

kitematic:与使用命令行管理本地容器相比,你更想使用图形工具对容器管理,官方推出的容器管理工具,通过它可以查找镜像、创建容器、配置、启停容器等管理。

小白docker求入门!求大佬帮忙?  Docker教程 第41张

小白docker求入门!求大佬帮忙?  Docker教程 第42张

这是配置容器端口和宿主机端口,目录,网络等映射界面

小白docker求入门!求大佬帮忙?  Docker教程 第43张

小白docker求入门!求大佬帮忙?  Docker教程 第44张

小白docker求入门!求大佬帮忙?  Docker教程 第45张

docker-compose

compose定位是“定义和运行多个docker容器的应用”,前身fig,目前仍然兼容fig格式的模板文件。

一条命令可以把一个复杂的应用启动起来

日常工作中,经常碰到多个容器相互完成某项任务

小白docker求入门!求大佬帮忙?  Docker教程 第46张

docker-compose示例1

默认模板文件名叫docker-compose.yml

,结构很简单,每个顶级元素为服务名称,次级信息为配置信息。这里使用了redis/mongodb/mysql/nginx镜像,分别给它们映射了本地目录、端口、密码等信息,nginx镜像需要使用redis/mysql等服务,用links命令连接进来。

小白docker求入门!求大佬帮忙?  Docker教程 第47张

docker-compose示例2

如果在本地开发,每个项目都可以像之前说的那样配置,这里提供了另外一种做法。我把公共的资源在一开始就启动,每个项目里只启动nginx镜像并关联其它的服务即可。

公共服务compose

小白docker求入门!求大佬帮忙?  Docker教程 第48张

项目compose

小白docker求入门!求大佬帮忙?  Docker教程 第49张

•常见问题

主进程:docker启动第一个进程称主进程,就是id为1的进程,这个进程退出就意味着容器退出,所以想要使docker作为服务使用,这个进程是不能退出的。expose命令是声明暴露的端口,运行时用-P才会生效。一般ports命令是做真正的端口映射,比较常用。

小白docker求入门!求大佬帮忙?  Docker教程 第50张

•架构

安装了docker的主机,一般在一个私有网络上

1、调用docker客户端可以从守护进程获取信息或发送指令

2、docker守护进程使用客户端的请求

3、私有docker注册中心存储docker镜像

4、docker hub是由docker公司运营的最大的公共注册中心

互联网上也存在其他公共的注册中心

调用 Docker客户端可以从守护进程获取信息或给它发送指令。守护进程是一个服务器,它使用 之间的媒介。

理解这张图的关键在于,当用户在自己的机器上运行 Docker时,与其进行交互的可能是自己机器上的另一个进程,或者甚至是运行在内部网络或互联网上的服务。

小白docker求入门!求大佬帮忙?  Docker教程 第51张

•优化

使用小镜像:一般来说,使用小的镜像都相对比较优秀,如官方的镜像基本上都有基于alpine的镜像

事后清理:删除镜像里软件包或一些临时文件,减小镜像大小

命令写一行:多个命令尽量写在一起有助于减少层数,也会减少镜像的大小

脚本安装:使用脚本进行初始化时,可以有效减少dockerfile的命令,同时带来另外的问题,可读性不好并且构建镜像时缓存不了

扁平化镜像:构建镜像过程中,可能会涉及到一些敏感信息,或者用了上面的办法镜像依然很大,可以试试这个办法

docker export 容器名或容器id | docker import - 镜像标签

multi-stage:从docker 17.05版本开始,docker支持multi-stage(多阶段构建),特别适合编译型语言,如我在一个镜像下编译,在另外一个很小的系统运行,如下图,go项目在golang环境下编译,在alpine环境下运行。

小白docker求入门!求大佬帮忙?  Docker教程 第52张

评论列表暂无评论
发表评论
微信