容器网络是容器技术中重要的一部分,它提供了容器之间通信的基础设施。本文将介绍容器网络的原理,包括容器网络模型、容器网络命名与发现、容器网络驱动和容器网络的实现方式等内容,帮助读者理解容器网络的工作原理。

一、引言

容器网络是容器技术中的关键组成部分,它使得容器之间可以进行通信和交互。容器网络的设计和实现需要考虑多个因素,如网络隔离、性能、安全性等。了解容器网络的原理对于正确配置和管理容器网络非常重要。

二、容器网络模型

容器网络模型定义了容器之间如何进行通信和连接。常见的容器网络模型有三种:主机模式、桥接模式和Overlay模式。

主机模式(Host Mode):容器直接使用主机的网络栈,与主机共享IP地址和端口,容器与主机之间没有隔离,适合需要直接访问主机网络的场景。

桥接模式(Bridge Mode):容器通过虚拟网桥连接到宿主机,每个容器分配一个唯一的IP地址,并与其他容器通过虚拟网桥进行通信,实现容器之间的隔离和互通。

Overlay模式(Overlay Mode):容器通过虚拟网络层在多个宿主机之间建立逻辑连接,形成一个虚拟的容器网络,容器可以跨越多个宿主机进行通信。

三、容器网络命名与发现

容器网络命名与发现解决了容器之间如何识别和寻址的问题。常见的容器网络命名与发现技术有两种:DNS和服务发现。

1、DNS(Domain Name System):使用域名解析系统将容器名称映射到相应的IP地址,容器可以通过域名来访问其他容器。这种方式需要有一个DNS服务器来管理容器的名称解析。

2、服务发现(Service Discovery):使用服务发现工具和机制,通过容器标签或服务名称来查找和连接其他容器。服务发现可以通过集中式的服务注册中心或分布式的服务发现机制来实现。

四、容器网络驱动

容器网络驱动是实现容器网络的关键组件,它负责将容器的网络配置和管理操作传递给底层的网络设备和服务。常见的容器网络驱动有三种:网桥驱动、Overlay驱动和直接路由驱动。

1、网桥驱动(Bridge Driver):使用Linux虚拟网桥将容器连接到宿主机的网络,实现容器之间的通信和网络隔离。网桥驱动常用于桥接模式下的容器网络,它创建和管理虚拟网桥以及与之关联的虚拟网络接口。

2、Overlay驱动(Overlay Driver):通过在宿主机之间创建虚拟网络层,实现容器的跨主机通信。Overlay驱动使用隧道技术将容器的网络流量封装在底层网络中进行传输,提供了可扩展和跨主机的容器网络解决方案。

3、直接路由驱动(Direct Routing Driver):直接路由驱动使用主机的网络栈和路由表来处理容器的网络流量。容器的网络流量被直接路由到目标容器,不经过额外的网络中转,提高了网络性能和效率。

五、容器网络的实现方式

容器网络的实现方式多种多样,下面介绍几种常见的实现方式:

1、使用Linux Bridge虚拟网络接口:在宿主机上创建Linux虚拟网桥,并将容器连接到虚拟网络接口上,实现容器之间的通信和网络隔离。

2、使用Overlay网络:通过在宿主机之间建立Overlay网络,利用隧道技术将容器的网络流量封装在底层网络中传输,实现容器的跨主机通信。

3、使用SDN(Software-Defined Networking)技术:SDN技术将网络的控制平面和数据平面分离,通过集中式的控制器对容器网络进行管理和配置,提供灵活的网络编程和管理能力。

4、使用容器编排工具:容器编排工具如KubernetesDocker Swarm等提供了容器网络的管理和配置功能,通过定义网络策略和服务发现机制,实现容器之间的通信和服务发现。

六、总结

容器网络是容器技术中非常重要的一部分,它提供了容器之间通信和连接的基础设施。容器网络模型、容器网络命名与发现、容器网络驱动和容器网络的实现方式是容器网络的关键要素。了解容器网络的工作原理有助于正确配置和管理容器网络,提高容器化应用程序的性能和可靠性。未来,随着容器技术的发展和创新,容器网络将继续演化和完善,为构建分布式应用程序提供更好的网络支持。

