parent
5ebd6fb6f8
commit
ea00e0d82a
|
@ -5,6 +5,10 @@ on:
|
||||||
|
|
||||||
name: CI
|
name: CI
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash --noprofile --norc -exo pipefail {0}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build
|
name: Build
|
||||||
|
@ -39,7 +43,10 @@ jobs:
|
||||||
docker run -d --rm -p 4000:80 dockerpracticesig/docker_practice
|
docker run -d --rm -p 4000:80 dockerpracticesig/docker_practice
|
||||||
|
|
||||||
sleep 5
|
sleep 5
|
||||||
|
|
||||||
|
echo "::group::Test"
|
||||||
curl 127.0.0.1:4000
|
curl 127.0.0.1:4000
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||||
docker push dockerpracticesig/docker_practice
|
docker push dockerpracticesig/docker_practice
|
||||||
|
@ -139,9 +146,13 @@ jobs:
|
||||||
|
|
||||||
docker push dockerpracticesig/docker_practice:vuepress
|
docker push dockerpracticesig/docker_practice:vuepress
|
||||||
|
|
||||||
docker run -it --rm -d -p 4000:80 dockerpracticesig/docker_practice:vuepress
|
docker run -it --rm -d -p 4001:80 dockerpracticesig/docker_practice:vuepress
|
||||||
|
|
||||||
curl 127.0.0.1:4000
|
sleep 5
|
||||||
|
|
||||||
|
echo "::group::Test"
|
||||||
|
curl 127.0.0.1:4001
|
||||||
|
echo "::endgroup::"
|
||||||
env:
|
env:
|
||||||
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
|
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
|
||||||
DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
|
DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 容器访问控制
|
# 容器访问控制
|
||||||
|
|
||||||
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现。`iptables` 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。
|
容器的访问控制,主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现。`iptables` 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。
|
||||||
|
|
||||||
## 容器访问外部网络
|
## 容器访问外部网络
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 工具和示例
|
# 工具和示例
|
||||||
|
|
||||||
在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:
|
在介绍自定义网络拓扑之前,你可能会对一些外部工具和例子感兴趣:
|
||||||
|
|
||||||
## pipework
|
## pipework
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 基本概念
|
# 基本概念
|
||||||
|
|
||||||
Docker 包括三个基本概念
|
Docker 包括三个基本概念
|
||||||
* 镜像(`Image`)
|
* 镜像(`Image`)
|
||||||
* 容器(`Container`)
|
* 容器(`Container`)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# Debian/Ubuntu
|
# Debian/Ubuntu
|
||||||
|
|
||||||
`Debian` 和 `Ubuntu` 都是目前较为流行的 **Debian 系** 的服务器操作系统,十分适合研发场景。`Docker Hub` 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
|
`Debian` 和 `Ubuntu` 都是目前较为流行的 **Debian 系** 的服务器操作系统,十分适合研发场景。`Docker Hub` 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。
|
||||||
|
|
||||||
## Debian 系统简介
|
## Debian 系统简介
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 操作 Docker 容器
|
# 操作 Docker 容器
|
||||||
|
|
||||||
容器是 Docker 又一核心概念。
|
容器是 Docker 又一核心概念。
|
||||||
|
|
||||||
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
|
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### ADD 更高级的复制文件
|
# ADD 更高级的复制文件
|
||||||
|
|
||||||
`ADD` 指令和 `COPY` 的格式和性质基本一致。但是在 `COPY` 基础上增加了一些功能。
|
`ADD` 指令和 `COPY` 的格式和性质基本一致。但是在 `COPY` 基础上增加了一些功能。
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### ARG 构建参数
|
# ARG 构建参数
|
||||||
|
|
||||||
格式:`ARG <参数名>[=<默认值>]`
|
格式:`ARG <参数名>[=<默认值>]`
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### CMD 容器启动命令
|
# CMD 容器启动命令
|
||||||
|
|
||||||
`CMD` 指令的格式和 `RUN` 相似,也是两种格式:
|
`CMD` 指令的格式和 `RUN` 相似,也是两种格式:
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### COPY 复制文件
|
# COPY 复制文件
|
||||||
|
|
||||||
格式:
|
格式:
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### ENTRYPOINT 入口点
|
# ENTRYPOINT 入口点
|
||||||
|
|
||||||
`ENTRYPOINT` 的格式和 `RUN` 指令格式一样,分为 `exec` 格式和 `shell` 格式。
|
`ENTRYPOINT` 的格式和 `RUN` 指令格式一样,分为 `exec` 格式和 `shell` 格式。
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### ENV 设置环境变量
|
# ENV 设置环境变量
|
||||||
|
|
||||||
格式有两种:
|
格式有两种:
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### EXPOSE 声明端口
|
# EXPOSE 声明端口
|
||||||
|
|
||||||
格式为 `EXPOSE <端口1> [<端口2>...]`。
|
格式为 `EXPOSE <端口1> [<端口2>...]`。
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### HEALTHCHECK 健康检查
|
# HEALTHCHECK 健康检查
|
||||||
|
|
||||||
格式:
|
格式:
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### ONBUILD 为他人做嫁衣裳
|
# ONBUILD 为他人做嫁衣裳
|
||||||
|
|
||||||
格式:`ONBUILD <其它指令>`。
|
格式:`ONBUILD <其它指令>`。
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### 参考文档
|
# 参考文档
|
||||||
|
|
||||||
* `Dockerfie` 官方文档:https://docs.docker.com/engine/reference/builder/
|
* `Dockerfie` 官方文档:https://docs.docker.com/engine/reference/builder/
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### USER 指定当前用户
|
# USER 指定当前用户
|
||||||
|
|
||||||
格式:`USER <用户名>[:<用户组>]`
|
格式:`USER <用户名>[:<用户组>]`
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### VOLUME 定义匿名卷
|
# VOLUME 定义匿名卷
|
||||||
|
|
||||||
格式为:
|
格式为:
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
### WORKDIR 指定工作目录
|
# WORKDIR 指定工作目录
|
||||||
|
|
||||||
格式为 `WORKDIR <工作目录路径>`。
|
格式为 `WORKDIR <工作目录路径>`。
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 简介
|
# 简介
|
||||||
|
|
||||||
本章将带领你进入 **Docker** 的世界。
|
本章将带领你进入 **Docker** 的世界。
|
||||||
|
|
||||||
什么是 **Docker**?
|
什么是 **Docker**?
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 安全
|
# 安全
|
||||||
|
|
||||||
评估 Docker 的安全性时,主要考虑三个方面:
|
评估 Docker 的安全性时,主要考虑三个方面:
|
||||||
|
|
||||||
* 由内核的命名空间和控制组机制提供的容器内在安全
|
* 由内核的命名空间和控制组机制提供的容器内在安全
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 控制组
|
# 控制组
|
||||||
|
|
||||||
控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制。
|
控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制。
|
||||||
|
|
||||||
它提供了很多有用的特性;以及确保各个容器可以公平地分享主机的内存、CPU、磁盘 IO 等资源;当然,更重要的是,控制组确保了当容器内的资源使用产生压力时不会连累主机系统。
|
它提供了很多有用的特性;以及确保各个容器可以公平地分享主机的内存、CPU、磁盘 IO 等资源;当然,更重要的是,控制组确保了当容器内的资源使用产生压力时不会连累主机系统。
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# Docker服务端的防护
|
# Docker服务端的防护
|
||||||
|
|
||||||
运行一个容器或应用程序的核心是通过 Docker 服务端。Docker 服务的运行目前需要 root 权限,因此其安全性十分关键。
|
运行一个容器或应用程序的核心是通过 Docker 服务端。Docker 服务的运行目前需要 root 权限,因此其安全性十分关键。
|
||||||
|
|
||||||
首先,确保只有可信的用户才可以访问 Docker 服务。Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就容易让容器突破资源限制。例如,恶意用户启动容器的时候将主机的根目录`/`映射到容器的 `/host` 目录中,那么容器理论上就可以对主机的文件系统进行任意修改了。这听起来很疯狂?但是事实上几乎所有虚拟化系统都允许类似的资源共享,而没法禁止用户共享主机根文件系统到虚拟机系统。
|
首先,确保只有可信的用户才可以访问 Docker 服务。Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就容易让容器突破资源限制。例如,恶意用户启动容器的时候将主机的根目录`/`映射到容器的 `/host` 目录中,那么容器理论上就可以对主机的文件系统进行任意修改了。这听起来很疯狂?但是事实上几乎所有虚拟化系统都允许类似的资源共享,而没法禁止用户共享主机根文件系统到虚拟机系统。
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 内核命名空间
|
# 内核命名空间
|
||||||
|
|
||||||
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。当用 `docker run` 启动一个容器时,在后台 Docker 为容器创建了一个独立的命名空间和控制组集合。
|
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。当用 `docker run` 启动一个容器时,在后台 Docker 为容器创建了一个独立的命名空间和控制组集合。
|
||||||
|
|
||||||
命名空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用。
|
命名空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用。
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 其它安全特性
|
# 其它安全特性
|
||||||
|
|
||||||
除了能力机制之外,还可以利用一些现有的安全机制来增强使用 Docker 的安全性,例如 TOMOYO, AppArmor, Seccomp, SELinux, GRSEC 等。
|
除了能力机制之外,还可以利用一些现有的安全机制来增强使用 Docker 的安全性,例如 TOMOYO, AppArmor, Seccomp, SELinux, GRSEC 等。
|
||||||
|
|
||||||
Docker 当前默认只启用了能力机制。用户可以采用多种方案来加强 Docker 主机的安全,例如:
|
Docker 当前默认只启用了能力机制。用户可以采用多种方案来加强 Docker 主机的安全,例如:
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 总结
|
# 总结
|
||||||
|
|
||||||
总体来看,Docker 容器还是十分安全的,特别是在容器内不使用 root 权限来运行进程的话。
|
总体来看,Docker 容器还是十分安全的,特别是在容器内不使用 root 权限来运行进程的话。
|
||||||
|
|
||||||
另外,用户可以使用现有工具,比如 [Apparmor](https://docs.docker.com/engine/security/apparmor/), [Seccomp](https://docs.docker.com/engine/security/seccomp/), SELinux, GRSEC 来增强安全性;甚至自己在内核中实现更复杂的安全机制。
|
另外,用户可以使用现有工具,比如 [Apparmor](https://docs.docker.com/engine/security/apparmor/), [Seccomp](https://docs.docker.com/engine/security/seccomp/), SELinux, GRSEC 来增强安全性;甚至自己在内核中实现更复杂的安全机制。
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# 命名空间
|
# 命名空间
|
||||||
|
|
||||||
命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。
|
命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。
|
||||||
|
|
||||||
## pid 命名空间
|
## pid 命名空间
|
||||||
|
|
Loading…
Reference in New Issue