2020年6月14日星期日

centos 7 安装zabbix

centos 7 安装zabbix


centos 7 安装zabbix4.0

一、zabbix简介

1、简介

zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数如:CPU负荷、内存使用、磁盘使用、网络状况、端口监视、日志监视等。zabbix主要由2部分构成,zabbix server与可选组件zabbix agent。
zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD,OS X等平台上。
zabbix agent需要安装在被监视主机上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。zabbix agent可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD, OS X, Tru64/OSF1, Windows NT4.0, Windows (2000/2003/XP/Vista)等系统之上。

2、实验环境

系统:centos 7 

软件:Apache 2.4.6-93   mariadb 5.5.65  php 5.4.16  zabbix 4.0.21

3、安装前的准备工作

# 1、设置本机IP地址:192.168.10.100[root@bogon ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME=ens33UUID=84e3956a-e882-4039-baa3-1a7dd1c733eaDEVICE=ens33ONBOOT=yesIPADDR=192.168.10.100NETMASE=255.255.255.0GATEWAY=192.168.10.2DNS1=192.168.10.2# 2、设置主机名为:zabbix-server[root@bogon ~]# vim /etc/hostnamezabbix-server# 3、关闭selinux[root@bogon ~]# vim /etc/selinux/config...SELINUX=disabled...# 4、重启电脑[root@bogon ~]# reboot

二、使用yum安装LAMP

1、安装Apache

[root@zabbix-server ~]# yum install httpd -y

1.1 验证Apache

启动Apache服务

[root@zabbix-server ~]# systemctl start httpd

访问本机127.0.0.1,你会看到如下界面:

2、安装mariadb

[root@zabbix-server ~]# yum install mariadb-server mariadb -y 

2.1 验证mariadb

2.2 对mariadb进行初始化安全设置

 1 [root@zabbix-server ~]# systemctl start mariadb # 启动mariadb 2 [root@zabbix-server ~]# mysql_secure_installation # 初始化mariadb数据库 3  4 NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB 5   SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! 6  7 In order to log into MariaDB to secure it, we'll need the current 8 password for the root user. If you've just installed MariaDB, and 9 you haven't set the root password yet, the password will be blank,10 so you should just press enter here.11 12 Enter current password for root (enter for none): # 默认root密码为空,这里回车即可13 OK, successfully used password, moving on...14 15 Setting the root password ensures that nobody can log into the MariaDB16 root user without the proper authorisation.17 18 Set root password? [Y/n] Y # 是否设置root密码19 New password:  # 设置root密码20 Re-enter new password: # 去人密码21 Password updated successfully!22 Reloading privilege tables..23  ... Success!24 25 26 By default, a MariaDB installation has an anonymous user, allowing anyone27 to log into MariaDB without having to have a user account created for28 them. This is intended only for testing, and to make the installation29 go a bit smoother. You should remove them before moving into a30 production environment.31 32 Remove anonymous users? [Y/n] Y # 是否删除匿名用户,建议删除,否则可以通过匿名用户访问数据库33  ... Success!34 35 Normally, root should only be allowed to connect from 'localhost'. This36 ensures that someone cannot guess at the root password from the network.37 38 Disallow root login remotely? [Y/n] n # 是否拒绝root远程登录,这里是实验环境我们允许39  ... skipping.40 41 By default, MariaDB comes with a database named 'test' that anyone can42 access. This is also intended only for testing, and should be removed43 before moving into a production environment.44 45 Remove test database and access to it? [Y/n] Y # 是否删除默认test数据库,这个随意46 - Dropping test database...47  ... Success!48 - Removing privileges on test database...49  ... Success!50 51 Reloading the privilege tables will ensure that all changes made so far52 will take effect immediately.53 54 Reload privilege tables now? [Y/n] Y # 是否使设置立即生效55  ... Success!56 57 Cleaning up...58 59 All done! If you've completed all of the above steps, your MariaDB60 installation should now be secure.61 62 Thanks for using MariaDB!
mysql_secure_installation

2.3 设置客户端和服务端的字符集为utf-8

[root@zabbix-server ~]# vim /etc/my.cnf[mysqld]character-set-server=utf8    # 设置服务端的字符集collation-server=utf8_general_ci  # 设置服务端的字符集datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sock# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0# Settings user and group are ignored when systemd is used.# If you need to run mysqld under a different user or group,# customize your systemd unit file for mariadb according to the# instructions in >[mysqld_safe]log-error=/var/log/mariadb/mariadb.logpid-file=/var/run/mariadb/mariadb.pid[client]    # 设置客户端的字符集default-character-set=utf8 [mysql]    # 设置客户端的字符集default-character-set=utf8## include all files from the config directory#!includedir /etc/my.cnf.d

重启mariadb

[root@zabbix-server ~]# systemctl restart mariadb

3、安装php

[root@zabbix-server ~]# yum install php php-mysql -y

3.1 验证php

在/var/www/html下创建index.php

[root@zabbix-server ~]# vim /var/www/html/index.php<?phpphpinfo();?>

重启Apache

[root@zabbix-server ~]# systemctl restart httpd

访问127.0.0.1进行验证

三、安装zabbix

1、下载zabbix

[root@zabbix-server ~]# wget https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.21.tar.gz -P /usr/src/

2、解压

[root@zabbix-server ~]# tar -zxvf /usr/src/zabbix-4.0.21.tar.gz -C /opt/

3、创建运行zabbix账户

[root@zabbix-server ~]# groupadd zabbix[root@zabbix-server ~]# useradd -g zabbix zabbix

4、创建zabbix数据库

[root@zabbix-server mysql]# mysql -uroot -pMariaDB [(none)]> create database zabbix;MariaDB [(none)]> use zabbix;MariaDB [zabbix]> source /opt/zabbix-4.0.21/database/mysql/schema.sqlMariaDB [zabbix]> source /opt/zabbix-4.0.21/database/mysql/data.sql

5、配置zabbix

[root@zabbix-server ~]# cd /opt/zabbix-4.0.21/[root@zabbix-server zabbix-4.0.21]# ./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-lib

这时可能报如下错误:

原因是缺少mysql-devel ,安装即可。

[root@zabbix-server zabbix-4.0.21]# yum install mysql-devel -y

安装完成后再次进行配置

[root@zabbix-server zabbix-4.0.21]# ./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-lib

这时可能会报如下错误:

原因是缺少lib

[root@zabbix-server zabbix-4.0.21]# yum install lib

安装完成后再次进行配置

[root@zabbix-server zabbix-4.0.21]# ./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-lib

这时可能会报如下错误:

原因是缺少 net-snmp-devel,安装即可。

[root@zabbix-server zabbix-4.0.21]# yum install net-snmp-devel -y

安装完成后再次进行配置

[root@zabbix-server zabbix-4.0.21]# ./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-lib

这时可能会报如下错误:

原因是缺少libevent-devel,安装即可。

[root@zabbix-server zabbix-4.0.21]# yum install libevent-devel -y

安装完成后再次进行配置

[root@zabbix-server zabbix-4.0.21]# ./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-lib

这时可能会报如下错误:

原因是缺少curl-devel,安装即可。

[root@zabbix-server zabbix-4.0.21]# yum install curl-devel -y

安装完成后再次进行配置

[root@zabbix-server zabbix-4.0.21]# ./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-lib

经过上面诸多错误,终于来到了如下所示:

6、安装zabbix

[root@zabbix-server zabbix-4.0.21]# make install

7、编辑配置文件/usr/local/etc/zabbix_server.conf

[root@zabbix-server zabbix-4.0.21]# vim /usr/local/etc/zabbix_server.confDBHost=localhostDBName=zabbixDBUser=rootDBPassword=root的密码DBPort=3306

8、使用web界面安装zabbix

8.1 创建zabbix在web中的工作目录

[root@zabbix-server zabbix-4.0.21]# mkdir /var/www/html/zabbix

8.2 将/opt/zabbix-4.0.21/frontends/php/下的所有文件复制到/var/www/html/zabbix

[root@zabbix-server zabbix-4.0.21]# cd frontends/php/[root@zabbix-server php]# cp -a . /var/www/html/zabbix/

