docker-compose ports 和 expose 的区别

docker-compose中有两种方式可以暴露容器的端口:portsexpose

1、ports

ports暴露容器端口到主机的任意端口或指定端口,用法:

ports:
  - "80:80"     # 绑定容器的80端口到主机的80端口
  - "9000:80"   # 绑定容器的80端口到主机的9000端口
  - "443"       # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号

不管是否指定主机端口,使用ports都会将端口暴露给主机和其他容器

2、expose

expose暴露容器给link到当前容器的容器,或者暴露给同一个networks的容器,用法:

expose:
  - "3000"
  - "8000"

以上指令将当前容器的端口30008000暴露给其他容器

ports的区别是,expose不会将端口暴露给主机,主机无法访问expose的端口。

分类至 Docker
0条评论

自己写 highlight.js 行号插件

前端代码高亮插件 highlight.js,默认是不带行号显示功能的。如果要显示行号,我们得自己实现,或是使用第三方插件。下面就来介绍几种实现方式,并分析优缺点。

1、第一种,使用 <li></li> 标签实现行号

2、第二种,使用 highlightjs-line-numbers.js 插件显示行号

3、第三种,我自己的实现方式

分类至 JS/CSS
0条评论

中文文案排版指北(转自 GitHub)

目录

  • 空格
    • 中英文之间需要增加空格
    • 中文与数字之间需要增加空格
    • 数字与单位之间无需增加空格
    • 全角标点与其他字符之间不加空格
    • -ms-text-autospace to the rescue?
  • 标点符号
    • 不重复使用标点符号
  • 全角和半角
    • 使用全角中文标点
    • 数字使用半角字符
    • 遇到完整的英文整句、特殊名词,其內容使用半角标点
  • 名词
    • 专有名词使用正确的大小写
    • 不要使用不地道的缩写
  • 争议
    • 链接之间增加空格
    • 简体中文使用直角引号
  • 工具
  • 谁在这样做?
  • 参考文献
分类至 杂项
0条评论

SQL 中 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 区别

sql中的连接查询有inner join(内连接)、left join(左连接)、right join(右连接)、full join(全连接)四种方式,它们之间其实并没有太大区别,仅仅是查询出来的结果有所不同。

1.inner join,在两张表进行连接查询时,只保留两张表中完全匹配的结果集。

2.left join,在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。

3.right join,在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。

4.full join,在两张表进行连接查询时,返回左表和右表中所有没有匹配的行。

分类至 MySQL
0条评论

mysql left join 右表数据不唯一的情况解决方法

1.left join 基本用法

mysql left join 语句格式

A LEFT JOIN B ON 条件表达式

left join 是以A表为基础,A表即左表,B表即右表。

左表(A)的记录会全部显示,而右表(B)只会显示符合条件表达式的记录,如果在右表(B)中没有符合条件的记录,则记录不足的地方为NULL。

2.left join 右表数据不唯一解决方法

如果B表符合条件的记录数大于1条,就会出现1:n的情况,这样left join后的结果,记录数会多于A表的记录数

分类至 MySQL
0条评论

left join on 和 where 条件放置的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用 left join 时,on 和 where 条件的区别如下:

1、on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录

2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

 

分类至 MySQL
0条评论

Golang 生成随机数

rand.Intn() 函数是个伪随机函数,不管运行多少次都只会返回同样的随机数,因为它默认的资源就是单一值,所以必须调用 rand.Seed(), 并且传入一个变化的值作为参数,如 time.Now().UnixNano() , 就是可以生成时刻变化的值。rand.Intn(n) 返回值为 [0,n) 之间的整数。

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	// 初始化随机数的资源库, 如果不执行这行, 不管运行多少次都返回同样的值
	rand.Seed(time.Now().UnixNano())

	// rand.Intn(100) 返回随机值为 0-99
	fmt.Println("A number from 1-100:", 1+rand.Intn(100))
}

 

分类至 GO
0条评论

Gin 框架学习:静态文件服务

 示例代码:

func main() {
	router := gin.Default()
	router.Static("/assets", "./assets")
	router.StaticFS("/more_static", http.Dir("my_file_system"))
	router.StaticFile("/favicon.ico", "./resources/favicon.ico")

	// 监听并在 0.0.0.0:8080 上启动服务
	router.Run(":8080")
}

其中

  • router.Static 指定某个目录为静态资源目录,可直接访问这个目录下的资源,url 要具体到资源名称。
  • router.StaticFS 比前面一个多了个功能,当目录下不存 index.html 文件时,会列出该目录下的所有文件。
  • router.StaticFile 指定某个具体的文件作为静态资源访问。
分类至 GO
0条评论