> 技术文档 > Linux云计算SRE-第十五周_sre-linux云计算运维学习资料

Linux云计算SRE-第十五周_sre-linux云计算运维学习资料


1.总结Dockerfile的指令和Docker的网络模式

一、Dockerfile 核心指令详解
1、基础构建指令

指令

功能描述

关键特性

FROM

指定基础镜像(必须为首条指令)

- 支持多阶段构建:FROM node AS builder
scratch 表示空镜像

RUN

在镜像构建时执行命令

- Shell格式:RUN apt-get update
- Exec格式:RUN [\"/bin/bash\", \"-c\", \"echo hello\"]
- 避免多层:合并命令减少镜像层数

CMD

容器启动时执行的默认命令(可被覆盖)

- 仅最后一个生效
- 与 ENTRYPOINT 组合时作为参数

ENTRYPOINT

容器启动时固定执行的命令(需用 --entrypoint 覆盖)

- 与 CMD 组合:ENTRYPOINT [\"java\", \"-jar\"] + CMD [\"app.jar\"] → java -jar app.jar
- Shell格式会忽略 CMD 参数 

 示例:

FROM ubuntu:22.04RUN apt-get update && apt-get install -y curlCMD [\"nginx\", \"-g\", \"daemon off;\"]ENTRYPOINT [\"curl\", \"-s\", \"http://ip.cn\"]
2、文件与环境配置 
指令 功能描述 关键区别 COPY 复制本地文件到镜像(推荐) - 不支持自动解压
- 目标路径需以 / 结尾 ADD 复制文件并支持自动解压(谨慎使用) - 自动解压 tar/gzip 等压缩文件
- 从 URL 下载文件 ENV 设置环境变量(构建和运行时均有效) - 支持多变量:ENV A=1 B=2 ARG 定义构建时变量(仅在构建阶段有效) - 可通过 --build-arg 覆盖

  示例:

COPY ./app /usr/src/appADD http://example.com/app.tar.gz /data/ENV NODE_ENV=productionARG VERSION=1.0
3、元数据与优化指令 
指令 功能描述 使用场景 LABEL 添加镜像元数据(替代 MAINTAINER) - 多键值对:LABEL author=\"admin\" version=\"1.0\" VOLUME 声明匿名数据卷(实现数据持久化) - 避免容器重启数据丢失
- 需配合 -v 挂载使用 USER 切换运行用户(提升安全性) - 需确保用户已存在 HEALTHCHECK 定义容器健康检查 - 支持间隔、超时和重试参数

   示例:

LABEL maintainer=\"admin@example.com\"VOLUME [\"/var/lib/mysql\"]USER nobodyHEALTHCHECK --interval=30s CMD curl -f http://localhost
二、Docker 网络模式深度解析  

Docker提供了多种网络模式,以便在容器间建立网络通信和连接外部网络。以下是Docker的主要网络模式及其实例:

1、Bridge模式
概述:
Bridge模式是Docker的默认网络模式。
在Bridge模式下,Docker会创建一个名为docker0的虚拟网桥,并为每个容器分配一个IP地址。
容器之间以及容器与宿主机之间都可以通过IP地址进行通信。
实例:
创建一个名为httpd的容器,并将宿主机的80端口映射到容器的80端口:

docker run -d --name httpd -p 80:80 httpd

验证容器的网络配置:

docker exec -it httpd cat /etc/hosts

2、Host模式
概述:
在Host模式下,容器直接使用宿主机的网络,与宿主机共享网络接口。
容器的网络配置与宿主机相同,可以通过宿主机的IP地址直接访问容器。
特点:
容器与宿主机共享网络栈,因此具有相同的IP地址和端口空间。
适用于对网络性能要求较高、网络隔离性要求较低或需要访问主机上网络服务的场景。
实例:
将一个Node.js创建的简单Web服务器容器设置为Host模式:

docker run --net=host my_web_server

现在,可以通过在浏览器中访问http://localhost:3000来查看运行中的Web服务器(假设Web服务器在容器的3000端口上运行)。
3、Container模式
概述:
在Container模式下,新创建的容器会共享另一个已存在容器的网络命名空间。
新容器可以使用已存在容器的IP地址和端口配置,实现网络资源的共享。
实例:
假设已经有一个名为nginx1的容器在运行,可以启动另一个名为nginx2的容器,并使其共享nginx1的网络命名空间:

docker run --name nginx2 --net=container:nginx1 nginx:v1

4、None模式
概述:
在None模式下,容器没有自己的网络接口和IP地址。
这种模式通常用于需要自定义网络配置的容器,或者只需要与宿主机或其他容器进行本地通信的容器。
实例:
创建一个使用None网络模式的Ubuntu容器:

docker run -itd --net=none --name ubuntu-test1 ubuntu /bin/bash

5、自定义模式
概述:
自定义模式允许用户创建自己的网络,并指定子网、IP地址范围、网关等网络配置。
自定义网络可以提供更好的隔离和网络管理。
自定义网络实例:

# 创建自定义桥接网络docker network create \\ --driver=bridge \\ --subnet=172.20.0.0/24 \\ --gateway=172.20.0.1 \\ app-net# 容器加入自定义网络(支持别名通信)docker run -d --name web \\ --network=app-net \\ --network-alias=web01 \\ nginx:alpine

自定义模式优势:

  • 容器间可以通过别名通信(ping web01)

  • 支持网络策略(带宽限制、访问控制)

  • 跨主机通信(需配合overlay驱动)

2.搭建harbor私有仓库并且上传镜像到私有仓库

一、搭建harbor私有仓库
1、安装 docker# 在ubuntu主机上,以root用户身份,安装docker所需要的依赖项[root@ubuntu22 ~]# apt update && apt install -y apt-transport-https ca-certificates software-properties-common# 安装GPG证书[root@ubuntu22 ~]# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 写入软件源信息[root@ubuntu22 ~]# echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable\" | tee /etc/apt/sources.list.d/docker.list > /dev/null# 更新APT包索引[root@ubuntu22 ~]# apt update# 查看可用的Docker-CE版本[root@ubuntu22 ~]# apt-cache madison docker-ce# 安装指定版本的Docker-CE和Docker-CE-CLI[root@ubuntu22 ~]# apt -y install docker-ce=5:25.0.5-1~ubuntu.22.04~jammy docker-ce-cli=5:25.0.5-1~ubuntu.22.04~jammy containerd.io# 验证Docker是否安装成功[root@ubuntu22 ~]# docker --version[root@ubuntu22 ~]# systemctl status docker2、新版docker自带docker compose命令[root@ubuntu22 ~]#docker compose versionDocker Compose version v2.33.0[root@ubuntu22 ~]#alias docker-compose=\"docker compose\"3、下载Harbor安装包并解压缩[root@ubuntu22 ~]# wegt https://github.com/goharbor/harbor/releases/download/v2.12.2/harbor-offline-installer-v2.12.2.tgz[root@ubuntu22 ~]# mkdir /apps[root@ubuntu22 ~]# tar xvf harbor-offline-installer-v2.12.2.tgz -C /apps/[root@ubuntu22 harbor]#lscommon.sh harbor.v2.12.2.tar.gz harbor.yml.tmpl install.sh LICENSE prepare4、编辑 harbor 配置文件[root@ubuntu22 ~]# mv /apps/harbor/harbor.yml.tmpl /apps/harbor/harbor.yml[root@ubuntu22 ~]# vim /apps/harbor/harbor.yml#只需要修改下面两行hostname = 10.0.0.100          #修改此行,指向当前主机IP或FQDN,建议配置IPharbor_admin_password = 123456 #修改此行指定harbor登录用户admin的密码,默认用户/密码:admin/Harbor12345data_volume: /data/harbor      #建议修改数据目录路径,使用大容量的高速磁盘,默认为/data#如果不使用https,还需要将下面行注释掉#https:# port: 443# certificate: /your/certificate/path# private_key: /your/private/key/path#可选项ui_url_protocol = http #默认即可,如果修改为https,需要指定下面证书路径ssl_cert = /data/cert/server.crt #默认即可,https时,需指定下面证书文件路径ss_cert_key = /data/cert/server.key   #默认即可,https时,需指定下面私钥文件路径5、运行 harbor 安装脚本#先安装python[root@ubuntu22 ~]# apt -y install python3#安装docker harbor [root@ubuntu22 ~]# /apps/harbor/install.sh[root@ubuntu22 ~]# docker ps

 6、登录 harbor 主机网站
用浏览器访问: http://10.0.0.100/
用户名: admin 
密码: 即前面harbor.cfg中指定的密码123456

二、使用单主机Harbor
1、建立项目

 2、创建用户和项目授权
3、命令行登录 Harbor
[root@ubuntu22 harbor]# vim /etc/docker/daemon.json { \"registry-mirrors\": [\"https://docker.1ms.run\", \"https://kpczdzbv.mirror.aliyuncs.com\"], \"insecure-registries\": [\"10.0.0.100:80\"] }[root@ubuntu22 harbor]# systemctl daemon-reload[root@ubuntu22 harbor]# systemctl restart docker#非交互登录[root@ubuntu22 harbor]# echo \"M92-zhang\" | docker login 10.0.0.100:80 -u zhangyao --password-stdinWARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded#查看进程是否添加上面设置[root@ubuntu22 harbor]# ps aux|grep dockerd
4、给本地镜像打标签并上传到 Harbor 
[root@ubuntu22 harbor]# docker tag docker.1ms.run/library/alpine 10.0.0.100:80/example/alpine:3.11[root@ubuntu22 harbor]# docker push 10.0.0.100:80/example/alpine:3.11The push refers to repository [10.0.0.100:80/example/alpine]08000c18d16d: Pushed 3.11: digest: sha256:ec1b05d1eac264d9204a57f4ad9d4dc35e9e756e9fedaea0674aefc7edb1d6a4 size: 527

访问harbor网站验证上传镜像成功: 

3.总结JumpServer的安装和使用

JumpServer是一款堡垒机产品,它是全球首款完全开源的堡垒机,使用GNU GPL v2.0开源协议,是符合4A(认证Authentication、授权Authorization、账号Account、审计Audit)的专业运维审计系统。以下是对JumpServer的安装和使用的总结:

一、JumpServer的安装

环境准备
硬件要求:建议配置为4Core/8GB RAM/300GHDD,但2个CPU、4G内存、至少50G硬盘也可满足基本需求(屏幕录制功能非常占磁盘空间)。
软件要求:
操作系统:如CentOS。
Python:需要Python 3.6或更高版本。
数据库:MySQL或MariaDB,版本需大于等于5.6。
Redis:用于cache和celery broke。
其他:如yum-utils、device-mapper-persistent-data、lvm2等依赖包。
安装步骤
安装Docker:通过yum安装Docker及其依赖,并配置开机启动。
下载JumpServer安装包:从JumpServer的官方GitHub仓库或国内镜像站点下载最新版本的安装包。
解压并配置:解压安装包,并根据需要修改配置文件,如数据库连接信息、加密密钥等。
启动JumpServer:使用Docker Compose或相关命令启动JumpServer服务。

在Rocky Linux 8.10和Ubuntu 22.04系统上基于Docker部署JumpServer的完整操作指南:#三种方式安装jumpserver# ubuntu上docker安装jumpserver# 创建一个名为jumpserver-net的docker网络,后续容器会加入此网络来实现通信[root@ubuntu ~]#docker network create jumpserver-net # 使用vim编辑器创建并编辑mysqld.cnf文件,用于配置MySQL[root@ubuntu ~]#vim mysqld.cnf[mysqld]default_authentication_plugin=mysql_native_password # 从Docker Hub拉取MySQL 8.0.29-oracle版本的镜像[root@ubuntu ~]#docker pull mysql:8.0.29-oracle# 从Docker Hub拉取Redis 6.2.14版本的镜像[root@ubuntu ~]#docker pull redis:6.2.14 # 运行MySQL容器# --name指定容器名为mysql# -e设置环境变量,如MySQL的root密码、数据库名、用户及密码# -d表示后台运行# -v挂载本地的mysqld.cnf配置文件到容器内# --restart always容器异常退出时自动重启# --network指定容器加入的网络[root@ubuntu ~]#docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jumpserver -e MYSQL_USER=jumpserver -e MYSQL_PASSWORD=123456 -d -v./mysqld.cnf:/etc/mysql/conf.d/mysqld.cnf --restart always --network jumpserver-net mysql:8.0.29-oracle # 运行Redis容器,-d后台运行,--name指定容器名,--restart always自动重启,--network加入指定网络[root@ubuntu ~]#docker run -d --name redis --restart always --network jumpserver-net redis:6.2.14 # 进入MySQL容器的交互式终端,登录MySQL数据库[root@ubuntu ~]#docker exec -it mysql shmysql -uroot -p123456mysql>exit # 进入Redis容器的交互式终端,设置Redis密码[root@ubuntu ~]#docker exec -it redis shredis-cli127.0.0.1:6379>CONFIG set requirepass 123456127.0.0.1:6379>exit# 验证Redis密码是否设置成功redis-cli127.0.0.1:6379>auth 123456127.0.0.1:6379>exit # 生成一个50位的随机字符串,用作SECRET_KEY[root@ubuntu ~]# cat /dev/urandom | tr -dc \'[:alnum:]\' | head -c50aRSvqx9Ln6Vi4tKRp6on7T7WS0XZlFPQCZzQmfL8xSYXsaQCHf# 生成一个30位的随机字符串,用作BOOTSTRAP_TOKEN[root@ubuntu ~]# cat /dev/urandom | tr -dc \'[:alnum:]\' | head -c30vsyLcLXhe85yXC0tD9EvROhAR6kHD7 # 从Docker Hub拉取jumpserver/jms_all:v3.10.3版本的镜像[root@ubuntu ~]# docker pull jumpserver/jms_all:v3.10.3 # 运行jumpserver容器# --name指定容器名# -p映射容器端口到宿主机端口# -e设置多个环境变量,关联MySQL、Redis等服务的配置# --privileged=true赋予容器特权模式# -v挂载多个目录,用于数据持久化# --network加入指定网络# --restart always异常退出自动重启[root@ubuntu ~]# docker run --name jms_all -d \\ -p 80:80 \\ -p 2222:2222 \\ -p 30000-30100:30000-30100 \\ -e SECRET_KEY=aRSvqx9Ln6Vi4tKRp6on7T7WS0XZlFPQCZzQmfL8xSYXsaQCHf \\ -e BOOTSTRAP_TOKEN=vsyLcLXhe85yXC0tD9EvROhAR6kHD7 \\ -e CORE_HOST=http://jms_all:8080 \\ -e LOG_LEVEL=ERROR \\ -e DB_HOST=mysql \\ -e DB_PORT=3306 \\ -e DB_USER=jumpserver \\ -e DB_PASSWORD=123456 \\ -e DB_NAME=jumpserver \\ -e REDIS_HOST=redis \\ -e REDIS_PORT=6379 \\ -e REDIS_PASSWORD=\'123456\' \\ --privileged=true \\ -v /opt/jumpserver/core/data:/opt/jumpserver/data \\ -v /opt/jumpserver/koko/data:/opt/koko/data \\ -v /opt/jumpserver/lion/data:/opt/lion/data \\ -v /opt/jumpserver/magnus/data:/opt/magnus/data \\ -v /opt/jumpserver/kael/data:/opt/kael/data \\ -v /opt/jumpserver/chen/data:/opt/chen/data \\ -v /opt/jumpserver/web/log:/var/log/nginx \\ --network jumpserver-net \\ --restart always \\ jumpserver/jms_all:v3.10.3 # ubuntu0上在线安装jumpserver# 使用curl下载并执行快速安装脚本,进行jumpserver的在线安装[root@ubuntu0 ~]# curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash# ubuntu1上dokcker compose安装jumpserver# 创建一个名为jumpserver的目录[root@ubuntu1 ~]# mkdir jumpserver# 进入刚创建的jumpserver目录[root@ubuntu1 jumpserver]# cd jumpserver # 使用vim编辑器打开当前目录下的docker-compose.yaml文件,准备编辑用于编排容器服务的配置内容[root@ubuntu1 jumpserver]# vim docker-compose.yaml# 声明使用的Docker Compose文件版本为3.8,不同版本语法和特性略有差异version: \'3.8\'services: mysql: image: mysql:8.0 container_name: jms_mysql restart: always environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-123456} MYSQL_DATABASE: ${DB_NAME:-jumpserver} healthcheck: test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\", \"-u\", \"root\", \"-p$$MYSQL_ROOT_PASSWORD\"] interval: 10s timeout: 5s retries: 3 start_period: 30s volumes: - ${VOLUME_DIR:-./data}/mysql/data:/var/lib/mysql networks: - net redis: image: redis:7.0 container_name: jms_redis restart: always command: redis-server --requirepass ${REDIS_PASSWORD:-123456} environment: REDIS_PASSWORD: ${REDIS_PASSWORD:-123456} healthcheck: test: [\"CMD\", \"redis-cli\", \"-a\", \"$$REDIS_PASSWORD\", \"ping\"] interval: 10s timeout: 5s retries: 3 start_period: 10s volumes: - ${VOLUME_DIR:-./data}/redis/data:/data networks: - net jumpserver: image: jumpserver/jms_all:v3.10.3 container_name: jms_all privileged: true restart: always environment: SECRET_KEY: ${SECRET_KEY:-SYmfImNk3TfMCmKmb7h3SYZjfTR6e2jVAjfLZxHAQqIxOdAWLv} BOOTSTRAP_TOKEN: ${BOOTSTRAP_TOKEN:-9Gd3SM0tR6gmbirptLYdkqXN82ZrQh} LOG_LEVEL: ${LOG_LEVEL:-ERROR} DB_HOST: mysql DB_PORT: 3306 DB_USER: root DB_PASSWORD: ${DB_PASSWORD:-123456} DB_NAME: ${DB_NAME:-jumpserver} REDIS_HOST: redis REDIS_PORT: 6379 REDIS_PASSWORD: ${REDIS_PASSWORD:-123456} DOMAINS: ${DOMAINS:-} ports: - \"${HTTP_PORT:-80}:80\" - \"${SSH_PORT:-2222}:2222\" depends_on: mysql: condition: service_healthy redis: condition: service_healthy healthcheck: test: [\"CMD\", \"curl\", \"-fsL\", \"http://localhost/api/health/\"] interval: 10s timeout: 5s retries: 3 start_period: 90s volumes: - ${VOLUME_DIR:-./data}/core/data:/opt/jumpserver/core/data - ${VOLUME_DIR:-./data}/koko/data:/opt/jumpserver/koko/data - ${VOLUME_DIR:-./data}/lion/data:/opt/jumpserver/lion/data - ${VOLUME_DIR:-./data}/chen/data:/opt/jumpserver/chen/data - ${VOLUME_DIR:-./data}/kael/data:/opt/jumpserver/kael/data - ${VOLUME_DIR:-./data}/nginx/logs:/var/log/nginx networks: - netnetworks: net: driver: bridgenetworks: # 定义名为net的网络,供上述服务使用,用于容器间通信 net:# 在ubuntu1系统的jumpserver目录下,执行这条命令# docker compose up 用于启动由当前目录下的docker-compose.yaml文件定义的所有服务# 它会读取该配置文件,拉取所需镜像(如果本地不存在),创建并启动相关容器,按照文件中定义的依赖关系、网络配置、环境变量等设定来运行整个服务栈# 各个容器之间的网络连接、端口映射、数据卷挂载等配置都会生效,让整个Jumpserver应用及其依赖的MySQL、Redis服务协同工作[root@ubuntu1 jumpserver]# docker compose up
二、JumpServer的使用

用户管理
管理用户:管理用户是资产被控服务器上的root用户,JumpServer使用此用户可以推送系统用户、获取资产硬件信息等。
系统用户:用于登录资产的用户。
普通用户:登录JumpServer的用户,如运维、开发等。可以创建用户组,将用户添加到用户组,便于管理。
资产管理
在JumpServer中添加各类资产,如服务器、网络设备、数据库应用等。
对资产进行分类和组织,便于后续授权和管理。
授权管理
以资产树方式授权资产,将不同的资产授权给不同的用户组或用户。
可以设置精细的权限控制,如只允许用户执行特定命令或访问特定文件。
日志审计
JumpServer会监控并记录用户的所有操作行为。
管理员可以查看用户的操作记录,进行审计和回放。
如发现不良或危险操作,可以及时中断并采取相应的安全措施。
会话管理
JumpServer支持在线会话功能,管理员可以查看当前正在进行的会话。
可以对会话进行中断、终止等操作,确保系统的安全性。
文件管理
JumpServer支持文件管理功能,用户可以将文件直接拖拽上传至服务器。
默认的存放位置可以在配置文件中进行修改。
危险命令限制
管理员可以设置危险命令列表,禁止用户执行这些命令。
如用户尝试执行危险命令,JumpServer会进行拦截并记录相关操作。

三、JumpServer实际操作

访问Web界面
地址: http://:
用户名: admin 密码: admin

1、创建用户

2、创建用户组并添加用户

 3、在控制台中账号管理的账号模版,点击创建,创建账号模版root-dev、root-tests、dev-devs、test-tests、wordpress-mysql

 4、在控制台中资产管理的资产列表对应的资产树Default,创建节点开发组和测试组。Default/开发组,点击添加资产到列表 ,创建资产-主机10.0.0.100和10.0.0.108。Default/测试组,点击添加资产到列表 ,创建资产-主机10.0.0.130和10.0.0.140。

5、在控制台中权限管理的资产授权,创建资产授权规则开发组授权和测试组授权、开发组授权MYSQL。在控制台中权限管理的命令过滤 ,创建命令组。基于命令组,在控制台中权限管理的命令过滤,创建命令过滤规则。