使用docker-compose提升团队开发效率

  • 发表于2021-12-31

使用docker-compose提升团队开发效率

docker-compose能解决那个团队开发合配中的痛点。

  • 和生产环境保持一致,防止环境问题引发的bug。
  • 减少开发时成员的依赖。
  • 快速创建项目所需运行环境,隔离多个项目间的环境干扰。
  • 快速复位。

docker是什么

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。
Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。

Docker容器与虚拟机类似,但二者在原理上不同。
容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。
容器更多的用于表示 软件的一个标准化单元。
由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方
另外,Docker也为容器提供更强的业界的隔离兼容。

Docker 利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。
这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担

Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。
从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,

docker与docker-compose安装

请参阅官方安装文档
mac与windowns安装包同时包含docker与docker-compose。(ps: windowns 系统需要依赖 WSL 2 或 Hyper-V)
linux 则需分别安装

bash
# 安装依赖
$ sudo apt-get update && apt-get install ca-certificates curl gnupg lsb-release
# 添加docker 官方源
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 安装docker
$ sudo apt-get update && apt-get install docker-ce docker-ce-cli containerd.io

# 安装docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

验证安装

在终端或cmd命令行执行docker -v 和 docker-compose -v

bash
$ docker -v 
Docker version 20.10.11, build dea9396

$ docker-compose -v 
docker-compose version 1.29.2, build 5becea4c

docker基础

name
image 镜像 可通dockerfile生成
container 容器 运行单一任务或服务,容器内文件在(可简单理解为image的运行时)
volume 数据卷 用来存储持久数据
network 虚拟网络 组成容器间的虚拟网络

运行一个简单的docker镜像

bash
$ docker run hello-world 
$ docker run  --name "demo"  hello-world

使用 Docker Compose

由于程序环境往往需要多个服务(容器)支撑,而直接使用docker cli,难于管理多个的容器启停以及容器间的网络,依赖,端口等等。 所以我们需要一个工具 docker-compose。

Docker Compose 是一种工具,用于帮助定义和共享多容器应用程序。 通过 Compose,你可以创建 YAML 文件来定义服务,并且只需一个命令,就可以启动或清理所有内容。

使用 Compose 的巨大优点是,你可以在文件中定义应用程序堆栈,使其位于项目存储库的根目录下(它现在受版本控制),并方便其他人参与你的项目。 其他人只需克隆你的存储库即可开始撰写应用。 事实上,你可能会看到 GitHub/GitLab 上的很多项目现在都是这样做的。 引用于docs.microsoft.com

docker-compose可通过 yml文件来定义要管理的容器及其各种参数

YAML
#docker-compose.yml 常用字段/属性
version: '3' docker-compose.yml文件版本
services: # 服务(容器)节点
  db: # 容器名
    platform: linux/x86_64 # 平台
    # image 与 build 只能同时存在一个
    image: php-fpm:7.3 # 镜像
    build: # 自定义镜像打包配置,
      context: ./server-conf # 打包时上下文,默认./(简单理解为dockerfile位置)
      dockerfile: dockerfile # dockerfile文件名
      args: # 打包时变量
        PHP_VERSION: 7.3
    links: dd 
      - db
    depends_on:
      - db
    ports: # 端口映射(ps:docker会绕过部分右本机防火墙限制)
      - "9160:3306" #将本机9160端口映射到容器内的3360
    environment: # 传递给容器的环境变量
      MYSQL_ROOT_PASSWORD # 从.env文件或系统环境变量读取
      MYSQL_DATABASE: devdb
    volumes: # 文件映射
      - "./db:/var/lib/mysql" # 将本机当前目录db的文件夹映射到容器内的/var/lib/mysql文件夹
      #- dbdata:/var/lib/mysql
      #- "./develop/devdb.sql:/docker-entrypoint-initdb.d/devdb.sql"
    # command 容器启动参数(具体从对应image的说明文档获取)
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general_log=on
    networks: # 虚拟网络
      - webnet
networks:
  webnet:

docker-compose 常用命令

bash
$ #docker-compose up|stop|restart|rm|build 
docker-compose up -d 
docker-compose build --no-cache

dockerfile

bash
FROM ubuntu # 基于ubuntu镜像构建
RUN apt-get clean
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php
ARG PHP_VERSION # 声明构建环境变量,仅下一行可用。
RUN apt-get update \
    && apt-get install -y wget curl nano \
        php${PHP_VERSION} \
        php${PHP_VERSION}-fpm \
    && apt-get clean
# 从网络下载文件
RUN wget https://mirrors.aliyun.com/composer/composer.phar
RUN mv composer.phar /usr/local/bin/composer
RUN chmod +x /usr/local/bin/composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
RUN composer global require "laravel/lumen-installer"
RUN mkdir /var/log/php-fpm/
RUN chmod -R 775 /var/log/php-fpm/
# 从本机复制文件到镜像
RUN mkdir /demo
COPY ./src /demo

EXPOSE 9000 #声明容器可用端口
ARG PHP_VERSION # 声明构建环境变量,仅下一行可用。
ENV PHP_VERSION ${PHP_VERSION}  # ENV 设置镜像运行时环境变量

CMD /etc/init.d/php${PHP_VERSION}-fpm start && tail -F /var/log/php-fpm/access.log
WORKDIR /var/www/html

总结

在团队中推行使用docker作为开发环境,核心开发人员配置好docker-compose.yml中各自负责的服务后。
其它成员只须安装好docker,然后记住一个命令 docker-compose up -d.