|
|
可选策略
在docker run通过 –restart 设置守护机制:
- no: 不自动重新启动容器(默认)
- on-failure: 容器发生error而退出(容器退出状态不为0)重启容器
- unless-stopped: 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
- always: 如果容器停止,总是重新启动容器。如果手动kill容器,则无法自动重启。
docker update追加命令
运行中的容器,当时没有指定restart可以通过update命令追加
参考:https://www.jianshu.com/p/5c1f152ac4a6
1. 前言
(Union filesystem)联合文件系统允许我们把多个文件系统逻辑上合并成一个文件系统,组成Union filesystem的文件系统不必相同(它们可以是ext2/3/4,vfat,ntfs,jffs…)。overlay是联合文件系统的一种(a ufs…),overlay文件系统构建于其他文件系统之上,overlay其实更像是个挂载系统(mount system),功能是把不同的文件系统挂载到统一的路径。
https://developer.aliyun.com/article/799104
还可以看看这个
|
|
容器和KVM虚拟化是两种不同的虚拟化技术,它们各有优缺点,适用于不同的场景。
容器
容器是一种轻量级的虚拟化技术,利用操作系统层面的虚拟化实现。每个容器都运行在一个独立的命名空间中,可以看作是进程的一个集合,共享主机操作系统的内核。容器可以快速启动、停止和迁移,占用的资源比KVM虚拟机少,因此更适合部署大规模的分布式应用程序。常见的容器技术包括Docker、LXC等。 优点:
背景
简单来说,一个租户就是一个公司的客户,多个租户共用同一个SaaS系统,一旦SaaS系统不可用,那么所有的租户都不可用,
多租户问题,其实是一种架构设计方式,就是在一台或者一组服务器上运行的SaaS系统,可以为多个租户(客户)提供服务,目的是为了让多个租户在互联网环境下使用同一套程序,且保证租户间的数据隔离。从这种架构设计的模式上,不难看出来,多租户架构的重点就是同一套程序下多个租户数据的隔离。由于租户数据是集中存储的,所以要实现数据的安全性,就是看能否实现对租户数据的隔离,防止租户数据不经意或被他人恶意地获取和篡改。
在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:
- 数据卷(Data Volumes)
- 挂载主机目录 (Bind mounts)
数据卷
数据卷
是一个可供一个或多个容器使用的特殊目录,它绕过UFS
,可以提供很多有用的特性:
命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Usage: Run a command in a new container
中文意思为:通过run命令创建一个新的容器(container)
- 常用选项说明
d, --detach=false
, 指定容器运行于前台还是后台,默认为falsei, --interactive=false
, 打开STDIN,用于控制台交互t, --tty=false
, 分配tty设备,该可以支持终端登录,默认为falseu, --user=""
, 指定容器的用户a, --attach=[]
, 登录容器(必须是以docker run -d启动的容器)w, --workdir=""
, 指定容器的工作目录c, --cpu-shares=0
, 设置容器CPU权重,在CPU共享场景使用e, --env=[]
, 指定环境变量,容器中可以使用该环境变量m, --memory=""
, 指定容器的内存上限P, --publish-all=false
, 指定容器暴露的端口p, --publish=[]
, 指定容器暴露的端口h, --hostname=""
, 指定容器的主机名v, --volume=[]
, 给容器挂载存储卷,挂载到容器的某个目录-volumes-from=[]
, 给容器挂载其他容器上的卷,挂载到容器的某个目录-cap-add=[]
, 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities-cap-drop=[]
, 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities-cidfile=""
, 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法-cpuset=""
, 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU-device=[]
, 添加主机设备给容器,相当于设备直通-dns=[]
, 指定容器的dns服务器-dns-search=[]
, 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件-entrypoint=""
, 覆盖image的入口点-env-file=[]
, 指定环境变量文件,文件格式为每行一个环境变量-expose=[]
, 指定容器暴露的端口,即修改镜像的暴露端口-link=[]
, 指定容器间的关联,使用其他容器的IP、env等信息-lxc-conf=[]
, 指定容器的配置文件,只有在指定–exec-driver=lxc时使用-name=""
, 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字-net="bridge"
, 容器网络设置:- bridge 使用docker daemon指定的网桥
- host //容器使用主机的网络
- container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
- none 容器使用自己的网络(类似–net=bridge),但是不进行配置
-privileged=false
, 指定容器是否为特权容器,特权容器拥有所有的capabilities-restart="no"
, 指定容器停止后的重启策略:- no:容器退出时不重启
- on-failure:容器故障退出(返回值非零)时重启
- always:容器退出时总是重启
-rm=false
, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)-sig-proxy=true
, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
示例
- 运行一个在后台执行的容器,同时,还能用控制台管理:
docker run -i -t -d ubuntu:latest
- 运行一个带命令在后台不断执行的容器,不直接展示容器内部信息:
docker run -d ubuntu:latest ping www.docker.com
- 运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理,
docker run -d --restart=always ubuntu:latest ping www.docker.com
- 为容器指定一个名字,
docker run -d --name=ubuntu_server ubuntu:latest
- 容器暴露80端口,并指定宿主机80端口与其通信(: 之前是宿主机端口,之后是容器需暴露的端口),
docker run -d --name=ubuntu_server -p 80:80 ubuntu:latest
- 指定容器内目录与宿主机目录共享(: 之前是宿主机文件夹,之后是容器需共享的文件夹),
docker run -d --name=ubuntu_server -v /etc/www:/var/www ubuntu:latest
主要依靠的一个开源软件runlike
See runlike-github
|
|
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P
或-p
参数来指定端口映射。
当使用-P
标记时,Docker会随机映射一个端口到内部容器开放的网络端口。
Bridge模式
当Docker
进程启动时,会在主机上创建一个名为docker0
的虚拟网桥,此主机上启动的Docker
容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从docker0
子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair
设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为eth0
(容器的网卡),另一端放在主机中,以vethxxx
这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过brctl show
命令查看。