转载请注明出处:https://www.cloudnative-tech.com/introduction/4491.html

直接下载我准备好的 docker 镜像

git clone https://github.com/libenfu/docker-example.git

安装 centos 7 操作系统 内部的 DockerFile yum 及 编译一些基础库

cd centos 
sh build.sh 
cd ..

构建php

cd php-build 
sh build.sh
cd .. 

docker compose 构建开发环境

cd 进入 2.lnmp-example 找到 docker-compose.yml 就可以构建了

# 构建
docker-compose up -d --build 

# down
docker-compose down

先看下 docker-compose.yml 配置

version: "3.3"

services:
  nginx:
    build: ./nginx
    ports:
      - "8899:80"
    volumes:
      - ./nginx/logs:/var/logs/nginx/:rw
    networks:
      - backend

  cgi:
    build: ./cgi
    ports:
      - "9000"
    tty: true
    volumes:  
      - ./cgi/MyAdmin:/var/www
    networks:
       - backend

  mysql:
    image: "mysql:5.7"
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/data/mysql 
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/logs:/logs
      - ./mysql/data:/var/lib/mysql 
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    networks:
      - backend
  redis:
    image: "redis"
    ports:
      - "6379:6379"
    networks:
      - backend

networks:
  backend:

上面的配置参数可以在我其他docker相关文章中找到注释, 这里不详细介绍了.

开始搞起 FastAdmin

官方文档 : https://doc.fastadmin.net/doc/install.html

1. 克隆FastAdmin到你本地

#创建项目目录
mkdir -p 2.lnmp-example/cgi/MyAdmin
cd 2.lnmp-example/cgi/MyAdmin

# git 拉取代码
git clone https://gitee.com/karson/fastadmin.git

