Lazy loaded image
技术分享
🗒️docker入门看这篇就够了
Words 2617Read Time 7 min
2024-5-11
2024-8-4
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启动也十分缓慢 。
  • 容器之间共享操作系统内核,但各自作为独立的进程在用户空间中运行,只是应用层之间的隔离,容器之间是共享同一套操作系统资源的,可以直接使用硬件资源。与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
  1. 物理机是这样的
    1. notion image
  1. 虚拟机是这样的
    1. notion image
  1. 容器是这样的
    1. notion image

容器和虚拟机使用场景

  • 容器
      1. 通常用于隔离不同的应用,例如前端,后端以及数据库、缓存等。
      1. 将一个整体式的应用拆分成低耦合的单个服务(微服务架构)
  • 虚拟机
      1. 擅长于彻底隔离整个运行环境, 例如云服务提供商通常采用虚拟机技术隔离不同的用户

为什么要用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项目环境

  1. 拉取php73镜像
    1. 查看镜像
      1. 根据php73镜像运行php73容器
        1. 查看正在运行的容器
          1. 进入容器
            1. 在容器里安装redis扩展
              1. 定制镜像,从容器中创建新的镜像
                1. 把带有phpredis的php镜像提交到dockerHub仓库
                  1. 根据自定义的php镜像运行容器
                    1. 拉取nginx镜像
                      1. 根据nginx镜像运行nginx容器
                        1. 停止正在运行的容器
                          1. 删除容器
                            1. 容器之间通信 --link
                              1. 查看容器信息
                                1. 查看容器中正在运行的进程

                                  docker-compose

                                  使用docker命令搭建痛点一:
                                  1. 启动参数过多
                                  1. 容器过多难以管理

                                  引入docker-compose工具

                                  介绍:

                                  docker-compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。

                                  用docker-compose 搭建

                                  • 编写 docker-compose.yml 文件
                                    • 运行容器(在.yml文件所在的跟目录)
                                      • 停止并删除所有容器

                                        DockerFile持续集成

                                        使用docker命令搭建痛点二:
                                        1. 每次向环境中增加一些扩展时比较麻烦,要进入容器安装->生成新的镜像->提交到dockerHub->其他同事拉取镜像再重新运行容器,定制镜像整个过程也比较慢;
                                        1. 构建新镜像的流程不清晰,没有记录,安装或修改了某些功能是不知道的;

                                        介绍:

                                        Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
                                        从应用软件的的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段。
                                        notion image
                                         
                                        • Dockerfile是软件的原材料
                                        • Docker镜像是软件的交付品
                                        • Docker容器则可以认为是软件的运行态
                                        • Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石

                                        通过自定义Dockerfile定制镜像

                                        1. 编写Dockerfile
                                          1. 根据Dockerfile构建出新的镜像

                                            Dockerfile执行流程大致如下:

                                            1. docker从基础镜像运行一个容器
                                            1. 执行指令并对容器做出修改
                                            1. 执行类似docker commit的操作创建一个新的镜像

                                            docker-compose里面使用Dockerfile

                                            • 编写 docker-compose.yml 文件
                                              • 启动容器
                                                • 在Dockerfile里面增加php扩展
                                                  • 重新构建镜像
                                                    • 重新创建启动容器
                                                      • 合作使用可以把docker-compose.yml和一系列的Dockerfile文件放到git仓库上,开发环境统一化,其他同事只需要拉取Dockerfile这些文件,再重新build出镜像重启容器即可;

                                                      laradock

                                                      类似于homestead
                                                      编写好的docker-compose.yml和一些通用服务的Dockerfile,能提供完成的php开发环境,开箱即用
                                                      上一篇
                                                      副业独立开发-难点
                                                      下一篇
                                                      高可用架构设计要点