每日新闻

每日新闻

GoCN每日新闻资讯
有问必答

有问必答

Go相关的问题,技术相关的问题
文章分享

文章分享

技术文章分享,让知识传播给更多的人
招聘应聘

招聘应聘

为Gopher服务的招聘应聘平台

为什么http标准库的Handler第一个参数是接口,第二个是结构体,出于哪些方面考虑呢?

技术讨论astaxie 回复了问题 • 3 人关注 • 1 个回复 • 1889 次浏览 • 2016-10-14 22:41 • 来自相关话题

golang在goroutine里的错误怎么传递?

有问必答themoonstone 回复了问题 • 4 人关注 • 2 个回复 • 4258 次浏览 • 2016-10-14 21:03 • 来自相关话题

Docker 从入门到实践-1-Docker简介

文章分享wwdyy 发表了文章 • 0 个评论 • 1454 次浏览 • 2016-10-14 18:11 • 来自相关话题

本文转自极客学院-wiki # ### Docker 从入门到实践 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux ...查看全部
本文转自极客学院-wiki

# ### Docker 从入门到实践

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 App)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。


Docker 是个伟大的项目,它彻底释放了虚拟化的威力,极大降低了云计算资源供应的成本,同时让应用的分发、测试、部署和分发都变得前所未有的高效和轻松!



### 适用人群 适用人群

本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。



### 学习前提 学习前提

学习本书前,需要你对 Linux 系统有一定的了解,此外,本书注重实践,所以需要读者能够自己搭建 Linux 环境。

### 什么是 Docker

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