# 文件移动上来
mv fastadmin/* ./ 

cgi 和 `nginx 中配置 已经将默认工作目录指定为 /var/www , 在 docker-compose.yml 中已经共享文件的方式 cgi/MyAdmin:/var/www

2. 下载前端插件依赖包

bower install 指令抛错 提示可以授权root

root@123: bower install --allow-root​

Unable to find a suitable version for jspdf, please choose one by typing one of the numbers below:
    1) jspdf#~1.0.178 which resolved to 1.0.272 and is required by jspdf-autotable#2.0.17
    2) jspdf#1.3.2 - 1.3.4 which resolved to 1.3.4 and is required by tableExport.jquery.plugin#1.10.14

Prefix the choice with ! to persist it to bower.json

? Answer 1
bower install       jquery.cookie#1.4.1
bower install       toastr#2.1.3
bower install       fastadmin-addtabs#1.0.4
bower install       bootstrap-select#1.11.2
bower install       require-css#0.1.10
bower install       fastadmin-layer#3.1.3
bower install       jcrop#2.0.4
bower install       bootstrap-table#1.11.3
bower install       nice-validator#1.1.4
bower install       art-template#3.1.3
bower install       bootstrap-slider#879a98dcd0
bower install       fastadmin-dragsort#1.0.0
bower install       fastadmin-cxselect#1.4.1
bower install       jquery-slimscroll#1.3.8
bower install       fastadmin-selectpage#1.0.2
bower install       bootstrap-daterangepicker#2.1.27
bower install       plupload#2.2.1
bower install       requirejs-plugins#1.0.3
bower install       jquery#2.2.4
bower install       fastadmin-citypicker#1.3.2
bower install       Sortable#1.10.2
bower install       jstree#3.3.8
bower install       moment#2.24.0
bower install       less#2.7.3
bower install       eonasdan-bootstrap-datetimepicker#4.17.47
bower install       tableExport.jquery.plugin#1.10.14
bower install       file-saver#2.0.2
bower install       es6-promise#4.2.4
bower install       html2canvas#0.4.1
bower install       jspdf-autotable#2.0.17
bower install       font-awesome#4.7.0
bower install       jspdf#1.0.272
bower install       bootstrap#3.4.1

jquery.cookie#1.4.1 bower_components/jquery.cookie
└── jquery#2.2.4

toastr#2.1.3 bower_components/toastr
└── jquery#2.2.4

fastadmin-addtabs#1.0.4 bower_components/fastadmin-addtabs

bootstrap-select#1.11.2 bower_components/bootstrap-select
└── jquery#2.2.4

require-css#0.1.10 bower_components/require-css

fastadmin-layer#3.1.3 bower_components/fastadmin-layer

jcrop#2.0.4 bower_components/jcrop

bootstrap-table#1.11.3 bower_components/bootstrap-table

nice-validator#1.1.4 bower_components/nice-validator
└── jquery#2.2.4

art-template#3.1.3 bower_components/art-template

bootstrap-slider#879a98dcd0 bower_components/bootstrap-slider

fastadmin-dragsort#1.0.0 bower_components/fastadmin-dragsort
└── jquery#2.2.4

fastadmin-cxselect#1.4.1 bower_components/fastadmin-cxselect

jquery-slimscroll#1.3.8 bower_components/jquery-slimscroll

fastadmin-selectpage#1.0.2 bower_components/fastadmin-selectpage

bootstrap-daterangepicker#2.1.27 bower_components/bootstrap-daterangepicker
├── jquery#2.2.4
└── moment#2.24.0

plupload#2.2.1 bower_components/plupload

requirejs-plugins#1.0.3 bower_components/requirejs-plugins

jquery#2.2.4 bower_components/jquery

fastadmin-citypicker#1.3.2 bower_components/fastadmin-citypicker
└── jquery#2.2.4

Sortable#1.10.2 bower_components/Sortable

jstree#3.3.8 bower_components/jstree
└── jquery#2.2.4

moment#2.24.0 bower_components/moment

less#2.7.3 bower_components/less

eonasdan-bootstrap-datetimepicker#4.17.47 bower_components/eonasdan-bootstrap-datetimepicker
├── jquery#2.2.4
└── moment#2.24.0

tableExport.jquery.plugin#1.10.14 bower_components/tableExport.jquery.plugin
├── es6-promise#4.2.4
├── file-saver#2.0.2
├── html2canvas#0.4.1
├── jquery#2.2.4
├── jspdf#1.0.272
└── jspdf-autotable#2.0.17

file-saver#2.0.2 bower_components/file-saver

es6-promise#4.2.4 bower_components/es6-promise

html2canvas#0.4.1 bower_components/html2canvas

jspdf-autotable#2.0.17 bower_components/jspdf-autotable
└── jspdf#1.0.272

font-awesome#4.7.0 bower_components/font-awesome

jspdf#1.0.272 bower_components/jspdf

bootstrap#3.4.1 bower_components/bootstrap
└── jquery#2.2.4

3. 下载PHP依赖包 composer install

composer 用过的朋友们都知道国内非常慢. 通过修改 composer.json 添加

{
  "repositories": {
    "packagist": {
      "type": "composer",
      "url": "https://packagist.phpcomposer.com"
    }
  }
}

也可以在项目目录下 使用指令 composer config repo.packagist composer https://packagist.phpcomposer.com 会追加在 composer.json 文件中.

诶 这个依赖库太夸张了 太多了.... 老家网速也不给力快1小时了...... 用国内加速也是很给力....

[root@95fe8e8bf9b4 www]# composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)



Package operations: 30 installs, 0 updates, 0 removals
As there is no 'unzip' command installed zip files are being unpacked using the PHP zip extension.
This may cause invalid reports of corrupted archives. Besides, any UNIX permissions (e.g. executable) defined in the archives will be lost.
Installing 'unzip' may remediate them.
  - Installing topthink/think-installer (v1.0.12): Downloading (100%)         
  - Installing symfony/polyfill-mbstring (v1.13.1): Downloading (100%)         
  - Installing psr/http-message (1.0.1): Downloading (100%)         
  - Installing paragonie/random_compat (v9.99.99): Downloading (100%)         
  - Installing symfony/polyfill-php70 (v1.13.1): Downloading (100%)         
  - Installing symfony/http-foundation (v3.4.37): Downloading (100%)         
  - Installing symfony/psr-http-message-bridge (v1.2.0): Downloading (100%)         
  - Installing ralouphie/getallheaders (3.0.3): Downloading (100%)         
  - Installing guzzlehttp/psr7 (1.6.1): Downloading (100%)         
  - Installing guzzlehttp/promises (v1.3.1): Downloading (100%)         
  - Installing guzzlehttp/guzzle (6.5.2): Downloading (100%)         
  - Installing doctrine/cache (v1.4.4): Downloading (100%)         
  - Installing overtrue/socialite (1.3.0): Downloading (100%)         
  - Installing psr/log (1.1.2): Downloading (100%)         
  - Installing monolog/monolog (1.25.3): Downloading (100%)         
  - Installing psr/container (1.0.0): Downloading (100%)         
  - Installing pimple/pimple (v3.2.3): Downloading (100%)         
  - Installing overtrue/wechat (3.3.33): Downloading (100%)         
  - Installing symfony/options-resolver (v3.4.37): Downloading (100%)         
  - Installing endroid/qr-code (1.9.3): Downloading (100%)         
  - Installing topthink/framework (v5.0.24): Downloading (100%)         
  - Installing topthink/think-captcha (v1.0.8): Downloading (connecting...)


Downloading (100%)         
  - Installing mtdowling/cron-expression (v1.2.3): Downloading (100%)         
  - Installing phpmailer/phpmailer (v5.2.27): Downloading (100%)         
  - Installing karsonzhang/fastadmin-addons (1.1.10): Downloading (100%)         
  - Installing overtrue/pinyin (3.0.6): Downloading (100%)         
  - Installing psr/simple-cache (1.0.1): Downloading (100%)         
  - Installing markbaker/matrix (1.2.0): Downloading (100%)         
  - Installing markbaker/complex (1.4.7): Downloading (100%)         
  - Installing phpoffice/phpspreadsheet (1.10.1): Downloading (60%)          




Downloading (100%)
paragonie/random_compat suggests installing ext-libsodium (Provides a modern crypto API that can be used to generate random bytes.)
symfony/psr-http-message-bridge suggests installing nyholm/psr7 (For a super lightweight PSR-7/17 implementation)
guzzlehttp/psr7 suggests installing zendframework/zend-httphandlerrunner (Emit PSR-7 responses)
guzzlehttp/guzzle suggests installing ext-intl (Required for Internationalized Domain Name (IDN) support)
monolog/monolog suggests installing graylog2/gelf-php (Allow sending log messages to a GrayLog2 server)
monolog/monolog suggests installing sentry/sentry (Allow sending log messages to a Sentry server)
monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server)
monolog/monolog suggests installing ruflin/elastica (Allow sending log messages to an Elastic Search server)
monolog/monolog suggests installing php-amqplib/php-amqplib (Allow sending log messages to an AMQP server using php-amqplib)
monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required))
monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server)
monolog/monolog suggests installing mongodb/mongodb (Allow sending log messages to a MongoDB server via PHP Driver)
monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages to AWS services like DynamoDB)
monolog/monolog suggests installing rollbar/rollbar (Allow sending log messages to Rollbar)
monolog/monolog suggests installing php-console/php-console (Allow sending log messages to Google Chrome)
phpmailer/phpmailer suggests installing league/oauth2-google (Needed for Google XOAUTH2 authentication)
phpoffice/phpspreadsheet suggests installing mpdf/mpdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing dompdf/dompdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing tecnickcom/tcpdf (Option for rendering PDF with PDF Writer)
phpoffice/phpspreadsheet suggests installing jpgraph/jpgraph (Option for rendering charts, or including charts with PDF or HTML Writers)
Package mtdowling/cron-expression is abandoned, you should avoid using it. Use dragonmantank/cron-expression instead.
Writing lock file
Generating autoload files

4. 一键创建数据库并导入数据

php think install -u 数据库用户名 -p 数据库密码
不懂就 php think help install

我直接页面设置的数据库配置

... 安装成功

对了有个很坑的地方 如果使用 nginx 自己配置对我来说有些困难 从网上找都不靠谱 还是看官方文档 例子如下: ...
https://doc.fastadmin.net/docs/faq.html#toc-18

server {
        listen       80;
        server_name  www.fa.com *.fa.com;
        root   "C:/phpstudy/WWW/fastadmin/public";
        location / {
            index  index.html index.htm index.php;
            #主要是这一段一定要确保存在
            if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?s=/$1  last;
                break;
            }
            #结束
            #autoindex  on;
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

本文将探讨Docker镜像和容器之间的差异,帮助您了解如何以及何时使用它们。
Docker容器化平台有助于使用容器轻松创建、部署和运行应用程序。如果您是Docker新手,您可能想知道Docker映像与Docker容器有何不同。尽管Docker镜像和容器具有相似的目的,但它们有不同的用途。镜像是环境的快照,容器运行软件。将容器视为软件的运输容器-它保存文件和程序等重要内容,以便应用程序可以有效地从生产者交付给消费者。

Docker概述

DockerFlatpakSnaps等解决方案都有相同的目标,即将应用程序打包到单个捆绑包中以安装在任何Linux发行版中。

SolomonHykes2013年将Docker作为一个开源项目推出。他们的第一个商业版本已于2014年准备投入生产。

容器化的最大好处之一是,它使开发人员能够将其应用程序与在任何Linux发行版上运行所需的所有依赖项打包在一起。这样就无需手动安装每个依赖项。

多个容器可以同时运行,每个容器都基于相同或不同的映像。Docker在创建操作系统的多个实例方面与虚拟机类似。但是,Docker允许您创建在同一操作系统上运行的容器。因此,在给定的硬件组合上可以运行比虚拟机更多的容器。

Docker容器甚至可以在虚拟机中运行。与创建虚拟机相比,Docker提供了额外的抽象和自动化层,使其更易于使用。

容器化平台在开发人员和系统管理员中越来越受欢迎,因为它包含应用程序的完整文件系统及其所有依赖项。此设置支持不可变的基础架构并保证部署是幂等的-无论您重复操作多少次,它们都将保持完全相同。

Docker守护进程在后台运行以管理映像、容器等。客户端和守护程序使用套接字或通过RESTfulAPI进行通信。

Xnip2024-02-20_10-56-18.png

什么是Docker镜像?

图像是只读模板,包含创建容器的说明。Docker镜像创建在Docker平台上运行的容器。

将图像想象成容器运行时内容的蓝图或快照。

图像由多个堆叠层组成,就像照片编辑器中的层一样,每个层都会改变环境中的某些内容。映像包含运行应用程序的代码或二进制文件、运行时、依赖项和其他文件系统对象。该映像依赖于主机操作系统(OS)内核。

例如,要构建Web服务器映像,请从包含UbuntuLinux(基本操作系统)的映像开始。然后,在上面添加Apache和PHP等软件包。

您可以使用Dockerfile手动构建映像,Dockerfile是一个包含创建Docker映像的所有命令的文本文档。您还可以使用命令从称为注册表的中央存储库或DockerHub等存储库中提取映像dockerpull[name]

Docker用户运行一个镜像时,它会成为一个或多个容器实例。容器的初始状态可以是开发人员想要的任何状态——它可能有一个已安装和配置的Web服务器,或者只有一个以root身份运行的bashshell。但实际上,大多数映像都包含一些预配置的软件和配置文件。

Docker镜像是不可变的,因此一旦创建就无法更改。如果您需要更改某些内容,请使用您的更改创建另一个容器,然后将其另存为另一个图像。或者,只需使用现有映像作为基础来运行新容器并更改该容器即可。

成功构建应用程序后,Docker可以进一步将镜像导出到其他镜像中。彼此派生的图像通常称为父图像和子图像。

一张图片可能有多个标签,但每个标签都是唯一的。标签区分图像,例如ubuntu:latestubuntu:14.04

映像本身并不运行,但您可以从Docker映像创建并运行容器。

什么是容器?

容器是一个隔离的地方,应用程序在其中运行,不会影响系统的其余部分,也不会让系统影响应用程序。由于容器是隔离的,因此非常适合安全运行的软件,例如数据库或Web应用程序,这些软件需要访问敏感资源,而无需向系统上的每个用户授予访问权限。

由于容器在Linux上本机运行并共享主机的内核,因此它是轻量级的,不会比其他可执行文件使用更多的内存。如果您停止容器,它不会自动重新启动,除非您以这种方式配置它。然而,容器比虚拟机更高效,因为它们不需要整个操作系统的开销。它们与其他容器共享单个内核,并在几秒钟而不是几分钟内启动。

您可以使用容器将应用程序及其所需的所有组件打包,然后将其作为一个单元全部发送出去。这种方法很受欢迎,因为它消除了开发、质量保证和生产环境之间的摩擦,从而实现了更快的软件交付。在软件容器内构建和部署应用程序可以消除与其他开发人员协作编写代码时“在我的机器上运行”的问题。

这些应用程序还可以在任何基础设施和任何云中运行。您可以将应用程序及其底层基础设施与其他应用程序隔离。

Docker镜像与容器

Docker镜像在Docker容器中执行代码。您可以在Docker映像上添加核心功能的可写层来创建正在运行的容器。

Docker容器视为正在运行的映像实例。您可以从同一个映像创建许多容器,每个容器都有自己独特的数据和状态。

虽然镜像不是创建容器的唯一方式,但却是一种常用的方法。

采用容器的一个主要好处是开发、操作和测试的标准化和简化。然而,为了让团队充分利用容器,他们需要确保开发人员、运营工程师和测试人员创建一致的环境。

持续集成和持续部署(CI/CD)管道可以构建、测试和打包容器。然后,部署将该容器分发到运行时环境,在该环境中它可以作为应用程序的一部分执行。

结论

容器和镜像都允许用户指定应用程序依赖项和配置,并描述机器运行该应用程序所需的一切。然而,容器和镜像有不同的生命周期。例如,您可以在PivotalCloudFoundry等基于容器的系统上使用容器,但不能使用映像。同样,您可以在HerokuOpenShift等非容器系统中使用映像,但不能使用容器。

这不是选择容器或图像的问题。它们相互依赖,并且您需要两者都与Docker一起工作。

现在您已经了解了Docker映像容器之间的细微差别,您可以充分利用Docker平台。使用Docker时,自动化可帮助您快速集成并释放开发人员时间来创建新的应用程序功能。

转载请注明出处:https://www.cloudnative-tech.com/introduction/5996.html

晕死了 好好地运行容器, 突然就一直抛错


bogon:2.lnmp-example admin$ docker-compose up -d --build 
Building nginx
Traceback (most recent call last):
  File "site-packages/dockerpycreds/store.py", line 80, in _execute
  File "subprocess.py", line 356, in check_output
  File "subprocess.py", line 438, in run
subprocess.CalledProcessError: Command '['/usr/local/bin/docker-credential-desktop', 'get']' returned non-zero exit status 1.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "site-packages/docker/auth.py", line 264, in _resolve_authconfig_credstore
  File "site-packages/dockerpycreds/store.py", line 35, in get
  File "site-packages/dockerpycreds/store.py", line 93, in _execute
dockerpycreds.errors.StoreError: Credentials store docker-credential-desktop exited with "error getting credentials - err: exit status 1, out: `User interaction is not allowed.`".

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker-compose", line 6, in <module>
  File "compose/cli/main.py", line 71, in main
  File "compose/cli/main.py", line 127, in perform_command
  File "compose/cli/main.py", line 1085, in up
  File "compose/cli/main.py", line 1081, in up
  File "compose/project.py", line 527, in up
  File "compose/service.py", line 344, in ensure_image_exists
  File "compose/service.py", line 1084, in build
  File "site-packages/docker/api/build.py", line 260, in build
  File "site-packages/docker/api/build.py", line 307, in _set_auth_headers
  File "site-packages/docker/auth.py", line 304, in get_all_credentials
  File "site-packages/docker/auth.py", line 281, in _resolve_authconfig_credstore
docker.errors.DockerException: Credentials store error: StoreError('Credentials store docker-credential-desktop exited with "error getting credentials - err: exit status 1, out: `User interaction is not allowed.`".',)
[88967] Failed to execute script docker-compose

百度找了下原因:
Docker 默认设置,将Docker登录安全地存储在MacOS密钥链中造成的,取消这个设置就可以解决,具体细节请自行谷歌。

解决:

依次点击 :Docker 图标 >> Preference >> General
取消勾选 Securely store Docker logins in macOS keychian,
重新运行 docker-compose up ,问题解决。

先来看一份 docker-compose.yml 文件,不用管这是干嘛的,只是有个格式方便后文解说:

version: '2'
services:
  web:
    image: dockercloud/hello-world
    ports:
      - 8080
    networks:
      - front-tier
      - back-tier

  redis:
    image: redis
    links:
      - web
    networks:
      - back-tier

  lb:
    image: dockercloud/haproxy
    ports:
      - 80:80
    links:
      - web
    networks:
      - front-tier
      - back-tier
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 

networks:
  front-tier:
    driver: bridge
  back-tier:
driver: bridge

可以看到一份标准配置文件应该包含 version、services、networks 三大部分,其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则。

1. image

services:
  web:
    image: hello-world

在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。
image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
例如下面这些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

2. build

服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。

build: /path/to/build/dir

也可以是相对路径,只要上下文确定就可以读取到 Dockerfile

build: ./dir

设定上下文根目录,然后以该目录为准指定 Dockerfile

build:
  context: ../
  dockerfile: path/of/Dockerfile

注意 build 都是一个目录,如果你要指定 Dockerfile 文件需要在 build 标签的子级标签中使用 dockerfile 标签指定,如上面的例子。
如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字。

build: ./dir
image: webapp:tag

既然可以在 docker-compose.yml 中定义构建任务,那么一定少不了 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:

build:
  context: .
  args:
    buildno: 1
    password: secret

下面这种写法也是支持的,一般来说下面的写法更适合阅读。

build:
  context: .
  args:
    - buildno=1
    - password=secret

ENV 不同的是,ARG 是允许空值的。例如:

args:
  - buildno
  - password

这样构建过程可以向它们赋值。

注意:YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。

3. command

使用 command 可以覆盖容器启动后默认执行的命令。

command: bundle exec thin -p 3000

也可以写成类似 Dockerfile 中的格式:

command: [bundle, exec, thin, -p, 3000]

4.container_name

前面说过 Compose 的容器名称格式是:<项目名称><服务名称><序号>
虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定:

container_name: app

这样容器的名字就指定为 app 了。

5.depends_on

在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。
例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。
例如下面容器会先启动 redisdb 两个服务,最后才启动 web 服务:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。

6.dns

--dns 参数一样用途,格式如下:

dns: 8.8.8.8

也可以是一个列表:

dns:
  - 8.8.8.8
  - 9.9.9.9

此外 dns_search 的配置也类似:

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

7. tmpfs

挂载临时目录到容器内部,与 run 的参数一样效果:

tmpfs: /run
tmpfs:
  - /run
  - /tmp

8. entrypoint

Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点,第四章有对比过与 CMD 的区别。
docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义:

entrypoint: /code/entrypoint.sh

格式和 Docker 类似,不过还可以写成这样:

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

9.env_file

还记得前面提到的 .env 文件吧,这个文件可以设置 Compose 的变量。而在 docker-compose.yml 中可以定义一个专门存放变量的文件。
如果通过 docker-compose -f FILE 指定了配置文件,则 env_file 中路径会使用配置文件路径。

如果有变量名称与 environment 指令冲突,则以后者为准。格式如下:

env_file: .env

或者根据 docker-compose.yml 设置多个:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

注意的是这里所说的环境变量是对宿主机的 Compose 而言的,如果在配置文件中有 build 操作,这些变量并不会进入构建过程中,如果要在构建中使用变量还是首选前面刚讲的 arg 标签。

10. environment

与上面的 env_file 标签完全不同,反而和 arg 有几分类似,这个标签的作用是设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置,这是与 arg 最大的不同。
一般 arg 标签的变量仅用在构建过程中。而 environmentDockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

11. expose

这个标签与Dockerfile中的EXPOSE指令一样,用于指定暴露的端口,但是只是作为一种参考,实际上docker-compose.yml的端口映射还得ports这样的标签。

expose:
 - "3000"
 - "8000"

12. external_links

在使用Docker过程中,我们会有许多单独使用docker run启动的容器,为了使Compose能够连接这些不在docker-compose.yml中定义的容器,我们需要一个特殊的标签,就是external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。
格式如下:

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

13. extra_hosts

添加主机名的标签,就是往/etc/hosts文件中添加一些记录,与Docker client--add-host类似:

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

启动之后查看容器内部hosts:

162.242.195.82  somehost
50.31.209.229   otherhost

14. labels

向容器添加元数据,和Dockerfile的LABEL指令一个意思,格式如下:

labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""
labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

15. links

还记得上面的depends_on吧,那个标签解决的是启动顺序问题,这个标签解决的是容器连接问题,与Docker client--link一样效果,会连接到其它服务中的容器。
格式如下:

links:
 - db
 - db:database
 - redis

使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:

172.12.2.186  db
172.12.2.186  database
172.12.2.187  redis

相应的环境变量也将被创建。

16. logging

这个标签用于配置日志服务。格式如下:

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

默认的driverjson-file。只有json-filejournald可以通过docker-compose logs显示日志,其他方式有其他日志查看方式,但目前Compose不支持。对于可选值可以使用options指定。
有关更多这方面的信息可以阅读官方文档:
https://docs.docker.com/engine/admin/logging/overview/

17. pid

pid: "host"

将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间。

18. ports

映射端口的标签。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。

19. security_opt

为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签。比如设置全部服务的user标签值为USER。

security_opt:
  - label:user:USER
  - label:role:ROLE

20. stop_signal

设置另一个信号来停止容器。在默认情况下使用的是SIGTERM停止容器。设置另一个信号可以使用stop_signal标签。

stop_signal: SIGUSR1

21. volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。
Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。
数据卷的格式可以是下面多种形式:

volumes:
  // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql

  // 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql

  // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache

  // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro

  // 已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql

如果你不使用宿主机的路径,你可以指定一个volume_driver

volume_driver: mydriver

22. volumes_from

从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的。

volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

23. cap_add, cap_drop

添加或删除容器的内核功能。详细信息在前面容器章节有讲解,此处不再赘述。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

24. cgroup_parent

指定一个容器的父级cgroup

cgroup_parent: m-executor-abcd

25. devices

设备映射列表。与Docker client--device参数类似。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

26. extends

这个标签可以扩展另一个服务,扩展内容可以是来自在当前文件,也可以是来自其他文件,相同服务的情况下,后来者会有选择地覆盖原有配置。

extends:
  file: common.yml
  service: webapp

用户可以在任何地方使用这个标签,只要标签内容包含fileservice两个值就可以了。file的值可以是相对或者绝对路径,如果不指定file的值,那么Compose会读取当前YML文件的信息。
更多的操作细节在后面的12.3.4小节有介绍。

27. network_mode

网络模式,与Docker client--net参数类似,只是相对多了一个service:[service name] 的格式。
例如:

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

可以指定使用服务或者容器的网络。

28. networks

加入指定网络,格式如下:

services:
  some-service:
    networks:
     - some-network
     - other-network

关于这个标签还有一个特别的子标签aliases,这是一个用来设置服务别名的标签,例如:

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

相同的服务可以在不同的网络有不同的别名。

29. 其它

还有这些标签:cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir
上面这些都是一个单值的标签,类似于使用docker run的效果。

cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true

restart: always

read_only: true
shm_size: 64M
stdin_open: true
tty: true

关于配置文件的扩展写法会在有空的时候补上,写得太长了。_(xз」∠)_

作者:左蓝
链接:https://www.jianshu.com/p/2217cfed29d7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

karp

创建我自己的巨人