8.3 在web上进行安装

访 src="https://img2020.cnblogs.com/blog/1569555/202006/1569555-20200613193200396-875390505.png" alt="" loading="lazy">

此时我们只能在centos本机上访 php]# vim /etc/httpd/conf/httpd.conf Listen 192.168.10.100:80 # 将监听地址改成服务器的IP地址# 修改完成后重启Apache[root@zabbix-server php]# systemctl restart httpd# 停止防火墙[root@zabbix-server php]# systemctl stop firewalld

此时我们便可以在宿主机上访问Apache服务了。

点击下一步后我们会看到一个提示信息,提示哪里需要整改。

 

错误大致分为两部分,一个是需要调整PHP的配置文件,一个缺少一些php组件。

8.4 调整php配置文件

[root@zabbix-server php]# vim /etc/php.ini post_max_size = 16Mmax_execution_time = 300max_input_time = 300date.timezone = Asia/Shanghai

重启Apache

[root@zabbix-server php]# systemctl restart httpd

再次访 src="https://img2020.cnblogs.com/blog/1569555/202006/1569555-20200613200531042-1863274209.png" alt="" loading="lazy">

我们可以看到关于php配置文件的错误没了,现在只剩php组件了。

8.5 安装php缺失的组件

[root@zabbix-server ~]# yum install php-bcmath php-mbstring php-gd libjpeg* php-ldap php-

安装完成后,重启Apache。

[root@zabbix-server ~]# systemctl restart httpd

再次访 src="https://img2020.cnblogs.com/blog/1569555/202006/1569555-20200613222025374-1435893508.png" alt="" loading="lazy">

点击下一步后,会进入到连接数据库的界面:

如果下一步出现如下错误:

表示数据库zabbix的字符集有问题。

删除数据库zabbix,并重新创建zabbix,导入数据。

[root@zabbix-server ~]# mysql -uroot -pMariaDB [(none)]> drop database zabbix;MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin; MariaDB [(none)]> use zabbix;MariaDB [zabbix]> source /opt/zabbix-4.0.21/database/mysql/schema.sql MariaDB [zabbix]> source /opt/zabbix-4.0.21/database/mysql/images.sqlMariaDB [zabbix]> source /opt/zabbix-4.0.21/database/mysql/data.sql

设置完成后刷新页面,我们会看到如下界面:

点击下一步后,我们会看到如下界面:

下一步后我们会看到如下界面:

点击下一步后来到安装页面:

造成该错误的原因是Apache的用户对/var/www/html/zabbix/conf没有写入的权限。

我们给写入权限即可,如下:

[root@zabbix-server ~]# chmod a+w /var/www/html/zabbix/conf

刷新页面后你会看到如下:

点击Finish后你会看到如下界面:

登录成功后你会看到如下界面:

我们可以看到zabbix server并没有运行,造成这种情况的原因很多,我们可以通过查看日志文件来了解问题产生的原因,默认日志文件在/tmp/zabbix_server.log。

如果是数据库连接的问题,我们要确保/var/www/html/zabbix/conf/zabbix.conf.php和vim /usr/local/etc/zabbix_server.conf中的数据库信息一致,并且数据库用户名和密码正确。

我们这里出现这个问题的原因是没有开启zabbix server服务。

[root@zabbix-server ~]# zabbix_server

刷新页面我们会看到如下:

到此zabbix的安装就简单介绍到这里。

 


Nginx 的变量究竟是怎么一回事?

Nginx 的变量究竟是怎么一回事?


之前说了很多关于 Nginx 模块的内容,还有一部分非常重要的内容,那就是 Nginx 的变量。变量在 Nginx 中可以说无处不在,认识了解这些变量的作用和原理同样是必要的,下面几乎囊括了关于 Nginx 的所有变量,单独看起来可能比较枯燥,放心,后面依然有实战内容。

Nginx 变量的运行原理

围绕 Nginx 中的变量模块可以分为两类,一类是提供变量的模块,另外一类是使用变量的模块。

  • 提供变量的模块
    • 在 Preconfiguration 源代码中定义变量名以及可以解析出变量的方法
  • 使用变量的模块
    • 解析 nginx.conf 时定义变量的使用方式

也就是在 Nginx 启动时,已经定义了变量,而只有当真正处理请求的时候,才会根据 nginx.conf 解析出来的变量使用方式调用 Preconfiguration 中定义的方法来实际获取值。

这也是变量的两个特性:

  • 惰性求值:只有使用的时候才会去调方法解析
  • 变量值可以时刻变化,其值为使用的那一时刻的值。例如发送响应包体字节数,实际在发送的过程中是一直在变化的。

除了 Nginx 的模块之外,Nginx 框架也包含许多的变量,这些变量不需要通过编译模块来引入,而且,Nginx 框架所提供的变量往往反映了处理请求的细节,因此,了解 Nginx 框架所提供的变量是十分有必要的。

HTTP 请求相关的变量

先来看一下关于 HTTP 请求的相关变量。

  • arg_参数名:URL 中某个具体参数的值

  • query_string:与 args 变量完全相同

  • args:全部 URL 参数

  • is_args:如果请求 URL 中有参数则返回 ?,否则返回空

  • content_length:HTTP 请求中标识包体长度的 Content-Length 头部的值。如果请求中没有携带这个参数,那么就取不到对应的值。

  • content_type:标识请求包体类型的 Content-Type 头部的值。同样需要用户请求中携带对应的参数。

  • uri:请求的 URI(不同于 URL,不包括 ? 后的参数)

  • document_uri:与 uri 完全相同。由于历史原因而存在的。

  • request_uri:请求的 URL(包括 URI 以及完整的参数)

  • scheme:协议名,例如 HTTP 或者 HTTPS

  • request_method:请求方法,例如 GET 或者 POST

  • request_length:所有请求内容的大小,包括请求行、头部、包体等

  • remote_user:由 HTTP Basic Authentication 协议传入的用户名

  • request_body_file:很多时候会将用户请求的包体存放到文件中,这个变量就是临时存放请求包体的文件

    • 如果包体非常小则不会存文件
    • client_body_in_file_only 指令强制所有包体存入文件,且可决定是否删除
  • request_body:请求中的包体,这个变量当且仅当使用反向代理,且设定用内存暂存包体时才有效

  • request:原始的 URL 请求,含有方法与协议版本,例如 GET /?a=1&b=22 HTTP/1.1

  • host

    • 先从请求行中获取
    • 如果含有 Host 头部,则用其值替换掉请求行中的主机名
    • 如果前两者都取不到,则使用匹配上的 server_name
  • http_头部名字:返回一个具体请求头部的值

    特殊变量,这些变量会做一些处理。

    • http_host
    • http_user_agent
    • http_referer
    • http_via
    • http_x_forwarded_for
    • http_cookie

    通用变量,除了以上的变量,都可以取到对应的值。

TCP 连接相关的变量

下面是关于 TCP 连接的变量。

  • binary_remote_addr:客户端地址的整形格式,对于 IPv4 是 4 字节,对于 IPv6 是 16 字节,所以在 limit_req 和 limit_conn 中通常可以用作 key (详见:Nginx 处理 HTTP 请求的 11 个阶段 中的 preaccess 阶段)
  • connection:递增的连接序号
  • connection_requests:当前连接上执行过的请求数,对 keepalive 连接有意义
  • remote_addr:客户端地址
  • remote_port:客户端端口
  • proxy_protocol_addr:若使用了 proxy_protocol 协议,则返回协议中的地址,否则返回空
  • proxy_protocol_port:若使用了 proxy_protocol 协议则返回协议中的端口,否则返回空
  • server_addr:服务端地址
  • server_port:服务器端端口
  • TCP_INFO:TCP 内核层参数,包括 $tcpinfo_rtt, ​$tcpinfo_rttvar,​$tcpinfo_snd_cwnd, $tcpinfo_rcv_space
  • server_protocol:服务器端协议,例如 HTTP/1.1

Nginx 处理请求过程中产生的变量

