type
Post
status
Published
date
May 11, 2024
slug
summary
tags
开发
后端
category
技术分享
icon
password
Docker技术分享
Docker 是一个Go语言编写的开源的应用容器引擎
概念
三大核心概念
- Images( Docker镜像):类似于vagrant的box(箱子),安装Linux系统的镜像文件。镜像是创建Docker容器的基础;一个安装了nginx的镜像,可以把它称为一个nginx镜像;镜像构建时,会一层层构建,前一层是后一层的基础。
- Container(容器):镜像运行时的实体。镜像和容器的关系有点类似于面向对象中,类和对象的关系,可以基于一个镜像运行(new)多个容器。每个容器内运行一个应用,不同的容器之间相互隔离,容器之间也可以建立通信机制。可以把每个容器看作一个简易版的Linux系统环境,以及与运行在其中的应用程序打包而成的应用盒子。
- Repository(仓库):docker仓库类似于代码仓库,它是docker集中存放镜像文件的场所,目前最大的公开仓库是官方提供的Docker Hub
次要概念
- 宿主机:就是主机,这个概念相对于子机而言的,比如你安装虚拟机或者容器的话,那么对于容器而言,你正在使用的计算机就是宿主机;
容器(Docker) VS 虚拟机(Vagrant)
- 区别
特性 | 容器 | 虚拟机 |
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
- VM(虚拟机)在宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的硬件资源,然后再安装应用;每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且VM启动也十分缓慢 。
- 容器之间共享操作系统内核,但各自作为独立的进程在用户空间中运行,只是应用层之间的隔离,容器之间是共享同一套操作系统资源的,可以直接使用硬件资源。与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
- 物理机是这样的

- 虚拟机是这样的

- 容器是这样的

容器和虚拟机使用场景
- 容器
- 通常用于隔离不同的应用,例如前端,后端以及数据库、缓存等。
- 将一个整体式的应用拆分成低耦合的单个服务(微服务架构)
- 虚拟机
- 擅长于彻底隔离整个运行环境, 例如云服务提供商通常采用虚拟机技术隔离不同的用户
为什么要用Docker
- Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;——一致的运行环境
- 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
- 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
- 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
- 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
- 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署
Docker网络通讯
网络通讯的四种模式:
网络模式 | 简介 | 适用场景 |
Host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 | 速度快,没有路由开销,不安全不在生产环境使用 |
Bridge | Docker默认的模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。 | 常用,网络通讯应用服务 |
None | 该模式关闭了容器的网络功能 | 容器并不需要网络(例如只需要写磁盘卷的批处理任务) |
Container | 和一个指定的容器共享IP、端口范围 | 容器和容器直接频繁交流情况 |
宿主机访问容器
- Host模式下直接访问
- Bridge模式下通过端口映射的方式访问,运行容器时指定-p端口映射参数,内部是通过docker0网桥以及Iptables nat表配置与宿主机通信;
容器访问宿主机
- Host模式下直接通信
- Bridge模式下在宿主机可以通过host.docker.internal,docker.for.mac.localhost等host来访问宿主机
容器之间互相访问
- Host模式下直接访问
- Bridge模式下可以通过IP直接访问,也可以启动容器A时通过--link指定连接的容器B的名称,实际是在容器A中的/etc/hosts文件配置了映射名称,可以直接在容器A中ping 容器B的名称
搭建php项目环境
- 拉取php73镜像
- 查看镜像
- 根据php73镜像运行php73容器
- 查看正在运行的容器
- 进入容器
- 在容器里安装redis扩展
- 定制镜像,从容器中创建新的镜像
- 把带有phpredis的php镜像提交到dockerHub仓库
- 根据自定义的php镜像运行容器
- 拉取nginx镜像
- 根据nginx镜像运行nginx容器
- 停止正在运行的容器
- 删除容器
- 容器之间通信 --link
- 查看容器信息
- 查看容器中正在运行的进程
docker-compose
使用docker命令搭建痛点一:
- 启动参数过多
- 容器过多难以管理
引入docker-compose工具
介绍:
docker-compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
用docker-compose 搭建
- 编写 docker-compose.yml 文件
- 运行容器(在.yml文件所在的跟目录)
- 停止并删除所有容器
DockerFile持续集成
使用docker命令搭建痛点二:
- 每次向环境中增加一些扩展时比较麻烦,要进入容器安装->生成新的镜像->提交到dockerHub->其他同事拉取镜像再重新运行容器,定制镜像整个过程也比较慢;
- 构建新镜像的流程不清晰,没有记录,安装或修改了某些功能是不知道的;
介绍:
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
从应用软件的的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段。

- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态
- Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石
通过自定义Dockerfile定制镜像
- 编写Dockerfile
- 根据Dockerfile构建出新的镜像
Dockerfile执行流程大致如下:
- docker从基础镜像运行一个容器
- 执行指令并对容器做出修改
- 执行类似docker commit的操作创建一个新的镜像
docker-compose里面使用Dockerfile
- 编写 docker-compose.yml 文件
- 启动容器
- 在Dockerfile里面增加php扩展
- 重新构建镜像
- 重新创建启动容器
- 合作使用可以把docker-compose.yml和一系列的Dockerfile文件放到git仓库上,开发环境统一化,其他同事只需要拉取Dockerfile这些文件,再重新build出镜像重启容器即可;
laradock
类似于homestead
编写好的docker-compose.yml和一些通用服务的Dockerfile,能提供完成的php开发环境,开箱即用
- Author:自律小嘉同学
- URL:https://blog.notionedu.com/article/3ef11847-48ea-4b68-83de-ad33821689ec
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!