![](http://wiki.jikexueyuan.com/project/docker-technology-and-combat/images/virtualization.png)

### 为什么要使用 Docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

具体说来,Docker 在如下几个方面具有较大的优势。

### 更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

### 更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

### 更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

### 更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

### 对比传统虚拟机总结
| 特性 | 容器 | 虚拟机 |
| ------------ | ------------ | ------------ |
| 启动 | 秒级 | 分钟级 |
| 硬盘使用 | 一般为 MB | 一般为 GB |
| 性能 | 接近原生 | 弱于 |
| 系统支持量 | 单机支持上千个容器 | 一般几十个 |

请问有没有比较好的方案用来远程备份大量的文件?

有问必答btfak 回复了问题 • 5 人关注 • 2 个回复 • 3068 次浏览 • 2016-10-14 18:00 • 来自相关话题

使用channel代替条件变量

文章分享astaxie 回复了问题 • 2 人关注 • 1 个回复 • 3326 次浏览 • 2016-10-14 17:25 • 来自相关话题

go是如何分配内存的?

有问必答wayslog 回复了问题 • 6 人关注 • 4 个回复 • 2589 次浏览 • 2016-10-14 16:19 • 来自相关话题

Python 程序员的 Golang 学习指南(III): 入门篇

文章分享Cloudinsight 发表了文章 • 0 个评论 • 2726 次浏览 • 2016-10-14 15:39 • 来自相关话题

Authors: startover * [startover's Github](https://github.com/startover) * [Cloudinsight](http://cloudinsight.oneapm.c ...查看全部
Authors: startover
* [startover's Github](https://github.com/startover)
* [Cloudinsight](http://cloudinsight.oneapm.com/?utm_source=CiTechBlog&utm_medium=gocn&utm_term=pythongolang3&utm_campaign=CiTech&from=jscwgyegna) 工程师

------------


## 基础语法

#### 类型和关键字

* 类型

```
// 基础类型
布尔类型: bool
整型: int8,uint8,int16,uint16,int32,uint32,int64,uint64,int,rune,byte,complex128, complex64,其中,byte 是 int8 的别名
浮点类型: float32 、 float64
复数类型: complex64 、 complex128
字符串: string
字符类型: rune(int32的别名)
错误类型: error

// 复合类型
指针(pointer)
数组(array)
切片(slice)
字典(map)
通道(chan)
结构体(struct)
接口(interface)
```

* 关键字

```
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

```

#### 变量

Go 同其他语言不同的地方在于变量的类型在变量名的后面,不是 `int a`,而是 `a int`。至于为什么这么定义,Go 的[官方博客](https://blog.golang.org/gos-declaration-syntax)有给出解释,有兴趣的可以参考下。

变量定义语法如下:

```go
var a int
a = 2

// 或者
a := 2

// 同时定义多个变量
var (
a int
b bool
)

// 同时给多个变量赋值
a, b := 2, true
```

#### 操作符

```
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^=

```

#### 控制结构

Go 语言支持如下的几种流程控制语句:

* 条件语句,对应的关键字为 if、else 和 else if;
* 选择语句,对应的关键字为 switch、case 和 select;
* 循环语句,对应的关键字为 for 和 range;
* 跳转语句,对应的关键字为 goto。

值得一提的是,Go 语言并不支持 do 或者 while 关键字,而是对 for 关键字做了增强,以实现类似的效果,如下:

```go
for {
// 实现无限循环,慎用!
}
```

#### 常用内置函数

* len:计算(字符串,数组或者切片,map)长度
* cap:计算(数组或者切片,map)容量
* close:关闭通道
* append:追加内容到切片
* copy:拷贝数组/切片内容到另一个数组/切片
* delete:用于删除 map 的元素

#### array, slice 和 map

```go
// array
a := [3]int{ 1, 2, 3 } // 等价于 a := [...]int{ 1, 2, 3 }

// slice
s := make([]int , 3) // 创建一个长度为 3 的 slice
s := append(s, 1) // 向 slice 追加元素
s := append(s, 2)

// map
m := make(map[string]int) // 使用前必须先初始化
m["golang"] = 7
```

关于 array, slice 和 map 的更多惯用法,有一篇[文章](https://se77en.cc/2014/06/30/array-slice-map-and-set-in-golang/)介绍的挺详细,有兴趣的可以看看。

#### 函数

Go 语言的函数有如下特性:

* 不定参数

由于 Go 语言不支持函数重载(具体原因见 [Go Language FAQ](https://golang.org/doc/faq#overloading)),但我们可以通过不定参数实现类似的效果。

```go
func myfunc(args ...int) {
// TODO
}

// 可通过如下方式调用
myfunc(2)
myfunc(1, 3, 5)
```

* 多返回值

与 C、C++ 和 Java 等开发语言的一个极大不同在于,Go 语言的函数或者成员的方法可以有多
个返回值,这个特性能够使我们写出比其他语言更优雅、更简洁的代码。

```go
func (file *File) Read(b []byte) (n int, err error)

// 我们可以通过下划线(_)来忽略某个返回值
n, _ := f.Read(buf)
```

* 匿名函数

匿名函数是指不需要定义函数名的一种函数实现方式,它并不是一个新概念,最早可以回溯
到 1958 年的 Lisp 语言。但是由于各种原因,C 和 C++ 一直都没有对匿名函数给以支持,其他的各
种语言,比如 JavaScript、C# 和 Objective-C 等语言都提供了匿名函数特性,当然也包含Go语言。

匿名函数由一个不带函数名的函数声明和函数体组成,如下:

```go
func(a, b int) bool {
return a < b
}
```

匿名函数可以直接赋值给一个变量或者直接执行:

```go
f := func(a, b int) bool {
return a < b
}

func(a, b int) bool {
return a < b
}(3, 4) // 花括号后直接跟参数列表表示函数调用
```

* 闭包

闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者
任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含
在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环
境(作用域)。

Go 的匿名函数就是一个闭包。我们来看一个例子:

```go
package main

import "fmt"

func main() {
j := 5
a := func() func() {
i := 10
return func() {
fmt.Printf("i, j: %d, %d\n", i, j)
}
}()
a()
j *= 2
a()
}
```

程序输出如下:

```
i, j: 10, 5
i, j: 10, 10
```

#### 错误处理

Go 语言追求简洁优雅,所以,Go 语言不支持传统的 `try...catch...finally` 这种异常,因为 Go 语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在 Go 语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了),才使用 Go 中引入的Exception处理:defer, panic, recover。

用法如下:

```go
package main

import "fmt"

func main() {
defer func() {
fmt.Println("recovered:", recover())
}()
panic("not good")
}
```

关于 Go 语言的错误处理机制和传统的 `try...catch...finally` 异常机制孰优孰劣,属于仁者见仁,智者见智,这里不做赘速。有兴趣的同学可以去看看知乎上的讨论:[Go 语言的错误处理机制是一个优秀的设计吗?](https://www.zhihu.com/question/27158146)。


## 面向对象 -> 一切皆类型

Python 推崇“一切皆对象”,而在 Go 语言中,类型才是一等公民。

我们可以这样定义一个结构体:

```go
type Name struct {
First string
Middle string
Last string
}
```

同样也可以定义基础类型:

```go
type SimpleName string
```

还能给任意类型定义方法:

```go
func (s SimpleName) String() string { return string(s) }
// 或者
func (s string) NoWay()
```


## Golang VS Python

最后我们通过几个例子来比较一下 Golang 与 Python 的一些基本用法,如下:

#### 生成器(Generator)

* Python 版本

```python
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
yield a

for x in fib(10):
print x

print 'done'
```

* Golang 版本

```go
package main

import "fmt"

func fib(n int) chan int {
c := make(chan int)
go func() {
a, b := 0, 1
for i := 0; i < n; i++ {
a, b = b, a+b
c <- a
}
close(c)
}()
return c
}

func main() {
for x := range fib(10) {
fmt.Println(x)
}
}
```

#### 装饰器(Decorator)

* Python 版本

```python
from urlparse import urlparse, parse_qs
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

def auth_required(myfunc):
def checkuser(self):
user = parse_qs(urlparse(self.path).query).get('user')
if user:
self.user = user[0]
myfunc(self)
else:
self.wfile.write('unknown user')
return checkuser

class myHandler(BaseHTTPRequestHandler):
@auth_required
def do_GET(self):
self.wfile.write('Hello, %s!' % self.user)

if __name__ == '__main__':
try:
server = HTTPServer(('localhost', 8080), myHandler)
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
```

* Golang 版本

```go
package main

import (
"fmt"
"net/http"
)

var hiHandler = authRequired(
func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi, %v", r.FormValue("user"))
},
)

func authRequired(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if r.FormValue("user") == "" {
http.Error(w, "unknown user", http.StatusForbidden)
return
}
f(w, r)
}
}

func main() {
http.HandleFunc("/hi", hiHandler)
http.ListenAndServe(":8080", nil)
}
```

#### 猴子补丁(Monkey patching)

* Python 版本

```python
import urllib

def say_hi(usr):
if auth(usr):
print 'Hi, %s' % usr
else:
print 'unknown user %s' % usr

def auth(usr):
try:
auth_url = 'localhost'
r = urllib.urlopen(auth_url + '/' + usr)
return r.getcode() == 200
except:
return False

def sayhitest():
# Test authenticated user
globals()['auth'] = lambda x: True
say_hi('John')

# Test unauthenticated user
globals()['auth'] = lambda x: False
say_hi('John')

if __name__ == '__main__':
sayhitest()
```

* Golang 版本

```go
package main

import (
"fmt"
"net/http"
)

func sayHi(user string) {
if !auth(user) {
fmt.Printf("unknown user %v\n", user)
return
}
fmt.Printf("Hi, %v\n", user)
}

var auth = func(user string) bool {
authURL := "localhost"
res, err := http.Get(authURL + "/" + user)
return err == nil && res.StatusCode == http.StatusOK
}

func testSayHi() {
auth = func(string) bool { return true }
sayHi("John")

auth = func(string) bool { return false }
sayHi("John")
}

func main() {
testSayHi()
}
```


相关链接:
[https://blog.golang.org/gos-declaration-syntax](https://blog.golang.org/gos-declaration-syntax)
[https://se77en.cc/2014/06/30/array-slice-map-and-set-in-golang/](https://se77en.cc/2014/06/30/array-slice-map-and-set-in-golang/)
[https://golang.org/doc/faq#overloading](https://golang.org/doc/faq#overloading)
[https://www.zhihu.com/question/27158146](https://www.zhihu.com/question/27158146)
[https://talks.golang.org/2013/go4python.slide](https://talks.golang.org/2013/go4python.slide)


------------

本文章为 [Cloudinsight](http://cloudinsight.oneapm.com/?utm_source=CiTechBlog&utm_medium=gocn&utm_term=pythongolang1&utm_campaign=CiTech&from=jscwgyegna) 技术团队工程师原创,更多技术文章可访问 [Cloudinsight 技术博客](http://cloudinsight.oneapm.com/blog/?utm_source=CiTechBlog&utm_medium=gocn&utm_term=pythongolang1&utm_campaign=CiTech&from=jscwgyegna)。[Cloudinsight](http://cloudinsight.oneapm.com/?utm_source=CiTechBlog&utm_medium=gocn&utm_term=pythongolang1&utm_campaign=CiTech&from=jscwgyegna) 为可视化系统监控工具,涵盖 Windows、Linux 操作系统,用 Golang 开发的 Cloudinsight Agent 正式开源了,欢迎 fork,Github:https://github.com/cloudinsight/cloudinsight-agent


golang-for-pythonistas 系列持续更新中,欢迎关注,及时获取最新文章~

Go里面有没有重写和重载这么一说?

有问必答philc 回复了问题 • 7 人关注 • 4 个回复 • 7958 次浏览 • 2016-10-14 14:02 • 来自相关话题

我想使用hugo,该如何入门?

文章分享itfanr 发表了文章 • 3 个评论 • 2369 次浏览 • 2016-10-14 13:54 • 来自相关话题

- [使用Hugo搭建静态站点](http://tonybai.com/2015/09/23/intro-of-gohugo/ "使用Hugo搭建静态站点") - [Hugo静态网站生成不完全教程](http://isunxu.xyz ...查看全部
- [使用Hugo搭建静态站点](http://tonybai.com/2015/09/23/intro-of-gohugo/ "使用Hugo搭建静态站点")

- [Hugo静态网站生成不完全教程](http://isunxu.xyz/cs/make-personal-website-by-hugo/ "Hugo静态网站生成不完全教程")

【兼职】有没有想接私活程序猿,看过来!

招聘应聘erbajie 回复了问题 • 3 人关注 • 3 个回复 • 2704 次浏览 • 2016-10-14 13:46 • 来自相关话题

BTCC<Bitcoin+Blockchain> Hiring Golanger

招聘应聘Paul_Peng 发表了文章 • 8 个评论 • 1251 次浏览 • 2016-10-14 13:33 • 来自相关话题

# WHO WE ARE: BTCC was originally founded as BTCChina in 2011. It is the longest-running and one of the largest Bitcoin exch ...查看全部
# WHO WE ARE:
BTCC was originally founded as BTCChina in 2011. It is the longest-running and one of the largest Bitcoin exchanges worldwide. BTCC plays a leading role in every segment of the bitcoin ecosystem, offering a digital currency exchange, a mining pool, payment processing, consumer wallets, and blockchain engraving. The diverse products and services BTCC offers allow its customers to engage in all aspects of the digital currency spectrum in one integrated platform. Headquartered in Shanghai, BTCC serves a global customer base and has become an industry leader for security, risk mitigation, credibility, and technological innovation. Its mission is to provide the world with the most convenient and trustworthy digital currency services.

# WHAT WE ARE LOOKING FOR:
We are looking for a talented, experienced, and motivated Software Engineer to help us launch our next generation BTCC products and services. You will be a part of a high-performance organization that is changing the future of finance with blockchain technologies.

In this role you will be working with the team ’ s passionate developers to take our existing platform to the next level. You must be ready to step into a fast-paced team environment, working with cutting edge technologies.

# WHAT WE OFFER:
Rare opportunity to work in one of the most cutting edge and fastest growing industries.
Lively Western-style work environment with passionate and energetic colleagues coming from diverse backgrounds.
Competitive salary.
Quarterly bonus paid in Bitcoins.
Company events and parties several times a year.
Stock options plan for selected candidates.

Email Address:jobs@btcc.com WeChat:13764246315

大家是如何处理 golang web 应用静态资源的?

技术讨论astaxie 回复了问题 • 5 人关注 • 1 个回复 • 4730 次浏览 • 2016-10-14 13:08 • 来自相关话题

glide如何获取包的所有依赖?

有问必答astaxie 回复了问题 • 3 人关注 • 1 个回复 • 3656 次浏览 • 2016-10-14 13:07 • 来自相关话题

Rikka - 极简多插件私人图床

开源程序7sDream 发表了文章 • 3 个评论 • 3103 次浏览 • 2016-10-14 12:23 • 来自相关话题

OvO 终于有个 Go 社区了……我来发个学 Golang 的时候练手的一个东西吧…… ## 简介 Rikka 是一个极简的图床系统,设计理念是让每个人都能有个自己的好用的图床。为了极简,去掉了上传历史的功能 ...查看全部
OvO 终于有个 Go 社区了……我来发个学 Golang 的时候练手的一个东西吧……

## 简介

Rikka 是一个极简的图床系统,设计理念是让每个人都能有个自己的好用的图床。为了极简,去掉了上传历史的功能,所有的一切都按照 `上传-复制-关闭-粘贴` 的使用流程来设计。为了方便每个人自己部署,封装成了 Docker Image。DaoCloud 的一个 128M 的实例都能愉快的跑 Rikka,内存占用大约 10 - 20M。

因为是在我刚学 Go 的时候开的项目,所以我在有意的尽量不使用其他模块,专注于用自带 package 完成功能,对于其他初学者可能是个不错的例子哟。

## 特点/Feature:

- 极简,不保存上传历史
- 支持将图片链接复制成多种格式
- 文件储存部分插件化,有很多可用的插件,比如:新浪微博,七牛云,又拍云,腾讯云等
- 提供 API
- Web 服务和 RESTful API 服务模块化
- CLI 工具
- 只保证支持较新版本的 Chrome/Firefox/Safari
- 首页标志很可爱
- 维护者貌似很活跃 :)

## 目前支持的图片储存插件

- 本地服务器
- 七牛云
- 又拍云
- 新浪微博
- 腾讯云 COS
- 腾讯云 CI

可能以后还会加啦,因为是插件形式,所以加起来很简单。应该以后会有 Imgur 和 Flickr 插件吧。
恩,其实可以自己写插件的,但是我现在还没写插件的编写文档。不过把目前我写的几个插件看完应该也就明白怎么写了,很 Easy 的~

## 截图/Demo

首页:

![homepage](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-498160687)

预览页面:

![viewpage](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-457359417)

我在 DaoCloud 用免费配额搭了个 Rikka 做 Demo:http://7sdream-rikka-demo.daoapp.io/

密码是:`rikka`

感兴趣的可以去试试,最大图片大小 5M。不过这只是 Demo 哟,不要真的用这个啦,如果想自己搭个自用的 Rikka 的话可以看:[部署文档](https://github.com/7sDream/rikka/blob/master/deploy.zh.md)和[图文教程](https://github.com/7sDream/rikka/wiki/%E5%9C%A8-DaoCloud-%E4%B8%8A%E5%85%8D%E8%B4%B9%E9%83%A8%E7%BD%B2-Rikka)

我自己也在腾讯云部署了一个:http://akkir.me 但是这个就不告诉你们密码咯……毕竟是自用的。

## API/CLI

Rikka 是有 RESTFul 的 API 的,文档在[这里](https://github.com/7sDream/rikka/blob/master/api/README.zh.md)。

然后我还写了个 CLI 工具方便命令行使用:[文档](https://github.com/7sDream/rikka/blob/master/rikkac/README.zh.md)|[下载](https://github.com/7sDream/rikka/releases/tag/Rikkac)。

放个使用截图吧:

![](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-066558195)

然后是多张上传:

![](http://odbw8jckg.bkt.clouddn.com/ba2d2dca-2ae2-4436-ade2-7905183ce23d.png)

计划中是有跨平台 GUI 想法的,不过现在还没动手。

## 项目地址

嘎嘎嘎 项目地址留在最后:https://github.com/7sDream/rikka

Docker Image:https://hub.docker.com/r/7sdream/rikka/

如果刚开始学 Golang 的小伙伴应该可以稍微看看当作入门例子。

功力雄厚的同志们就来多提提意见吧~不甚感激!

对了对了,有谁知道 Docker Container 的 Logs 怎么和 Fail2Ban 结合起来使用呀?只能在 Container 里装个 Fail2Ban 么?

exec.Command执行出错: exit status 64

技术讨论limard 回复了问题 • 3 人关注 • 2 个回复 • 2485 次浏览 • 2016-10-14 11:53 • 来自相关话题