Linux云计算SRE-第十五周

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 参数

示例:

bash 复制代码
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y curl
CMD ["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 覆盖

示例:

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

示例:

bash 复制代码
LABEL maintainer="admin@example.com"
VOLUME ["/var/lib/mysql"]
USER nobody
HEALTHCHECK --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地址范围、网关等网络配置。

自定义网络可以提供更好的隔离和网络管理。

自定义网络实例:

bash 复制代码
# 创建自定义桥接网络
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私有仓库
bash 复制代码
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 docker

2、新版docker自带docker compose命令
[root@ubuntu22 ~]#docker compose  version
Docker 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]#ls
common.sh  harbor.v2.12.2.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare

4、编辑 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,建议配置IP
harbor_admin_password = 123456 #修改此行指定harbor登录用户admin的密码,默认用户/密码
:admin/Harbor12345
data_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
bash 复制代码
[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-stdin
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#查看进程是否添加上面设置
[root@ubuntu22 harbor]# ps aux|grep dockerd
4、给本地镜像打标签并上传到 Harbor
bash 复制代码
[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.11
The 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服务。

bash 复制代码
在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 sh
mysql -uroot -p123456
mysql>exit
 
# 进入Redis容器的交互式终端,设置Redis密码
[root@ubuntu ~]#docker exec -it redis sh
redis-cli
127.0.0.1:6379>CONFIG set requirepass  123456
127.0.0.1:6379>exit
# 验证Redis密码是否设置成功
redis-cli
127.0.0.1:6379>auth 123456
127.0.0.1:6379>exit
 
# 生成一个50位的随机字符串,用作SECRET_KEY
[root@ubuntu ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c50
aRSvqx9Ln6Vi4tKRp6on7T7WS0XZlFPQCZzQmfL8xSYXsaQCHf
# 生成一个30位的随机字符串,用作BOOTSTRAP_TOKEN
[root@ubuntu ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c30
vsyLcLXhe85yXC0tD9EvROhAR6kHD7
 
# 从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:
      - net

networks:
  net:
    driver: bridge

networks:
  # 定义名为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://<JumpServer服务器IP地址>:<服务运行端口>

用户名: 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。在控制台中权限管理的命令过滤 ,创建命令组。基于命令组,在控制台中权限管理的命令过滤,创建命令过滤规则。

相关推荐
AKAMAI13 小时前
跳过复杂环节:Akamai应用平台让Kubernetes生产就绪——现已正式发布
人工智能·云原生·云计算
天翼云开发者社区15 小时前
Rust 中的 Tokio 线程同步机制
云计算
天翼云开发者社区18 小时前
亮相2025年服贸会,天翼云打造高质量算力服务新生态!
云计算·天翼云
容器魔方3 天前
Bloomberg 正式加入 Karmada 用户组!
云原生·容器·云计算
AKAMAI3 天前
Sport Network 凭借 Akamai 实现卓越成就
人工智能·云原生·云计算
10岁的博客4 天前
《云计算如何驱动企业数字化转型:关键技术与实践案例》
云计算
m0_694845575 天前
教你使用服务器如何搭建数据库
linux·运维·服务器·数据库·云计算
shinelord明5 天前
【数据行业发展】可信数据空间~数据价值的新型基础设施
大数据·架构·云计算·创业创新
XINVRY-FPGA5 天前
XCKU15P-2FFVA1760I AMD 赛灵思 Xilinx Kintex UltraScale+ FPGA
arm开发·嵌入式硬件·阿里云·fpga开发·云计算·硬件工程·fpga
王道长服务器 | 亚马逊云5 天前
一个迁移案例:从传统 IDC 到 AWS 的真实对比
java·spring boot·git·云计算·github·dubbo·aws