Nginx 处理 HTTP 请求的过程中也会产生很多变量。

  • request_time:请求处理到现在的耗时,单位为秒,精确到毫秒
  • server_name:匹配上请求的 server_name 值
  • https:如果开启了 TLS/SSL 则返回 on,否则返回空
  • request_completion:若请求处理完则返回 OK,否则返回空
  • request_id:以 16 进制输出的请求表示 id,该 id 共含有 16 个字节,是随机生成的
  • request_filename:待访问文件的完整路径
  • document_root:由 URI 和 root、alias 规则生成的文件夹路径
  • realpath_root:将 document_root 中的软链接等换成真实路径
  • limit_rate:返回客户端响应时的速度上限,单位为每秒字节数。可以通过 set 指令修改对请求产生的效果

发送 HTTP 响应时相关的变量

  • body_bytes_sent:响应中 body 包体的长度

  • bytes_sent:全部 http 响应的长度

  • status:http 响应中的返回码

  • sent_trailer_名字:把响应结尾内容里的值返回

  • sent_http_头部名字:响应中某个具体头部的值

    特殊处理,下面这些变量需要经过特殊处理:

    • sent_http_content_type
    • sent_http_content_length
    • sent_http_location
    • sent_http_last_modified
    • sent_http_connection
    • sent_http_keep_alive
    • sent_http_transfer_encoding
    • sent_http_cache_control
    • sent_http_link

    通用:除了上面这些头部,其他的头部都是通用型的,也就是可以直接拿来用。

Nginx 系统变量

  • time_local:以本地时间标准输出的当前时间,例如 14/Nov/2018:15:55:37 +0800
  • time_iso8601:使用 ISO8601 标准输出的当前时间,例如 2018-11-14T15:55:37+08:00
  • nginx_version:Nginx 版本号
  • pid:所属 worker 进程的进程 id
  • pipe:使用了管道则返回 p,否则返回 .
  • hostname:所在服务器的主机名,与 hostname 命令输出一致
  • msec:1970 年 1 月 1 日到现在的时间,单位为秒,小数点后精确到毫秒

实战

配置文件:

