Linux云计算SRE-第十五周

发布于:2025-02-26 ⋅ 阅读:(14) ⋅ 点赞:(0)

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.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 覆盖

  示例:

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 定义容器健康检查 - 支持间隔、超时和重试参数

   示例:

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地址范围、网关等网络配置。
自定义网络可以提供更好的隔离和网络管理。
自定义网络实例:

# 创建自定义桥接网络
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 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
[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 
[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服务。

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


网站公告

今日签到

点亮在社区的每一天
去签到