1.总结Dockerfile的指令和Docker的网络模式
一、Dockerfile 核心指令详解
1、基础构建指令
指令 |
功能描述 |
关键特性 |
---|---|---|
FROM |
指定基础镜像(必须为首条指令) |
- 支持多阶段构建: |
RUN |
在镜像构建时执行命令 |
- Shell格式: |
CMD |
容器启动时执行的默认命令(可被覆盖) |
- 仅最后一个生效 |
ENTRYPOINT |
容器启动时固定执行的命令(需用 |
- 与 |
示例:
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。在控制台中权限管理的命令过滤 ,创建命令组。基于命令组,在控制台中权限管理的命令过滤,创建命令过滤规则。