Docker 中使用 linux namespace 机制来隔离不同容器的网络配置。
简而言之,一般情况下每个容器有一个独立的 network namespace,这个 namespace 和主机的网络配置是隔离的,而他们之间通过一条虚拟链路以及网桥相连。
接下来的过程通过命令行模拟了这个网络建立的过程,以便粗浅的理解 linux namespace 的原理。
Docker 中使用 linux namespace 机制来隔离不同容器的网络配置。
简而言之,一般情况下每个容器有一个独立的 network namespace,这个 namespace 和主机的网络配置是隔离的,而他们之间通过一条虚拟链路以及网桥相连。
接下来的过程通过命令行模拟了这个网络建立的过程,以便粗浅的理解 linux namespace 的原理。
0. 将任务按不同的类型分开,例如 DiskIO,NetworkIO,CPU,能够有效地提升性能。
假设一个循环的任务由 1)下载文件、2)解压缩、3)保存到硬盘三个部分组成,总计运行 N 次。
如果one by one地做完三件事,总时间是 N * (t1 + t2 + t3)
如果组成流水线,总时间缩短到 N * min(t1, t2, t3)
在本地的Docker上Pull AWS EC2 Container Services的镜像时,遇到如下错误:
Failed to pull image "url": image pull failed for url, this may be because there are no credentials on this request. details: (unauthorized: authentication required)
解决方案是用AWS CLI工具登录Docker
1 | eval `aws ecr get-login` |
以下是引用自某开源项目的做法:
1 | FROM golang:alpine |
这样产生的包大约是 100MB,已经很不错了,但是还是浪费了大量空间。
比如 Golang SDK 在程序运行中根本用不到,Go Get
带来的源文件同样用不到。Golang是可以编译到真二进制的的语言,只要保留程序本身和必要的动态链接库(.so
)即可。进一步,如果使用静态链接,那库也可以不要。
给定的程序
readelf32
存在一个漏洞(想多了,这当然不是Linux里的readelf
),它读取文件内容写入到一个局部变量,但没有正确地检查文件大小。
实验中假设 ASLR 已经关闭: 1
echo 0 >/proc/sys/kernel/randomize_va_space
在IDEA中建立一个带有Spring框架等依赖的Java工程,并用Gradle作为包管理器,该项目在Tomcat中运行
Step 1: 使用 Gradle 或者 IDEA 自带的向导,建立 Gradle 工程
Step 2: 向 build.gradle
中添加插件、依赖等等,例如: