Linux容器架构
1.
- Iaas:基础设施即服务 Infrastructure-as-a-Service
- Paas:平台即服务 Platform-as-a-Service
- Saas:软件即服务 Software-as-a-Service
- Caas:容器即服务 介于IAAS和PAAS
- IAAS,PAAS,SAAS这些服务,用于帮助人们更快实现目标(搭建环境,使用产品)
- 从左到右,人们需要管理与维护的地方越来越少,人们可以把重点关注在使用/应用上.
- IAAS平台:基础设施,阿里云,云厂商.
- PAAS平台:服务/运行环境是ok,公有云,负载均衡SLB
- SAAS平台:服务已经准备好,您直接用,具体产品,processon,wps,亿图.
2.容器
容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止.
容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理,相当于一个mini的系统
3.Docker
4.Docker架构
5.端口映射
使用docker的时候 外界访问docker容器中的服务或端口,需要使用端口映射.本质类似于iptables防火墙的端口映射.
应用场景: 未来容器需要被外界访问(80端口).需要暴漏在外界一个端口.
用户通过端口访问容器中的某个端口.
实现方法:docker run通过-p选项实现.
本质是通过iptables nat规则实现的.nat表中创建了docker自定义的链
6.用户访问Docker服务流程
7.数据卷使用和容器架构
8.小结
容器 vs 虚拟机 ⭐
docker cs架构
镜像
容器
仓库
docker镜像管理
镜像常用系统
alpine,ubuntu,debian,centos.
docker容器管理
docker 容器:inspect,stats,top
docker 端口映射.
应用场景:需要外接访问容器中的资源与服务的.
-p 宿主机端口:容器端口
-P 随机映射 ՎՎҨ -p :80(80为容器中监听的端口)
-p 监听指定ip和端口 -p 宿主机ip:宿主机端口:容器端口
docker 数据卷挂载.
应用场景: 解决容器中数据持久化的问题.
挂载指定的文件或目录到容器中
格式:
-v 宿主机的目录/文件:容器的目录/文件 ⚠ 容器中的路径要使用绝对路径.
-v /app/docker/conf/nginx/conf.d/:/etc/nginx/conf.d/
9.自定义镜像全流程
10.Dockerfile
应用场景: 通过1个文件Dockerfile,生成自定义 镜像
为何使用Dockerfile:
我们目前都是手动拉取镜像,手动进行配置,手动安装依赖,手动编译安装,创建用户....,这个过程类似于命令行使用ansible模块(繁
琐,不方便重复执行).
书写Dockerfile把之前手动创建自定义镜像的过程,通过Dockerfile里面的指令实现.类似于书写playbook.
Dockerfile用于根据要求自动创建 镜像
11.Docker镜像层次架构
12.分离式容器架构
13.Docker compose
docker镜像可以通过Dockerfile一键创建.
目前问题:⚠ docker容器的管理(启动,关闭,重启),需要手动执行,如何管理多个容器.
单机容器编排工具
docker compose
集群管理
ansible
docker swarm实现集群管理.
mesos
未来我们通过k8s kubernetes(船舵)实现集群管理.
了解:docker三剑客之一:docker machine(管理虚拟机),docker compose(容器编排),docker swarm(集群).
docker compose需要单独安装(epel源中就有),语法yaml格式.
14.docker-compse格式
15.仓库选型
16.
17.阿里云概述
18.ecs
19.rds
20.存储
- 块存储:磁盘,云盘
- 文件存储:nfs存储,samba存储,nas存储
- 对象存储:自带数据高可用.ceph(开源软件),阿里云oss
21.alb小结
22.cdn
CDN 分布式缓存: 让用户就近访问,访问速度加快.
cdn一般用于缓存静态资源: html,css,js,图片,视频
使用流程:
- 已经备案的域名.
- 添加域名
- 配置缓存策略
- 测试
- 配置CNAME 正式域名解析到cdn上面
23.7层的防火墙
- DOS 拒绝式服务攻击 1个人访问
- DDOS 分布式拒绝服务攻击 多人
- 攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(Challenge Collapsar)。
- 防数据泄密,避免因黑客的注入入侵攻击,导致网站核心数据被拖库泄露。
- 防恶意CC,通过阻断海量的恶意请求,保障网站可用性。
- 阻止木马上传网页篡改,保障网站的公信力。
- 提供虚拟补丁,针对网站被曝光的最新漏洞,最大可能地提供快速修复规则。
24.docker 命令
docker images ՎՎҨ docker image ls docker search 搜索镜像, 优先选官方,stars数量多 docker pull 拉取镜像(下载镜像),注意版本 docker push 推送镜像(上传镜像) docker load 导入镜像 例子: docker load -i docker_nginx.tar.gz docker save 导出镜像 例子:docker save centos:7 -o docker_centos7.tar.gz docker images 查看镜像列表 docker rmi 删除镜像 docker tag 给镜像打标签
docker ps 查看容器列表 -a 查看所有容器 docker run 创建并运行容器 例子:docker run -d -it -p 80:80 nginx:latest docker create 创建容器 Վʔname docker start 启动容器 docker stop 停止容器 docker restart 重启容器 docker kill 强制停止容器 docker rm 删除容器 批量删除所有容器 docker rm -f `docker ps -a -q` docker exec 进入正在运行的容器(分配一个新终端) 例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
docker attach 进入正在运行的容器(使用相同的终端),偷偷离开的快捷键ctrl +p,ctrl +q
容器使用三部曲指令小结
- docker container ps ՎՎҨ docker ps 选项-a 查看所有状态的容器, -q只输出容器的id号可以用于批量删除容器. docker rm -f $(docker ps -q)
- docker rm 删除容器,-f强制删除容器.
- docker run docker核心指令,选项也是最多.
- -d 容器后台运行.
- -p 端口映射,外部或其他服务器想要访问容器内部的某个服务的端口. -p 外部用于访问的端口:容器内部服务的端口
- Վʔname 指定容器的名字
如果退出容器,那么容器状态会怎么样?
- -it 运行容器,容器是一个系统.
- 容器退出后,容器关闭了.
关于docker run -it说明
- -i 进入交互模式
- -t 分配一个终端(运行命令解释器) /bin/bash 或 /bin/sh
- -it 进入容器并有个命令行(终端).
- 好处运行容器的同时可以进入到容器中,缺点:退出容器则容器结束.
如何后台持续运行纯净系统的容器.
- #通过-itd + 指定命令解释器持续运行
- docker run -itd --name oldboy_centos_v6 centos
- /bin/bash
docker exec小结
- 用于与已经运行中的容器进行连接.
- -it 交互模式分配终端
- docker exec -it --name xxx 镜像名字:版本 参数(一般/bin/bash 或/bin/sh)
- nginx -t ;nginx -s reload
docker run背后
- docker pull #如果镜像不存在.
- docker create 创建容器.
- docker start 启动容器.
- docker stop 关闭容器. #向容器中的主进程,pid 1 进程发出信号(kill),关闭.
- docker restart重启重启.
传输文件
docker container cp === docker cp
docker cp:
- 宿主机与容器间互传数据.
- -a表示保存文件属性不变(uid,gid)
结束容器
- docker stop关闭容器
- docker rm删除容器
- docker kill
- docker kill -s 9 oldboy_nginx_alpine_v4 -s表示信号 -s 9 等于 kill -9 pid强制结束.
commit用于自定义镜像
- 处理容器,生成镜像.
- 使用流程:
- 运行服务镜像或系统镜像,启动后成为容器.
- 根据我们的需求,对容器进行修改.
- 测试完成后.
- 最后通过commit命令把容器保存为镜像.
- 根据新生成的镜像创建容器并测试
1对1端口映射
数据卷挂载
docker run
- -v
- 指定要挂载的目录/文件
- -v 宿主机的路径:容器内部路径
docker run -d --name "docker_volumnt_ngx_v1" -p 80:80 \ -v /app/docker/code/index.html:/usr/share/nginx/html/index.html \ nginx:alpine
25.手动创建tengine镜像
1). 下载并启动ubuntu:20.04 容器 叫ubt_tengine_2.3.3
docker run -it Վʔname "ubt_tengine_2.3.3" ubuntu:20.04 /bin/bash
2) 配置apt源
ll /etc/apt/sources.list sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.ali yun.com#g' /etc/apt/sources.list apt update #生成apt缓存
3)下载软件包
1.安装常用软件 apt install -y wget vim curl 2.下载软件包 wget -P /tmp/ http:Վˌtengine.taobao.org/download/tengine-2.3.3.tar.gz
4)编译安装3步曲
安装依赖 ./configure #进行编译安装的配置ՎՎʖ Makefile 用于编译. make #编译(根据Makefile配置进行编译) make install #创建目录,复制文件ՎՎʢ 1. 安装依赖 apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev #openssl-devel 2. 进行配置(指定用户,指定安装目录,添加或开启模块) 解压源码包,进入解压目录(略) Վʔprefix=/app/tools/tengine-2.3.3/ tengine的安装目 录,安装到系统的那个目录中,自动创建. ./configure Վʔprefix=/app/tools/tengine-2.3.3/ \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_mp4_module \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module \ --add-module=modules/ngx_http_upstream_check_module/ \ Վʔaddmodule=modules/ngx_http_upstream_session_sticky_modu le echo $? #上一个命令的执行结果 ,如果是0表示成功,非0就是失败 3. make编译 make -j 1 4. make install编译安装 make install 5. 检查 /app/tools/tengine-2.3.3/sbin/nginx -V
5) 收尾,启动,测试
1. 添加用户nginx 2. 创建安装目录软连接 3. nginx命令软连接到/sbin/下面. 4. 启动与本地测试. 1. 添加用户nginx groupadd nginx useradd -g nginx nginx 2. 创建安装目录软连接 ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine 3. nginx命令软连接到/sbin/下面. ln -s /app/tools/tengine/sbin/nginx /sbin nginx -V 4. 启动与本地测试. nginx #启动后会在后台运行. echo docker-teninge.oldboylinux.cn >/app/tools/tengine/html/index.html curl localhost 显示: docker-teninge.oldboylinux.cn
6)清理镜像
1. 清理代码包,解压目录 rm -fr /tmpՎˇ 2. 清理apt/yum缓存 rm -fr /var/cacheՎˇ 3. 其他的清理,逐步测试
7)生成镜像
docker commit ubt_tengine_2.3.3 tengine:2.3.3-v1_not_you
8)运行容器
启动容器容器中,要有个服务在前台阻塞住. 这个容器中没有配置的. 需要手动指定. 1. 启动服务注意这里要加上 nginx -g 'daemon off;' docker run -d Վʔname "tengine-2.3.3-not_opt_v1" -p 80:80 tengine:2.3.3-v1_not_you nginx -g 'daemon off;' 2. 检查 curl 10.0.0.81:80 docker-teninge.oldboylinux.cn
9)关于日志(了解)
ln -s /dev/stdout /app/tools/tengine/logs/access.log 访问日志 stdout标准输出 ln -s /dev/sdterr /app/tools/tengine/logs/error.log 错误日志 stderr错误输出 只要有访问日志生成就会输出到屏幕,就可以通过docker logs 查看 logs -f 查看
rm -f /app/tools/tengine/logsՎˇ
ln -s /dev/stdout
/app/tools/tengine/logs/access.log
ln -s /dev/stderr /app/tools/tengine/logs/error.log
Dockerfile使用
1 1. 准备目录及Dockerfile 2 [root@docker01.oldboylinux.cn /server/dockfile/01- centos-nginx]# cat Dockerfile 3 FROM centos:7 LABEL author="oldboylidao996" RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http:Վˌmirrors.aliyun.com/repo/Centos-7.repo RUN curl -o /etc/yum.repos.d/epel.repo http:Վˌmirrors.aliyun.com/repo/epel-7.repo RUN yum -y install nginx RUN rm -rf /usr/share/nginx/html/index.html RUN echo 'oldboyedu linux' > /usr/share/nginx/html/index.html CMD ["nginx","-g","daemon off;"] 2. 根据Dockerfile构建镜像 docker build . -t 'nginx:1.20.2-centos7' 注意: .表示 Dockerfile在当前目录下面 -t 就是给自定义镜像命 名. 3. 运行 docker run -d Վʔname 'nginx-1.20.1-centos7-01' -p 81:80 nginx:1.20.2-centos7 4. 调试
Dockerfile中的指令
Dockerfile构建镜像脚本
1 1. 目录准备 2 tengine.2.3.3.tar.gz 源码包 3 bird.tar.gz 代码包 2. 书写Dockerfile #1. 基本信息 FROM ubuntu:20.04 LABEL author="lidao996" \ url="www.oldboyedu.com" #2. 传输软件包 ADD tengine-2.3.3.tar.gz /tmp/ #3. 环境准备 RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.al iyun.com#g' /etc/apt/sources.list \ && apt update \ && apt install -y libssl-dev make gcc pcre2- utils libpcre3-dev zlib1g-dev \ && cd /tmp/tengine-2.3.3/ \ && ./configure Վʔprefix=/app/tools/tengine- 2.3.3/ \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_mp4_module \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module \ --addmodule=modules/ngx_http_upstream_check_module/ \ --addmodule=modules/ngx_http_upstream_session_sticky_modu le \ && make -j 1 \ && make install \ && ln -s /app/tools/tengine-2.3.3/sbin/nginx /sbin/ \ && ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine \ && useradd -s /sbin/nologin nginx #4. 传输代码 ADD bird.tar.gz /app/tools/tengine/html/ #5. 清理 RUN rm -fr /tmpՎˇ /var/cacheՎˇ #6. 设置暴露80端口和入口指令 EXPOSE 80 CMD [ "nginx","-g","daemon off;" ] 3. 构建镜像 docker build -t "tengine:2.3.3-v1-dockerfile" . Successfully built 770d8ee9b3d8 Successfully tagged tengine:2.3.3-v1-dockerfile 4. 启动 docker run -d --name "tengine-2.3.3-dockerfile-v1" -p 80:80 tengine:2.3.3-v1-dockerfile
使用多节点提交实现:
- 编译安装一些软件的时候,一般是先安装各种依赖,然后开始编译安装,编译安装一般会生成新的命令.
- 1个镜像负责编译安装,生成命令.(临时)
- 1个镜像上一个镜像的命令复制过来+服务必要的配置.
- 最终使用最后的这个镜像.
Doceker compose命令
- depends_on: 依赖,先启动指定的容器然后再启动当前容器.
- volumes: 数据卷
- links: 容器连接,本质hosts解析.
手动创建镜像.
Dockerfile格式
- 第1部分-用于指定使用的镜像,设置镜像的属性,设置变量
- 第2部分-对镜像处理
- 第3部分-指定端口,指定入口命令/脚本.
Dockerfile指令
- 第1部分-用于指定使用的镜像,设置镜像的属性,设置变量
- FROM ubuntu:20.04
- LABEL author="lidao996" ՎՎʢ
- ENV Server tengine
- ENV Server_Version 2.3.3
- 第2部分-对镜像处理
- RUN
- ADD
- COPY
- WORKDIR 修改容器工作目录
- VOLUME 给容器内部的目录,设置随机数据卷.持久化. 未来通过docker run -v
- USER 运行程序时使用的用户。
- 第3部分-指定端口,指定入口命令/脚本.
- EXPOSE 1.方便查看镜像信息得知容器端口 2. -P随机映射端口 -p :EXPOSE的端口 ՎՎʢ
- CMD
- ENTRYPOINT
docker底层分离的原理: namespace,cgroups,文件系统