log_format vartest '$remote_addr - $remote_user [$time_local] "$request" '      '$status bytes_sent=$bytes_sent body_bytes_sent=$body_bytes_sent "$http_referer" '      '"$http_user_agent" "$sent_http_abc"';server {	server_name var.ziyang.com localhost;	#error_log logs/myerror.log debug;	access_log logs/vartest.log vartest;	listen 9090;		location / {		set $limit_rate 10k;  # return 200; tcpinfo: $tcpinfo_rtt,$tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space 		return 200 'arg_a: $arg_a,arg_b: $arg_b,args: $argsconnection: $connection,connection_requests: $connection_requestscookie_a: $cookie_auri: $uri,document_uri: $document_uri, request_uri: $request_urirequest: $requestrequest_id: $request_idserver: $server_addr,$server_name,$server_port,$server_protocol   host: $host,server_name: $server_name,http_host: $http_hostlimit_rate: $limit_ratehostname: $hostnamecontent_length: $content_lengthstatus: $statusbody_bytes_sent: $body_bytes_sent,bytes_sent: $bytes_senttime: $request_time,$msec,$time_iso8601,$time_local';	}	}

从上面这个配置文件中,我们可以看出来,返回的响应里面包含了一系列的变量,实际验证一下:

➜ test_nginx curl -H 'Content-Length: 0' -H 'Cookie: a=c1' 'localhost:9090?a=1&b=22'arg_a: 1,arg_b: 22,args: a=1&b=22connection: 2,connection_requests: 1cookie_a: c1uri: /,document_uri: /, request_uri: /?a=1&b=22request: GET /?a=1&b=22 HTTP/1.1request_id: 5d40b1ff29d2b87d5db5c4f95ebf5e4dserver: 127.0.0.1,var.ziyang.com,9090,HTTP/1.1host: localhost,server_name: var.ziyang.com,http_host: localhost:9090limit_rate: 10240hostname: yuanzizhen.localcontent_length: 0status: 200body_bytes_sent: 0,bytes_sent: 0time: 0.000,1590842354.866,2020-05-30T20:39:14+08:00,30/May/2020:20:39:14 +0800

大家可以对比一下响应和配置文件中的值是不是一一对应的,更加深刻的理解一下变量的含义。

好了,这一节咱们学习了。关于 Nginx 的变量就讲完了,下一节讲一下实际应用变量的两个模块,大家会有更深刻的理解。


本文首发于我的个人博客:iziyang.github.io,所有配置文件我已经放在了 Nginx 配置文件,大家可以自取。


【实操】如何合并重复listing?

【实操】如何合并重复listing?

在亚马逊平台,是不允许同一款产品在同一个店铺重复发布的,这样会让买家感到困惑,难以进行商品搜索和做出购买决策。如果被发现,轻则会限制其它新的listing发布,重则可能会限制店铺的销售权限。

而日常运营中,我们可能就会发布重复的产品。我们会在文案或者图片上做一些修改,虽然这样操作可能会让自己心里觉得店铺多了一个listing,销量可能就会更多。但实际上这也会分散我们的时间和精力,还有对应的资源。所以建议最好不要在同一个店铺中重复铺一款产品,而今天就是介绍如何将这些重复的listing合并起来。

以下是亚马逊针对合并重复商品页面的要求,如果两个商品的以下属性相同,则可以请求合并这些商品页面:

商品编码,例如UPC、EAN或ISBN

包装数量

商品品牌

物理属性,如颜色、尺寸或香味。

3852.jpg

具体的操作步骤如下:

第一步,进入帮助页面,点击【我要开店】

3853.jpg

第二步,点击【商品、商品信息或库存】

3854.jpg 

第三步,点击【合并重复商品页面或拆分商品页面】

 

3855.jpg

第四步,在【合并重复商品页面】一项,点击【选择问题】

 

3856.jpg

第五步,分别录入【您希望保留的ASIN】和【您想要合并的ASIN】,然后点击【请求合并】

3857.jpg

系统一般会在几分钟内审核卖家的请求,并会通过邮件告知卖家审核结果。

3858.jpg

3859.jpg

审核通过之后,我们就会看见两个重复listing合并为了一个,相当于两个产品共用了一个listing页面。这样我们就可以统一管理这两个产品了。

备注:具体要不要合并,需要由卖家自己来决定,主要还是看多个listing是否给自己带来了效益。如果没有,那么合并之后就可以给自己省下一些时间和资源了。

越分享,越成长!


来源:绝版祥Cary

更多亚马逊相关资讯和干货,扫码入群!

二维码.png



文章来源:https://www.ikjzd.com/home/123659,更多跨境电商运营技巧:https://www.ikjzd.com

2020年6月13日星期六

容器编排工具之Docker

容器编排工具之Docker


docker-compose项目是docker官方的开源项目,负责实现对docker容器集群的快速编排;所谓编排我们可以理解为像ansible里面的"剧本";我们把需要启动的容器,每个容器之间的依赖关系,每个容器的网络、存储等等都定义在一个配置文件中,然后通过一个工具去读取这个配置文件,从而实现快速部署一个应用,方便管理的一个堆docker容器;对于docker-compose来讲,这个配置文件必须交docker-compose.yml,并且通过docker-compose来管理docker容器,它默认就会去找这个配置文件,所以在执行docker-compose命令时,通常我们都是在docker-compose.yml所在目录下执行;

  前文我们聊了下docker私有仓库harbor的搭建,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13061984.html;在上一篇博客的末尾,我们简单聊了下docker-compose启动和停止harbor;docker-compose项目是docker官方的开源项目,负责实现对docker容器集群的快速编排;所谓编排我们可以理解为像ansible里面的"剧本";我们把需要启动的容器,每个容器之间的依赖关系,每个容器的网络、存储等等都定义在一个配置文件中,然后通过一个工具去读取这个配置文件,从而实现快速部署一个应用,方便管理的一个堆docker容器;对于docker-compose来讲,这个配置文件必须交docker-compose.yml,并且通过docker-compose来管理docker容器,它默认就会去找这个配置文件,所以在执行docker-compose命令时,通常我们都是在docker-compose.yml所在目录下执行;

  首先说下安装吧,通常安装方式有两种,第一种方式就是把docker-compose当作python的一个应用来装,用pip安装docker-compose即可;第二种就是yum安装;如下所示

  1、pip安装

[root@docker_node02 ~]# pip install docker-composeDEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-supportCollecting docker-compose Downloading docker_compose-1.26.0-py2.py3-none-any.whl (139 kB)  |████████████████████████████████| 139 kB 61 kB/s Collecting backports.shutil-get-terminal-size==1.0.0; python_version < "3.3" Downloading backports.shutil_get_terminal_size-1.0.0-py2.py3-none-any.whl (6.5 kB)Collecting python-dotenv<1,>=0.13.0 Downloading python_dotenv-0.13.0-py2.py3-none-any.whl (17 kB)Collecting distro<2,>=1.5.0 Downloading distro-1.5.0-py2.py3-none-any.whl (18 kB)Collecting texttable<2,>=0.9.0 Downloading texttable-1.6.2-py2.py3-none-any.whl (10 kB)Collecting six<2,>=1.3.0 Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)Collecting cached-property<2,>=1.2.0 Downloading cached_property-1.5.1-py2.py3-none-any.whl (6.0 kB)Collecting jsonschema<4,>=2.5.1 Downloading jsonschema-3.2.0-py2.py3-none-any.whl (56 kB)  |████████████████████████████████| 56 kB 18 kB/s Requirement already satisfied: backports.ssl-match-hostname<4,>=3.5; python_version < "3.5" in /usr/lib/python2.7/site-packages (from docker-compose) (3.5.0.1)Requirement already satisfied: ipaddress<2,>=1.0.16; python_version < "3.3" in /usr/lib/python2.7/site-packages (from docker-compose) (1.0.16)Collecting subprocess32<4,>=3.5.4; python_version < "3.2" Downloading subprocess32-3.5.4.tar.gz (97 kB)  |████████████████████████████████| 97 kB 14 kB/s Collecting docopt<1,>=0.6.1 Downloading docopt-0.6.2.tar.gz (25 kB)Collecting dockerpty<1,>=0.4.1 Downloading dockerpty-0.4.1.tar.gz (13 kB)Collecting requests<3,>=2.20.0 Downloading requests-2.23.0-py2.py3-none-any.whl (58 kB)  |████████████████████████████████| 58 kB 17 kB/s Requirement already satisfied: PyYAML<6,>=3.10 in /usr/lib64/python2.7/site-packages (from docker-compose) (5.3.1)Collecting docker[ssh]<5,>=3.7.0 Downloading docker-4.2.1-py2.py3-none-any.whl (143 kB)  |████████████████████████████████| 143 kB 15 kB/s Requirement already satisfied: enum34<2,>=1.0.4; python_version < "3.4" in /usr/lib/python2.7/site-packages (from docker-compose) (1.0.4)Collecting websocket-client<1,>=0.32.0 Downloading websocket_client-0.57.0-py2.py3-none-any.whl (200 kB)  |████████████████████████████████| 200 kB 13 kB/s Collecting typing; python_version < "3.5" Downloading typing-3.7.4.1-py2-none-any.whl (26 kB)Collecting functools32; python_version < "3" Downloading functools32-3.2.3-2.tar.gz (31 kB)Collecting attrs>=17.4.0 Downloading attrs-19.3.0-py2.py3-none-any.whl (39 kB)Requirement already satisfied: setuptools in /usr/lib/python2.7/site-packages (from jsonschema<4,>=2.5.1->docker-compose) (0.9.8)Collecting pyrsistent>=0.14.0 Downloading pyrsistent-0.16.0.tar.gz (108 kB)  |████████████████████████████████| 108 kB 14 kB/s Collecting importlib-metadata; python_version < "3.8" Downloading importlib_metadata-1.6.1-py2.py3-none-any.whl (31 kB)Collecting certifi>=2017.4.17 Downloading certifi-2020.4.5.2-py2.py3-none-any.whl (157 kB)  |████████████████████████████████| 157 kB 19 kB/s Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 Downloading urllib3-1.25.9-py2.py3-none-any.whl (126 kB)  |████████████████████████████████| 126 kB 13 kB/s Collecting idna<3,>=2.5 Downloading idna-2.9-py2.py3-none-any.whl (58 kB)  |████████████████████████████████| 58 kB 14 kB/s Collecting chardet<4,>=3.0.2 Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB)  |████████████████████████████████| 133 kB 22 kB/s Collecting paramiko>=2.4.2; extra == "ssh" Downloading paramiko-2.7.1-py2.py3-none-any.whl (206 kB)  |████████████████████████████████| 206 kB 22 kB/s Collecting contextlib2; python_version < "3" Downloading contextlib2-0.6.0.post1-py2.py3-none-any.whl (9.8 kB)Collecting pathlib2; python_version < "3" Downloading pathlib2-2.3.5-py2.py3-none-any.whl (18 kB)Collecting zipp>=0.5 Downloading zipp-1.2.0-py2.py3-none-any.whl (4.8 kB)Collecting configparser>=3.5; python_version < "3" Downloading configparser-4.0.2-py2.py3-none-any.whl (22 kB)Collecting cryptography>=2.5 Downloading cryptography-2.9.2-cp27-cp27mu-manylinux2010_x86_64.whl (2.7 MB)  |████████████████████████████████| 2.7 MB 15 kB/s Collecting pynacl>=1.0.1 Downloading PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl (964 kB)  |████████████████████████████████| 964 kB 27 kB/s Collecting bcrypt>=3.1.3 Downloading bcrypt-3.1.7-cp27-cp27mu-manylinux1_x86_64.whl (59 kB)  |████████████████████████████████| 59 kB 15 kB/s Collecting scandir; python_version < "3.5" Downloading scandir-1.10.0.tar.gz (33 kB)Collecting cffi!=1.11.3,>=1.8 Downloading cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl (387 kB)  |████████████████████████████████| 387 kB 19 kB/s Collecting pycparser Downloading pycparser-2.20-py2.py3-none-any.whl (112 kB)  |████████████████████████████████| 112 kB 17 kB/s Using legacy setup.py install for subprocess32, since package 'wheel' is not installed.Using legacy setup.py install for docopt, since package 'wheel' is not installed.Using legacy setup.py install for dockerpty, since package 'wheel' is not installed.Using legacy setup.py install for functools32, since package 'wheel' is not installed.Using legacy setup.py install for pyrsistent, since package 'wheel' is not installed.Using legacy setup.py install for scandir, since package 'wheel' is not installed.Installing collected packages: backports.shutil-get-terminal-size, typing, python-dotenv, distro, texttable, six, cached-property, functools32, attrs, pyrsistent, contextlib2, scandir, pathlib2, zipp, configparser, importlib-metadata, jsonschema, subprocess32, docopt, dockerpty, certifi, urllib3, idna, chardet, requests, websocket-client, pycparser, cffi, cryptography, pynacl, bcrypt, paramiko, docker, docker-compose Running setup.py install for functools32 ... done Running setup.py install for pyrsistent ... done Running setup.py install for scandir ... done Running setup.py install for subprocess32 ... error ERROR: Command errored out with exit status 1:  command: /usr/bin/python2 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-kRVwx0/subprocess32/setup.py'"'"'; __file__='"'"'/tmp/pip-install-kRVwx0/subprocess32/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-qwi0Cp/install-record.txt --single-version-externally-managed --compile --install-headers /usr/include/python2.7/subprocess32   cwd: /tmp/pip-install-kRVwx0/subprocess32/ Complete output (51 lines): /usr/lib64/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'python_requires'  warnings.warn(msg) running install running build running build_py creating build creating build/lib.linux-x86_64-2.7 copying subprocess32.py -> build/lib.linux-x86_64-2.7 running build_ext running build_configure checking for gcc... no checking for cc... no checking for cl.exe... no configure: error: in `/tmp/pip-install-kRVwx0/subprocess32': configure: error: no acceptable C compiler found in $PATH See `config.log' for more details Traceback (most recent call last):  File "<string>", line 1, in <module>  File "/tmp/pip-install-kRVwx0/subprocess32/setup.py", line 120, in <module>  main()  File "/tmp/pip-install-kRVwx0/subprocess32/setup.py", line 114, in main  'Programming Language :: Python :: Implementation :: CPython',  File "/usr/lib64/python2.7/distutils/core.py", line 152, in setup  dist.run_commands()  File "/usr/lib64/python2.7/distutils/dist.py", line 953, in run_commands  self.run_command(cmd)  File "/usr/lib64/python2.7/distutils/dist.py", line 972, in run_command  cmd_obj.run()  File "/usr/lib/python2.7/site-packages/setuptools/command/install.py", line 53, in run  return _install.run(self)  File "/usr/lib64/python2.7/distutils/command/install.py", line 563, in run  self.run_command('build')  File "/usr/lib64/python2.7/distutils/cmd.py", line 326, in run_command  self.distribution.run_command(command)  File "/usr/lib64/python2.7/distutils/dist.py", line 972, in run_command  cmd_obj.run()  File "/usr/lib64/python2.7/distutils/command/build.py", line 127, in run  self.run_command(cmd_name)  File "/usr/lib64/python2.7/distutils/cmd.py", line 326, in run_command  self.distribution.run_command(command)  File "/usr/lib64/python2.7/distutils/dist.py", line 972, in run_command  cmd_obj.run()  File "/tmp/pip-install-kRVwx0/subprocess32/setup.py", line 41, in run  self.run_command(command)  File "/usr/lib64/python2.7/distutils/cmd.py", line 326, in run_command  self.distribution.run_command(command)  File "/usr/lib64/python2.7/distutils/dist.py", line 972, in run_command  cmd_obj.run()  File "/tmp/pip-install-kRVwx0/subprocess32/setup.py", line 26, in run  raise RuntimeError(configure_command + ' failed.') RuntimeError: sh ./configure failed. ----------------------------------------ERROR: Command errored out with exit status 1: /usr/bin/python2 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-kRVwx0/subprocess32/setup.py'"'"'; __file__='"'"'/tmp/pip-install-kRVwx0/subprocess32/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-qwi0Cp/install-record.txt --single-version-externally-managed --compile --install-headers /usr/include/python2.7/subprocess32 Check the logs for full command output.[root@docker_node02 ~]# 

  提示:安装如果报以上错误,解决办法yum install gcc libffi-devel python-devel openssl-devel -y;docker-compose是python语言研发的,如果你的主机上没有pip 可以先安装python-pip即可;安装python-pip注意先配置好epel源;

[root@docker_node02 ~]# yum install gcc libffi-devel python-devel openssl-devel -yLoaded plugins: fastestmirrorbase                  | 3.6 kB 00:00:00  docker-ce-stable               | 3.5 kB 00:00:00  epel                  | 4.7 kB 00:00:00  extras                 | 2.9 kB 00:00:00  updates                 | 2.9 kB 00:00:00  (1/3): updates/7/x86_64/primary_db          | 2.1 MB 00:00:00  (2/3): epel/x86_64/updateinfo            | 1.0 MB 00:00:03  (3/3): epel/x86_64/primary_db            | 6.8 MB 00:00:05  Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.comResolving Dependencies--> Running transaction check---> Package gcc.x86_64 0:4.8.5-39.el7 will be installed--> Processing Dependency: libgomp = 4.8.5-39.el7 for package: gcc-4.8.5-39.el7.x86_64--> Processing Dependency: cpp = 4.8.5-39.el7 for package: gcc-4.8.5-39.el7.x86_64……省略部分内容Installed: gcc.x86_64 0:4.8.5-39.el7      libffi-devel.x86_64 0:3.0.13-19.el7    openssl-devel.x86_64 1:1.0.2k-19.el7   python-devel.x86_64 0:2.7.5-88.el7   Dependency Installed: cpp.x86_64 0:4.8.5-39.el7      glibc-devel.x86_64 0:2.17-307.el7.1    glibc-headers.x86_64 0:2.17-307.el7.1   kernel-headers.x86_64 0:3.10.0-1127.10.1.el7  keyutils-libs-devel.x86_64 0:1.5.8-3.el7  krb5-devel.x86_64 0:1.15.1-46.el7     libcom_err-devel.x86_64 0:1.42.9-17.el7  libkadm5.x86_64 0:1.15.1-46.el7     libmpc.x86_64 0:1.0.1-3.el7     libselinux-devel.x86_64 0:2.5-15.el7    libsepol-devel.x86_64 0:2.5-10.el7   libverto-devel.x86_64 0:0.2.5-4.el7    mpfr.x86_64 0:3.1.1-4.el7      pcre-devel.x86_64 0:8.32-17.el7     python-rpm-macros.noarch 0:3-32.el7   python-srpm-macros.noarch 0:3-32.el7    python2-rpm-macros.noarch 0:3-32.el7   zlib-devel.x86_64 0:1.2.7-18.el7     Dependency Updated: e2fsprogs.x86_64 0:1.42.9-17.el7    e2fsprogs-libs.x86_64 0:1.42.9-17.el7    glibc.x86_64 0:2.17-307.el7.1    glibc-common.x86_64 0:2.17-307.el7.1    krb5-libs.x86_64 0:1.15.1-46.el7    libcom_err.x86_64 0:1.42.9-17.el7     libffi.x86_64 0:3.0.13-19.el7    libgcc.x86_64 0:4.8.5-39.el7      libgomp.x86_64 0:4.8.5-39.el7    libss.x86_64 0:1.42.9-17.el7      openssl.x86_64 1:1.0.2k-19.el7    openssl-libs.x86_64 1:1.0.2k-19.el7    python.x86_64 0:2.7.5-88.el7     python-libs.x86_64 0:2.7.5-88.el7     zlib.x86_64 0:1.2.7-18.el7     Complete![root@docker_node02 ~]#

  提示:安装好以上依赖包以后,在来安装docker-compose 就没有问题了;

[root@docker_node02 ~]# pip install docker-compose        DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-supportCollecting docker-compose Using cached docker_compose-1.26.0-py2.py3-none-any.whl (139 kB)Requirement already satisfied: backports.shutil-get-terminal-size==1.0.0; python_version < "3.3" in /usr/lib/python2.7/site-packages (from docker-compose) (1.0.0)Requirement already satisfied: python-dotenv<1,>=0.13.0 in /usr/lib/python2.7/site-packages (from docker-compose) (0.13.0)Requirement already satisfied: distro<2,>=1.5.0 in /usr/lib/python2.7/site-packages (from docker-compose) (1.5.0)Requirement already satisfied: texttable<2,>=0.9.0 in /usr/lib/python2.7/site-packages (from docker-compose) (1.6.2)Requirement already satisfied: six<2,>=1.3.0 in /usr/lib/python2.7/site-packages (from docker-compose) (1.15.0)Requirement already satisfied: cached-property<2,>=1.2.0 in /usr/lib/python2.7/site-packages (from docker-compose) (1.5.1)Requirement already satisfied: jsonschema<4,>=2.5.1 in /usr/lib/python2.7/site-packages (from docker-compose) (3.2.0)Requirement already satisfied: backports.ssl-match-hostname<4,>=3.5; python_version < "3.5" in /usr/lib/python2.7/site-packages (from docker-compose) (3.5.0.1)Requirement already satisfied: ipaddress<2,>=1.0.16; python_version < "3.3" in /usr/lib/python2.7/site-packages (from docker-compose) (1.0.16)Collecting subprocess32<4,>=3.5.4; python_version < "3.2" Using cached subprocess32-3.5.4.tar.gz (97 kB)Collecting docopt<1,>=0.6.1 Using cached docopt-0.6.2.tar.gz (25 kB)Collecting dockerpty<1,>=0.4.1 Using cached dockerpty-0.4.1.tar.gz (13 kB)Collecting requests<3,>=2.20.0 Using cached requests-2.23.0-py2.py3-none-any.whl (58 kB)Requirement already satisfied: PyYAML<6,>=3.10 in /usr/lib64/python2.7/site-packages (from docker-compose) (5.3.1)Collecting docker[ssh]<5,>=3.7.0 Using cached docker-4.2.1-py2.py3-none-any.whl (143 kB)Requirement already satisfied: enum34<2,>=1.0.4; python_version < "3.4" in /usr/lib/python2.7/site-packages (from docker-compose) (1.0.4)Collecting websocket-client<1,>=0.32.0 Using cached websocket_client-0.57.0-py2.py3-none-any.whl (200 kB)Requirement already satisfied: typing; python_version < "3.5" in /usr/lib/python2.7/site-packages (from python-dotenv<1,>=0.13.0->docker-compose) (3.7.4.1)Requirement already satisfied: functools32; python_version < "3" in /usr/lib/python2.7/site-packages (from jsonschema<4,>=2.5.1->docker-compose) (3.2.3.post2)Requirement already satisfied: attrs>=17.4.0 in /usr/lib/python2.7/site-packages (from jsonschema<4,>=2.5.1->docker-compose) (19.3.0)Requirement already satisfied: setuptools in /usr/lib/python2.7/site-packages (from jsonschema<4,>=2.5.1->docker-compose) (0.9.8)Requirement already satisfied: pyrsistent>=0.14.0 in /usr/lib64/python2.7/site-packages (from jsonschema<4,>=2.5.1->docker-compose) (0.16.0)Requirement already satisfied: importlib-metadata; python_version < "3.8" in /usr/lib/python2.7/site-packages (from jsonschema<4,>=2.5.1->docker-compose) (1.6.1)Collecting certifi>=2017.4.17 Using cached certifi-2020.4.5.2-py2.py3-none-any.whl (157 kB)Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 Using cached urllib3-1.25.9-py2.py3-none-any.whl (126 kB)Collecting idna<3,>=2.5 Using cached idna-2.9-py2.py3-none-any.whl (58 kB)Collecting chardet<4,>=3.0.2 Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB)Collecting paramiko>=2.4.2; extra == "ssh" Using cached paramiko-2.7.1-py2.py3-none-any.whl (206 kB)Requirement already satisfied: contextlib2; python_version < "3" in /usr/lib/python2.7/site-packages (from importlib-metadata; python_version < "3.8"->jsonschema<4,>=2.5.1->docker-compose) (0.6.0.post1)Requirement already satisfied: pathlib2; python_version < "3" in /usr/lib/python2.7/site-packages (from importlib-metadata; python_version < "3.8"->jsonschema<4,>=2.5.1->docker-compose) (2.3.5)Requirement already satisfied: zipp>=0.5 in /usr/lib/python2.7/site-packages (from importlib-metadata; python_version < "3.8"->jsonschema<4,>=2.5.1->docker-compose) (1.2.0)Requirement already satisfied: configparser>=3.5; python_version < "3" in /usr/lib/python2.7/site-packages (from importlib-metadata; python_version < "3.8"->jsonschema<4,>=2.5.1->docker-compose) (4.0.2)Collecting cryptography>=2.5 Using cached cryptography-2.9.2-cp27-cp27mu-manylinux2010_x86_64.whl (2.7 MB)Collecting pynacl>=1.0.1 Using cached PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl (964 kB)Collecting bcrypt>=3.1.3 Using cached bcrypt-3.1.7-cp27-cp27mu-manylinux1_x86_64.whl (59 kB)Requirement already satisfied: scandir; python_version < "3.5" in /usr/lib64/python2.7/site-packages (from pathlib2; python_version < "3"->importlib-metadata; python_version < "3.8"->jsonschema<4,>=2.5.1->docker-compose) (1.10.0)Collecting cffi!=1.11.3,>=1.8 Using cached cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl (387 kB)Collecting pycparser Using cached pycparser-2.20-py2.py3-none-any.whl (112 kB)Using legacy setup.py install for subprocess32, since package 'wheel' is not installed.Using legacy setup.py install for docopt, since package 'wheel' is not installed.Using legacy setup.py install for dockerpty, since package 'wheel' is not installed.Installing collected packages: subprocess32, docopt, dockerpty, certifi, urllib3, idna, chardet, requests, websocket-client, pycparser, cffi, cryptography, pynacl, bcrypt, paramiko, docker, docker-compose Running setup.py install for subprocess32 ... done Running setup.py install for docopt ... done Running setup.py install for dockerpty ... done Attempting uninstall: chardet Found existing installation: chardet 2.2.1 Uninstalling chardet-2.2.1:  Successfully uninstalled chardet-2.2.1Successfully installed bcrypt-3.1.7 certifi-2020.4.5.2 cffi-1.14.0 chardet-3.0.4 cryptography-2.9.2 docker-4.2.1 docker-compose-1.26.0 dockerpty-0.4.1 docopt-0.6.2 idna-2.9 paramiko-2.7.1 pycparser-2.20 pynacl-1.4.0 requests-2.23.0 subprocess32-3.5.4 urllib3-1.25.9 websocket-client-0.57.0[root@docker_node02 ~]# docker-compose --versiondocker-compose version 1.26.0, build unknown[root@docker_node02 ~]# 

  提示:如果能够看到docker-compose的版本信息,就表示docker-compose安装好了;

  2、yum 安装

[root@docker_node01 ~]# yum install -y docker-composeLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.comResolving Dependencies--> Running transaction check---> Package docker-compose.noarch 0:1.18.0-4.el7 will be installed--> Finished Dependency ResolutionDependencies Resolved================================================================================================= Package     Arch    Version     Repository  Size=================================================================================================Installing: docker-compose    noarch    1.18.0-4.el7    epel    222 kTransaction Summary=================================================================================================Install 1 PackageTotal download size: 222 kInstalled size: 1.1 MDownloading packages:docker-compose-1.18.0-4.el7.noarch.rpm         | 222 kB 00:00:00  Running transaction checkRunning transaction testTransaction test succeededRunning transaction Installing : docker-compose-1.18.0-4.el7.noarch           1/1 Verifying : docker-compose-1.18.0-4.el7.noarch           1/1 Installed: docker-compose.noarch 0:1.18.0-4.el7               Complete![root@docker_node01 ~]# docker-compose -vdocker-compose version 1.18.0, build 8dd22a9[root@docker_node01 ~]#

  提示:本人推荐使用yum安装;从上面的过程来看yum是最方便最简洁的;

  接下来我们来构建一个docker-compose.yml配置文件,然后使用docker-compose来管理启动

[root@docker_node01 docker_compose_project]# pwd/root/docker_compose_project[root@docker_node01 docker_compose_project]# lsdocker-compose.yml[root@docker_node01 docker_compose_project]# cat docker-compose.yml version: "3"services: web1: image: nginx:1.14-alpine ports:  - "80:80"[root@docker_node01 docker_compose_project]# 

  提示:以上docker-compose.yml表示启动一个容器,并暴露端口;docker-compose.yml这个文件需要注意空格;每一级的缩进必须相同,否则会报错;docker-compose.yml中主要就是两个重要的概念,服务(services)和项目(project);所谓服务就是一个应用容器,实际上也可以包含若干运行相同镜像的容器示例;项目就是由一组关联的应用容器组成的一个完整业务单元(若干服务共同服务组成)

  启动docker-compose.yml中定义的服务

[root@docker_node01 docker_compose_project]# lsdocker-compose.yml[root@docker_node01 docker_compose_project]# docker imagesREPOSITORY   TAG     IMAGE ID   CREATED    SIZE[root@docker_node01 docker_compose_project]# docker ps -aCONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES[root@docker_node01 docker_compose_project]# docker-compose up -dPulling web1 (nginx:1.14-alpine)...1.14-alpine: Pulling from library/nginxbdf0201b3a05: Pull complete3d0a573c81ed: Pull complete8129faeb2eb6: Pull complete3dc99f571daf: Pull completeDigest: sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7Status: Downloaded newer image for nginx:1.14-alpineCreating dockercomposeproject_web1_1 ... done[root@docker_node01 docker_compose_project]# docker imagesREPOSITORY   TAG     IMAGE ID   CREATED    SIZEnginx    1.14-alpine   8a2fb25a19f5  14 months ago  16MB[root@docker_node01 docker_compose_project]# docker ps -aCONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES6fcb757fdace  nginx:1.14-alpine "nginx -g 'daemon of…" 7 seconds ago  Up 6 seconds  0.0.0.0:80->80/tcp dockercomposeproject_web1_1[root@docker_node01 docker_compose_project]# 

  提示:可以看到我们直接使用docker-compose up -d 就可以直接启动为一个nginx容器;这里需要注意一点的是在执行docker-compose命令必须要在docker-compose.yml所在目录执行。因为docker-compose这个命令会在在当前目录查找docker-compose;然后根据docker-compose.yml文件中定义的services来启动容器;docker-compose up表示创建容器并运行 -d表示把后台运行容器(不占据当前终端);

  停止docker-compose定义的服务

[root@docker_node01 docker_compose_project]# docker ps CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES46b62e878cf9  nginx:1.14-alpine "nginx -g 'daemon of…" 3 minutes ago  Up 8 seconds  0.0.0.0:80->80/tcp dockercomposeproject_web1_1[root@docker_node01 docker_compose_project]# docker-compose stopStopping dockercomposeproject_web1_1 ... done[root@docker_node01 docker_compose_project]# docker ps CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES[root@docker_node01 docker_compose_project]# 

  启动docker-compose定义的服务

[root@docker_node01 docker_compose_project]# docker psCONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES[root@docker_node01 docker_compose_project]# docker-compose startStarting web1 ... done[root@docker_node01 docker_compose_project]# docker psCONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES46b62e878cf9  nginx:1.14-alpine "nginx -g 'daemon of…" 3 minutes ago  Up 2 seconds  0.0.0.0:80->80/tcp dockercomposeproject_web1_1[root@docker_node01 docker_compose_project]# 

  测试:用浏览器访问宿主机的80,看看是否能够访问到容器的nginx服务?

  提示:可以看到我们访问宿主机的80是能够正常访问的;说明我们在docker-compose.yml文件中定义的容器和暴露的端口都已正常启动并把对应的端口暴露给宿主机;

  示例:自定义容器名称

  提示:container_name表示指定运行容器的名称;

  提示:如果默认不指定容器名称,docker会默认命名为项目名称_+服务名称+第几个容器类似这种逻辑;项目名称就是docker-compose.yml文件所在目录名称,通常它会把"_","-"下划线中横线都去掉;

  验证:停止现有容器,重新启动容器,看看容器名称是否更改?

  提示:更改了docker-compose.yml文件后,必须使用up 命令来重新读取docker-compose.yml文件,根据文件中的内容重新启动运行容器;如果使用start来启动,我们在docker-compose.yml中新定义的内容是不会生效的;

  示例:查看容器进程

  提示:docker-compose ps 显示的信息要比docker ps 显示的信息更为精简;

  示例:从docker compose启动多个容器

[root@docker_node01 docker_compose_project]# cat docker-compose.yml version: "3"services: web1: container_name: myweb1 image: nginx:1.14-alpine ports:  - "80:80" web2: container_name: myweb2 image: nginx:1.14-alpine ports:  - "81:80"[root@docker_node01 docker_compose_project]# 

  提示:以上docker-compose.yml文件定义了两个服务,web1和web2;这里需要注意一点服务名称或id不能相同;容器的名称也必须是唯一的;

  验证:停止现有容器,重新读取docker-compose.yml文件,看看是否会启动两个nginx容器?

  提示:可以看到myweb2也正常启动了,并把容器内部的80映射为宿主机的81端口;

  验证:用浏览器访问宿主机的81端口,看看是否能够访问得到?

  提示:可以看到81端口是可以正常访问的;

  示例:定义数据卷挂载

  提示:以上红框中的内容表示把宿主机上的/data/nginx/目录挂载到容器内部的/usr/share/nginx/html目录下;

  重启容器

  提示:可以看到容器内部已经可以访问我们对应宿主机上的文件;

  验证:用浏览器访问宿主机的80看看是否能够访问到我们提供的index.html页面?

  提示:用浏览器访问可以正常访问到宿主机挂载到容器内部的index.html文件内容;

  示例:重启单个服务

  提示:docker-compose管理的是以服务为单位,所以我们管理单个服务需要指定服务端名称,而非容器的名称;

  示例:重启所有服务

  提示:重启所有服务docker-compose会自动读取docker-compose.yml文件中定义的服务,来重启容器;

  示例:利用docker-compose一件部署wordpress

[root@docker_node01 wordpress]# cat docker-compose.yml version: '3.3'services: wordpress:  depends_on:  - db  image: wordpress:latest  volumes:  - wordpress_files:/var/www/html  ports:  - "80:80"  restart: always  environment:  WORDPRESS_DB_HOST: db:3306  WORDPRESS_DB_NAME: wordpress  WORDPRESS_DB_USER: wordpress  WORDPRESS_DB_PASSWORD: admin123.com db:  image: mysql:5.7  volumes:  - db_data:/var/lib/mysql  restart: always  environment:  MYSQL_ROOT_PASSWORD: my_db_root_password  MYSQL_DATABASE: wordpress  MYSQL_USER: wordpress  MYSQL_PASSWORD: admin123.comvolumes: wordpress_files: db_data: [root@docker_node01 wordpress]# 

  提示:version表示配置文件版本,depends_on表示指定依赖的服务列表;restart指令表示重启策略,restart:always就表示只要出现问题就重启;environment表示定义传给容器的环境变量;volumes:表示定义两个存储卷。这里是直接定义两个卷的名字,并没有指定对应目录;这种卷就是docker自身管理的卷,通常在/var/lib/docker/volumes/服务名_+卷名/_data/;以上就启动两个服务,wordpress依赖db服务;这里需要注意一点,数据库容器启动必须要传环境变量给容器,比如MYSQL_ROOT_PASSWORD就表示给mysql设定root密码;

  验证:停止nginx容器,启动wordpress

[root@docker_node01 wordpress]# pwd/root/wordpress[root@docker_node01 wordpress]# lsdocker-compose.yml[root@docker_node01 wordpress]# cd [root@docker_node01 ~]# cd docker_compose_project/[root@docker_node01 docker_compose_project]# lsdocker-compose.yml[root@docker_node01 docker_compose_project]# docker-compose stopStopping myweb2 ... doneStopping myweb1 ... done[root@docker_node01 docker_compose_project]# cd ../wordpress/[root@docker_node01 wordpress]# pwd/root/wordpress[root@docker_node01 wordpress]# lsdocker-compose.yml[root@docker_node01 wordpress]#docker-compose up -dCreating network "wordpress_default" with the default driverCreating volume "wordpress_wordpress_files" with default driverCreating volume "wordpress_db_data" with default driverPulling db (mysql:5.7)...5.7: Pulling from library/mysql8559a31e96f4: Pull completed51ce1c2e575: Pull completec2344adc4858: Pull completefcf3ceff18fc: Pull complete16da0c38dc5b: Pull completeb905d1797e97: Pull complete4b50d1c6b05c: Pull completed85174a87144: Pull completea4ad33703fa8: Pull completef7a5433ce20d: Pull complete3dcd2a278b4a: Pull completeDigest: sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854Status: Downloaded newer image for mysql:5.7Pulling wordpress (wordpress:latest)...latest: Pulling from library/wordpress8559a31e96f4: Already existse0276193a084: Pull completeeb2d00c10344: Pull completef54006e0dc29: Pull completee0d3d1244592: Pull complete3a60f364b0c5: Pull complete3e309988c00b: Pull completebff5c52c95f4: Pull completec9086065e896: Pull completef07bb8dcc770: Pull complete7ad826bc3623: Pull complete0f6a0743d973: Pull complete43b190adf511: Pull completecc02e4c247ac: Pull completecd5c5e392dc3: Pull completea029df01fe2d: Pull complete6c942bd52caf: Pull complete804bbda23122: Pull completebb70a73ffdf7: Pull complete9c44164d321c: Pull completeba02d5b98827: Pull completeDigest: sha256:602ea0959040cd101e5e6923474612a15f9dd330ab45ceaec4e07dc762d674c0Creating wordpress_db_1  ... doneCreating wordpress_db_1  ... Creating wordpress_wordpress_1 ... done[root@docker_node01 wordpress]#docker psCONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMEScf61629c8f36  wordpress:latest "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp wordpress_wordpress_104cc6dcddd7d  mysql:5.7   "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp wordpress_db_1[root@docker_node01 wordpress]# 

  提示:可以看到wordpress和mysql容器都跑起来了;

  验证:用浏览器访问宿主机80,看看是否访问到wordpress?

  提示:可以看到wordpress是可以直接访问的,并且不需要我们再设置数据了,因为我们在docker-compose.yml中设置好了,这里直接安装即可;

 

  通过上面的演示,我们利用docker-compose就可以轻松部署一个应用,我们只需要在docker-compose.yml中定义好每个容器间的依赖关系,存储卷等等一系列关系,然后通过docker-compose 直接就可以根据我们定义的关系来启动容器;以上就是docker-compose的简单示例和使用说明;有关docker-compose.yml中指令的说明可以参考官方文档https://docs.docker.com/compose/compose-file/#service-configuration-reference;


大批Listing突遭下架,这些词都不能用了!

大批Listing突遭下架,这些词都不能用了!

最近几天,亚马逊上多个链接突然变狗,原因是被查出带有杀虫剂、医疗用品、成人用品、毒品等违规字眼,据美国相关部门最新消息,目前多个词都不能再用了,卖家需谨慎。

多个listing已被下架,敏感词危机又来了

昨天,一位亚马逊卖家反映,其一个正规售卖的链接突然变狗,卖家一头雾水便向客服咨询,被告知是listing中添加了类似Cocaine、Heroin、Syphilis、Morphia、Opium、Coca Leaves等违规词。而近一周,平台上链接因敏感词变狗的案例不胜枚举:

周六,一个listing 被恶意添加爆炸物、病毒等词链接变狗,前天申诉回来又被标为成人用品,很无奈……

先是改五点成病毒爆炸品,捞回来后又是成人用品,这些人太*了;

我的链接也变狗了,被添加医疗用品;

违规词倒是没被添加,但有产品被恶意标记成人用品;

根据卖家的反馈,链接因敏感词变狗一事在上周六也就是6月6日集中爆发过一轮。当时,多个链接被判为杀虫剂或农药产品,其中一位卖家的爆款不幸被卷入其中。

这位卖家表示,其日出两万美金的爆款突然变狗,而在此之前,无论是后台还是邮箱,该卖家都没有收到任何通知,listing直接被删除,除去被同行恶搞的可能性,其初步判断被判定为杀虫剂产品或者农药产品。该卖家晒出的销售数据显示,其日销量达500多,日销售额超2万美金。

3905.png

另一位卖家表示也遇到了同样的情况:后台显示商品信息被删除,开case客服回复应该是杀虫剂或FDA关键词误删,可以自己在后台模板上传或申诉,其中前者恢复较快。

之后,前文爆款受损卖家收到客服回复,其产品确被判为杀虫剂,后台显示可售可编辑,但前台变狗,尝试用模板刷新,但依然未能解决。

有卖家帮忙分析这一情况:1、如果真的是杀虫剂、农药,这样还不算难;2、不能排除被恶搞,找服务商搞竞争对手的不在少数;3、找出具体问题具体分析,能申诉最好,服务商有多种恢复链接的的服务,有些可能对账号有风险;4、翻新链接能回来,但是没有review和权重,对于如此链接来说损失巨大。

在这类事件中,链接直接被blocked而不是inactive情况十分严重,也因此引起了不少卖家的重视,

除上文所说的一些敏感词之外,卖家透露,违规词包括但不限于:Ear Candles Cocaine Heroin Syphilis Morphia Opium Coca Leaves Pinzon Synthol Synthrol or Swethol Posing Oil,令人费解的是,肉类也成为此次风波中的一个敏感词汇。

巧合?EPA通知亚马逊和eBay下架杀虫剂和COVID-19相关产品

在国内卖家反馈大批Listing被强行插入农药、疫情等敏感词之时,亚马逊和eBay接到通知,下架杀虫剂和治疗新冠肺炎的相关产品。这只是巧合吗?

外媒消息,周四美国环保署(EPA)向亚马逊和eBay发出通知,要求两家电子商务巨头停止销售杀虫剂和有问题的COVID-19产品。

该机构表示,第三方或直销商将这些"未注册、贴错标签或限制使用"的杀虫剂和冠状病毒相关的产品列在亚马逊和eBay的平台上。

环保局局长安德鲁·惠勒在周四的一份声明中说:"这些向亚马逊和eBay发出的停售令,显示了特朗普政府继续致力于保护美国人的健康和安全。我们对生产商声称的产品功效和安全性主张保持警惕。"

3906.png

惠勒表示:"我们有责任就可能对消费者造成伤害的未注册产品继续与公众进行透明沟通,并立即将这些产品撤出市场。

惠勒与亚马逊、eBay和其他电子商务网站就其平台上普遍存在的未注册、有问题和潜在危险的产品进行了讨论。美国环保署表示,尽管进行了讨论,但亚马逊和eBay未能持续屏蔽"未注册、商标错误或限制使用的杀虫剂"和COVID-19的产品。

在EPA宣布之时,Virus Shut Out仍在eBay上列出,而二氯甲烷在亚马逊和eBay两个平台上都有列出,但没有与冠状病毒相关的产品。

亚马逊发言人称,公司拥有"主动屏蔽关于COVID-19的不准确声明"的系统,并且"已经下架了有问题的产品"。

eBay表示:"在COVID-19期间,我们已采取重大措施,将不安全、虚假健康宣传或违反我们零容忍价格欺诈政策的产品从市场上封禁或迅速删除。"

EPA还表示,一些未注册或商标错误的杀虫剂和COVID-19产品在亚马逊和eBay上的描述包含如下:

"Kills COVID-19"

"Complete sterilization including the current pandemic virus"

"Coronavirus disinfectant"

"2020 Coronavirus Protection Coronavirus Protection Clearance Sale"

"A Powerful, Green, Non-Toxic Solution Proven to Inactivate our current viral strain"

"Epidemic Prevention""Efficient disinfection to prevent the spread of disease"

"Help keep your family and those you care for healthy"

"Nontoxic causes no permanent injuries"

"Ingredients are biodegradable and have no harmful impact on the environment"

"There is no damage to the environment"

"You can easily purify the living environment"

"Safe for all people using"

"Gentle to Child & Pets"

"Chemical Free"

值得注意的是,早在今年4月,美国环保署就对包括Facebook、eBay、Shopify、Qoo10、JoyBuy.com、Wish.com和banggood.com在内的一些电商平台发出了销售非法消毒剂产品的警告。

多位卖家猜测:强插关键词是人为恶搞

在警告之后,昨天EPA直接发通知,要求亚马逊和eBay停售杀虫剂和有问题的COVID-19产品。这下以上提到的词语还有之前平台禁用的一些词一下子变得异常敏感。这些敏感词致使国内大批卖家的Listing被下架。

据知情卖家反馈,这次Listing敏感词是被强行加入的。也就是说很大一部分卖家可能是被恶搞了。有受害卖家称,自己的出单还不错的产品,先是关键词被删除,然后被添加了一些杀虫剂、涉毒等不相关的敏感词,然后触发关键词审核之后,Listing无端变狗。这些操作很可能来自VC或者一些没底线的服务商。

Listing被下架之后,卖家们都急于恢复。业内卖家称可尝试进行这样操作:首先,删除过去的描述;其次,下载产品模板,选择产品类目;再次,编辑ASIN SKU,在需要修改的地方填写内容;最后,上载产品模板,导入确认。这样做之后,有些Listing能很快恢复。



文章来源:https://www.ikjzd.com/home/123674,更多跨境电商运营技巧:https://www.ikjzd.com