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="[email protected]"
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。在控制台中权限管理的命令过滤 ,创建命令组。基于命令组,在控制台中权限管理的命令过滤,创建命令过滤规则。

相关推荐
你觉得2058 小时前
浙江大学朱霖潮研究员:《人工智能重塑科学与工程研究》以蛋白质结构预测为例|附PPT下载方法
大数据·人工智能·机器学习·ai·云计算·aigc·powerpoint
久违の欢喜8 小时前
《云端变革:云计算重塑现代企业架构的实践之路》
架构·云计算
Linux运维老纪8 小时前
运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)
linux·安全·centos·云计算·运维开发·火绒
yuzhangfeng17 小时前
【云计算物理网络】从传统网络到SDN:云计算的网络演进之路
网络·云计算
ZStack开发者社区20 小时前
全球化2.0 | ZStack举办香港Partner Day,推动AIOS智塔+DeepSeek海外实践
人工智能·云计算
久违の欢喜1 天前
《云计算:核心驱动力》
云计算
yuzhangfeng1 天前
【云计算物理网络】数据中心网络架构设计
网络·云计算
久违の欢喜1 天前
《云计算:一场静悄悄的革命》
云计算
聚搜云—服务器分享1 天前
阿里云国际站代理商:模型训练中断数据丢失怎么办?
阿里云·云计算