【docker综合篇】关于我用docker搭建了6个应用服务的事

news2024/11/13 11:21:23

最近一直在捣鼓docker,利用测试服务器,本着犯错就重来(重装系统)的大无畏精神,不断尝试,总结经验,然后在网上搜寻一些关于docker有关的服务镜像,并搭建起来。看着一个个服务在我的服务器跑起来,那种成功的喜悦真是一件值得让人高兴的事。总结一下,我成功运行的docker镜像服务觉得不错的有dnmp,kaillinux,Lsky Pro,shipyard,ollama,ward,vocechat,下面就跟随我一起来了解这些服务吧。

目录

1.前言温故知新 

2.docker镜像源

3.6大应用服务

3.1 DNMP集成web

3.2 Docker容器管理shipyard

3.3 Lsky Pro图床

3.4 服务器监控ward

3.5 聊天应用VoceChat

3.6 ollama大模型   

4.从零开始实操篇

 4.1 安装dnmp

4.2 大模型ollama

4.3 docker可视化shipyard

4.4 Ward、Lsky Pro、VoceChat

5.总结畅想


1.前言温故知新 

        关于docker,我接触的不多,从lz的历史博客中也能看出来,最初的接触也是因为搭建一个自己的php+nginx的web服务,所以,一切故事的开始就要从这个web服务dnmp说起了。

DNMP:基于docker搭建集成LNMP(nginx+mysql+php)-CSDN博客

玩转Docker:Lsky pro图床+私有化部署大模型(Ollama+Openwebui)-CSDN博客

        所谓的dnmp,就是docker+nginx+mysql+php的集成环境,前面两篇博客已经做了汇总了。并且为了方便,lz还做了一键集成脚本。 通过 bash dnmp.sh 运行脚本,这里是基于lz的服务器系统为Ubuntu 22.04.4。会在当前目录下生成一个dnmp目录(tips:记住这个dnmp目录,里面有一个配置文件很关键,后面会用到)

相当于安装了docker,docker-compose,git,并构建了对应的dnmp容器。

不出意外的话,当你访问 http://IP地址 就能看到提示dnmp安装成功的页面。

dnmp.sh

#!/bin/bash
#wget http://114.116.118.165/dnmp.sh && bash dnmp.sh
# 定义颜色代码
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # 无颜色
 
# 第一步:安装 Docker、Docker Compose 和 Git
function install_tools() {
    echo "开始安装 Docker、Docker Compose 和 Git..."
 
    # 更新软件包列表
    sudo apt update
 
    # 安装 Docker
    if ! sudo apt install -y docker.io; then
        echo -e "${RED}Docker 安装失败,请检查错误并重试。${NC}"
        exit 1
    fi
 
    # 安装 Docker Compose
    if ! curl -K -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose; then
        echo -e "${RED}Docker Compose 下载失败,请检查错误并重试。${NC}"
        exit 1
    fi
 
    if ! sudo chmod +x /usr/local/bin/docker-compose; then
        echo -e "${RED}Docker Compose 权限修改失败,请检查错误并重试。${NC}"
        exit 1
    fi
 
    # 安装 Git
    if ! sudo apt install -y git; then
        echo -e "${RED}Git 安装失败,请检查错误并重试。${NC}"
        exit 1
    fi
 
    echo -e "${GREEN}Docker、Docker Compose 和 Git 安装完成。${NC}"
}
 
# 第二步:通过 Git 克隆 DNMP 项目
function clone_dnmp() {
    echo "开始克隆 DNMP 项目..."
 
    if ! git clone https://gitee.com/yeszao/dnmp.git; then
        echo -e "${RED}Git 克隆失败,请检查错误并重试。${NC}"
        exit 1
    fi
 
    echo -e "${GREEN}DNMP 项目克隆成功。${NC}"
}
 
# 第三步:复制配置文件并进入项目目录
function setup_dnmp() {
    echo "开始设置 DNMP 项目..."
 
    dnmp_dir="dnmp"  # 假设 dnmp 目录相对于当前脚本的路径
 
    # 确保 dnmp 目录存在
    if [ ! -d "$dnmp_dir" ]; then
        echo "dnmp 目录不存在: $dnmp_dir"
        exit 1
    fi
 
    # 进入 dnmp 目录并执行命令
    (cd "$dnmp_dir" && {
        # 复制环境变量文件
        if ! cp env.sample .env; then
            echo -e "${RED}复制 env.sample 失败,请检查错误并重试。${NC}"
            exit 1
        fi
 
        # 复制 docker-compose 配置文件
        if ! cp docker-compose.sample.yml docker-compose.yml; then
            echo -e "${RED}复制 docker-compose.sample.yml 失败,请检查错误并重试。${NC}"
            exit 1
        fi
 
        # 启动 docker-compose
        if ! docker-compose up -d; then
            echo -e "${RED}docker-compose up 失败,请检查错误并重试。${NC}"
            exit 1
        fi
 
        echo -e "${GREEN}DNMP 项目设置完成,docker-compose 启动成功。${NC}"
    }) || {
        echo "在 dnmp 目录中执行命令失败"
        exit 1
    }
}
 
# 主函数,按顺序执行上述步骤
function main() {
    install_tools
    clone_dnmp
    setup_dnmp
    echo "所有操作已完成,DNMP集成环境搭建并启动成功!"
}
 
# 执行主函数
main

当然,什么事都不是一帆风顺的,在运行这个脚本命令的过程中,你可能会遇到问题:

这个脚本命令大概的运行流程就是:

安装docker——> 安装docker-compose——>安装git——>git克隆dnmp代码——>cd dnmp代码目录——>复制docker-compose文件——>开始docker-compose up构建并运行容器

        如果前面三步都进行不下去,可能是因为你的系统是centos的,命令不支持;ssl 握手失败;连接超时失败;谁知道呢!这里你就要想其他办法去安装了。

        如果前面三步顺利的情况下,你的服务器是国内的服务器,在进行docker-compse up时大概率可能会出现拉取镜像超时的问题。因为国内的docker很多被禁了,所以这里要找到能用的镜像源进行配置才行。

2.docker镜像源

        国内的很多大厂镜像源基本都无法访问了,有的就算能访问,但是镜像也不全,在进行docker pull时可能会出现镜像不存在的问题。

关于这个,大致有两种解决办法:

1.找对应服务器商提供的镜像加速地址

2.寻找第三方可用镜像源地址

再不行,就网上找吧,总有能用的。这里以lz的镜像源配置为例:

服务器版本配置:华为云 Ubuntu 22.04.4 LTS 2H4G 100GB (华为测试,一核更比六核强) 

vi /etc/docker/daemon.json

没有daemon.json文件,就手动创建 touch daemon.json

{
  "registry-mirrors": [
    "https://2cc2e98fbd5b4ca482a3faf3884425e2.mirror.swr.myhuaweicloud.com",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu"
  ]
}

然后使用 systemctl restart docker命令重启Docker即可。然后使用docker info命令查看镜像仓库信息,如果出现你所配置的源地址,就说明成功了。之后可以继续去执行脚本命令bash dnmp.sh去构建了。

        还有一个问题,就是在利用apt下载docke和git时,可能会很慢,这就是apt源的问题,也要进行更换。配置文件地址在:/etc/apt/sources.list

清华大学开源软件镜像站

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区

网易镜像开源Ubuntu镜像使用帮助

中科大开源镜像站

找到你服务器对应的版本,配置之后,执行apt update 更新下即可。

#更新本地包索引:
sudo apt update

#升级已安装的软件包:
sudo apt upgrade

清理本地存储的已删除软件包的存档:
sudo apt autoremove

清理下载的软件包缓存:
sudo apt clean

3.6大应用服务

        前面的DNMP服务已经讲了,接下来下面说一下lz为什么要选择这几个应用服务,明明有那么多镜像。lz选择这几个自然有他的道理。下面会大致介绍并给出应用服务展示效果。

3.1 DNMP集成web

        一个web站点离不开web服务器,更离不开数据库,再考虑到支持它的开发语言运行环境,还有ssl证书配置,Redis数据缓存等等各种服务,更遑论他们之间要产生关联的配置。试问让你一个个安装,你就不会出错吗?不会?那好,当我没说,你直接跳过看下一个吧。

        而DNMP一键集成Docker+php多版本控制+nginx+mysql多版本+ssl+Redis配置。我只能说很香

3.2 Docker容器管理shipyard

        shipyard是一个开源的docker管理平台,shipyard主要是把多个 Docker host上的 containers 统一管理(支持跨越多个host)意思就是可以做集群化管理,Shipyard是在Docker Swarm实现对容器、镜像、docker集群、仓库、节点进行管理的web系统。界面简洁友好,缺点是涉及的镜像服务有点多,不像其他的几个docker容器管理可视化,安装一个镜像就够了。

3.3 Lsky Pro图床

        Lsky Pro(也称:兰空图床),是一个基于PHP 8.0+和Laravel框架开发的云端相册程序。它允许用户上传、管理和分享图片,并提供了多种强大的功能。Lsky Pro支持多种第三方云储存服务,如AWS S3、阿里云OSS、腾讯云COS等,还提供了图片审核、水印、分享、商业化等多种功能。用户可以根据自己的需求选择开源版或付费版,享受简单且实用的图片管理体验。

 

3.4 服务器监控ward

        Ward是一个简单而优雅的解决方案,用于实时查看服务器的关键信息。它以适应性设计系统为特色,支持黑暗模式,让你的监控面板充满现代感。非常轻量,就一个web页面,能实时监控CPU,内存和存储使用状态。

3.5 聊天应用VoceChat

        VoceChat 是一款支持独立部署的个人云社交媒体聊天服务。15MB 的大小可部署在任何的服务器上,部署简单,很少需要维护。前端可以内嵌到自己的网站下,作为网页装饰提供客服咨询应用场景,数据完全由用户自己掌握,传输过程加密。支持创建聊天频道,添加好友私聊等功能。

3.6 ollama大模型   

        ollama是一款可以使用本地的大型语言模型。启动并运行大型语言模型。运行Llama 2、Code Llama和其他模型。自定义并创建您自己的模型,一般配合Openwebui可视化一起使用。支持多种模型库选择,包括并不局限以下几种:

(ollama run gemma)安装谷歌gemma大模型

 (ollama run llama2)安装Meta llama2大模型

  (ollama run qwen)安装阿里的qwen大模型

缺点是比较吃内存,要运行以上几种大模型,最好确保你本地服务器内存8G以上,当然,也可以选择小一点的模型,lz的服务器2G内存,运行的模型时ollama run qwen2:0.5b 就是感觉不太聪明的样子

4.从零开始实操篇

       这里从头到尾实操一下,lz买的是华为云的测试服务器:华为云 Ubuntu 22.04.4 LTS 2H4G 100GB。因为也只有这个配置才能带的动6个应用服务啊。当然,在座的各位按需安装即可。因为我是无脑一路安装,可能用的都是弱密码,应用服务太多等原因,导致被攻击了。索性只是测试服务器,lz直接重装系统即可。

        不过这也算是给我们提了个醒,不要忽视安全问题。在安装dnmp时,别忘了改数据库默认密码,另外git不用后就给卸载,lz看网上说也有因为这个没设置账号密码的问题。好了,题外话不多说,正好趁着重装系统,一切从零开始。

 4.1 安装dnmp

        我们一步步来。第一步,先安装dnmp,进入终端,直接运行dnmp.sh脚本输入:

# 因为lz把脚本放到了线上站点,所以可以直接拉取运行。也可以本地创建运行
wget http://114.116.118.165/dnmp.sh && bash dnmp.sh

进行到docker-compose up报错了,找不到镜像nginx,这个时候就是我前面说的要修改镜像源,当然也别忘了修改apt源。把这两个源都修改后,我们再执行一次脚本。

顺序为:先配置apt源-》执行脚本生成docker-》再配置docker镜像源-》再执行一次脚本

这里没有运行docker-compose up命令,说明docker-compose安装失败,我们手动安装下就行:

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose

然后,在进入dnmp目录,重新构建下容器:docker-compose up -d

最后,访问 http:服务器IP  能看到页面就说明搞定了,至此,开头最难的就搞定了。

后面的应用服务的安装都是基于docker、docker-compose 安装好的基础上~

4.2 大模型ollama

        这个没啥好说的,就两行命令。不过要记得量力而行啊。执行下面两行命令后,再安装模型就行了,具体的可以去看我前面的博客。

###docker下载ollama部署
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama --restart always ollama/ollama
 
##使用docker部署webUi页面,${inner_ip}替换为你的本地ip
docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=http://${inner_ip}:11434 -v open-webui:/app/backend/data --name open-webui --restart always ghcr.nju.edu.cn/open-webui/open-webui:main

4.3 docker可视化shipyard

        这个安装有点麻烦,因为涉及的镜像有点过。不过lz找到一篇脚本安装的教程。直接脚本安装就简单了。

进入dnmp目录下,创建脚本文件 shipyard.sh,然后执行 bash shipyard.sh 就行了

shipyard.sh

if [ "$1" != "" ] && [ "$1" = "-h" ]; then
    echo "Shipyard Deploy uses the following environment variables:"
    echo "  ACTION: this is the action to use (deploy, upgrade, node, remove)"
    echo "  DISCOVERY: discovery system used by Swarm (only if using 'node' action)"
    echo "  IMAGE: this overrides the default Shipyard image"
    echo "  PREFIX: prefix for container names"
    echo "  SHIPYARD_ARGS: these are passed to the Shipyard controller container as controller args"
    echo "  TLS_CERT_PATH: path to certs to enable TLS for Shipyard"
    echo "  PORT: specify the listen port for the controller (default: 8080)"
    echo "  IP: specify the address at which the controller or node will be available (default: eth0 ip)"
    echo "  PROXY_PORT: port to run docker proxy (default: 2375)"
    exit 1
fi
 
if [ -z "`which docker`" ]; then
    echo "You must have the Docker CLI installed on your \$PATH"
    echo "  See http://docs.docker.com for details"
    exit 1
fi
 
ACTION=${ACTION:-deploy}
IMAGE=${IMAGE:-dockerclub/shipyard:latest}
PREFIX=${PREFIX:-shipyard}
SHIPYARD_ARGS=${SHIPYARD_ARGS:-""}
TLS_CERT_PATH=${TLS_CERT_PATH:-}
CERT_PATH="/etc/shipyard"
PROXY_PORT=${PROXY_PORT:-2376}
SWARM_PORT=3375
SHIPYARD_PROTOCOL=http
SHIPYARD_PORT=${PORT:-8080}
SHIPYARD_IP=${IP}
DISCOVERY_BACKEND=etcd
DISCOVERY_PORT=4001
DISCOVERY_PEER_PORT=7001
ENABLE_TLS=0
CERT_FINGERPRINT=""
LOCAL_CA_CERT=""
LOCAL_SSL_CERT=""
LOCAL_SSL_KEY=""
LOCAL_SSL_CLIENT_CERT=""
LOCAL_SSL_CLIENT_KEY=""
SSL_CA_CERT=""
SSL_CERT=""
SSL_KEY=""
SSL_CLIENT_CERT=""
SSL_CLIENT_KEY=""
 
show_cert_help() {
    echo "To use TLS in Shipyard, you must have existing certificates."
    echo "The certs must be named ca.pem, server.pem, server-key.pem, cert.pem and key.pem"
    echo "If you need to generate certificates, see https://github.com/ehazlett/certm for examples."
}
 
check_certs() {
    if [ -z "$TLS_CERT_PATH" ]; then
        return
    fi
 
    if [ ! -e $TLS_CERT_PATH ]; then
        echo "Error: unable to find certificates in $TLS_CERT_PATH"
        show_cert_help
        exit 1
    fi
 
    if [ "$PROXY_PORT" = "2375" ]; then
        PROXY_PORT=2376
    fi
    SWARM_PORT=3376
    SHIPYARD_PROTOCOL=https
    LOCAL_SSL_CA_CERT="$TLS_CERT_PATH/ca.pem"
    LOCAL_SSL_CERT="$TLS_CERT_PATH/server.pem"
    LOCAL_SSL_KEY="$TLS_CERT_PATH/server-key.pem"
    LOCAL_SSL_CLIENT_CERT="$TLS_CERT_PATH/cert.pem"
    LOCAL_SSL_CLIENT_KEY="$TLS_CERT_PATH/key.pem"
    SSL_CA_CERT="$CERT_PATH/ca.pem"
    SSL_CERT="$CERT_PATH/server.pem"
    SSL_KEY="$CERT_PATH/server-key.pem"
    SSL_CLIENT_CERT="$CERT_PATH/cert.pem"
    SSL_CLIENT_KEY="$CERT_PATH/key.pem"
    CERT_FINGERPRINT=$(openssl x509 -noout -in $LOCAL_SSL_CERT -fingerprint -sha256 | awk -F= '{print $2;}')
 
    if [ ! -e $LOCAL_SSL_CA_CERT ] || [ ! -e $LOCAL_SSL_CERT ] || [ ! -e $LOCAL_SSL_KEY ] || [ ! -e $LOCAL_SSL_CLIENT_CERT ] || [ ! -e $LOCAL_SSL_CLIENT_KEY ]; then
        echo "Error: unable to find certificates"
        show_cert_help
        exit 1
    fi
 
    ENABLE_TLS=1
}
 
# container functions
start_certs() {
    ID=$(docker run \
        -ti \
        -d \
        --restart=always \
        --name $PREFIX-certs \
        -v $CERT_PATH \
        alpine \
        sh)
    if [ $ENABLE_TLS = 1 ]; then
        docker cp $LOCAL_SSL_CA_CERT $PREFIX-certs:$SSL_CA_CERT
        docker cp $LOCAL_SSL_CERT $PREFIX-certs:$SSL_CERT
        docker cp $LOCAL_SSL_KEY $PREFIX-certs:$SSL_KEY
        docker cp $LOCAL_SSL_CLIENT_CERT $PREFIX-certs:$SSL_CLIENT_CERT
        docker cp $LOCAL_SSL_CLIENT_KEY $PREFIX-certs:$SSL_CLIENT_KEY
    fi
}
 
remove_certs() {
    docker rm -fv $PREFIX-certs > /dev/null 2>&1
}
 
get_ip() {
    if [ -z "$SHIPYARD_IP" ]; then
        SHIPYARD_IP=`docker run --rm --net=host alpine ip route get 8.8.8.8 | awk '{ print $7;  }'`
    fi
}
 
start_discovery() {
    get_ip
 
    ID=$(docker run \
        -ti \
        -d \
        -p 4001:4001 \
        -p 7001:7001 \
        --restart=always \
        --name $PREFIX-discovery \
        microbox/etcd:latest -addr $SHIPYARD_IP:$DISCOVERY_PORT -peer-addr $SHIPYARD_IP:$DISCOVERY_PEER_PORT)
}
 
remove_discovery() {
    docker rm -fv $PREFIX-discovery > /dev/null 2>&1
}
 
start_rethinkdb() {
    ID=$(docker run \
        -ti \
        -d \
        --restart=always \
        --name $PREFIX-rethinkdb \
        rethinkdb)
}
 
remove_rethinkdb() {
    docker rm -fv $PREFIX-rethinkdb > /dev/null 2>&1
}
 
start_proxy() {
    TLS_OPTS=""
    if [ $ENABLE_TLS = 1 ]; then
        TLS_OPTS="-e SSL_CA=$SSL_CA_CERT -e SSL_CERT=$SSL_CERT -e SSL_KEY=$SSL_KEY -e SSL_SKIP_VERIFY=1"
    fi
    # Note: we add SSL_SKIP_VERIFY=1 to skip verification of the client
    # certificate in the proxy image.  this will pass it to swarm that
    # does verify.  this helps with performance and avoids certificate issues
    # when running through the proxy.  ultimately if the cert is invalid
    # swarm will fail to return.
    ID=$(docker run \
        -ti \
        -d \
        -p $PROXY_PORT:$PROXY_PORT \
        --hostname=$HOSTNAME \
        --restart=always \
        --name $PREFIX-proxy \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -e PORT=$PROXY_PORT \
        --volumes-from=$PREFIX-certs $TLS_OPTS\
        shipyard/docker-proxy:latest)
}
 
remove_proxy() {
    docker rm -fv $PREFIX-proxy > /dev/null 2>&1
}
 
start_swarm_manager() {
    get_ip
 
    TLS_OPTS=""
    if [ $ENABLE_TLS = 1 ]; then
        TLS_OPTS="--tlsverify --tlscacert=$SSL_CA_CERT --tlscert=$SSL_CERT --tlskey=$SSL_KEY"
    fi
 
    EXTRA_RUN_OPTS=""
 
    if [ -z "$DISCOVERY" ]; then
        DISCOVERY="$DISCOVERY_BACKEND://discovery:$DISCOVERY_PORT"
        EXTRA_RUN_OPTS="--link $PREFIX-discovery:discovery"
    fi
    ID=$(docker run \
        -ti \
        -d \
        --restart=always \
        --name $PREFIX-swarm-manager \
        --volumes-from=$PREFIX-certs $EXTRA_RUN_OPTS \
        swarm:latest \
        m --replication --addr $SHIPYARD_IP:$SWARM_PORT --host tcp://0.0.0.0:$SWARM_PORT $TLS_OPTS $DISCOVERY)
}
 
remove_swarm_manager() {
    docker rm -fv $PREFIX-swarm-manager > /dev/null 2>&1
}
 
start_swarm_agent() {
    get_ip
 
    if [ -z "$DISCOVERY" ]; then
        DISCOVERY="$DISCOVERY_BACKEND://discovery:$DISCOVERY_PORT"
        EXTRA_RUN_OPTS="--link $PREFIX-discovery:discovery"
    fi
    ID=$(docker run \
        -ti \
        -d \
        --restart=always \
        --name $PREFIX-swarm-agent $EXTRA_RUN_OPTS \
        swarm:latest \
        j --addr $SHIPYARD_IP:$PROXY_PORT $DISCOVERY)
}
 
remove_swarm_agent() {
    docker rm -fv $PREFIX-swarm-agent > /dev/null 2>&1
}
 
start_controller() {
    #-v $CERT_PATH:/etc/docker:ro \
    TLS_OPTS=""
    if [ $ENABLE_TLS = 1 ]; then
        TLS_OPTS="--tls-ca-cert $SSL_CA_CERT --tls-cert=$SSL_CERT --tls-key=$SSL_KEY --shipyard-tls-ca-cert=$SSL_CA_CERT --shipyard-tls-cert=$SSL_CERT --shipyard-tls-key=$SSL_KEY"
    fi
 
    ID=$(docker run \
        -ti \
        -d \
        --restart=always \
        --name $PREFIX-controller \
        --link $PREFIX-rethinkdb:rethinkdb \
        --link $PREFIX-swarm-manager:swarm \
        -p $SHIPYARD_PORT:$SHIPYARD_PORT \
        --volumes-from=$PREFIX-certs \
        $IMAGE \
        --debug \
        server \
        --listen :$SHIPYARD_PORT \
        -d tcp://swarm:$SWARM_PORT $TLS_OPTS $SHIPYARD_ARGS)
}
 
wait_for_available() {
    set +e 
    IP=$1
    PORT=$2
    echo Waiting for Shipyard on $IP:$PORT
 
    docker pull ehazlett/curl > /dev/null 2>&1
 
    TLS_OPTS=""
    if [ $ENABLE_TLS = 1 ]; then
        TLS_OPTS="-k"
    fi
 
    until $(docker run --rm ehazlett/curl --output /dev/null --connect-timeout 1 --silent --head --fail $TLS_OPTS $SHIPYARD_PROTOCOL://$IP:$PORT/ > /dev/null 2>&1); do
        printf '.'
        sleep 1 
    done
    printf '\n'
}
 
remove_controller() {
    docker rm -fv $PREFIX-controller > /dev/null 2>&1
}
 
if [ "$ACTION" = "deploy" ]; then
    set -e
 
    check_certs
 
    get_ip 
 
    echo "Deploying Shipyard"
    echo " -> Starting Database"
    start_rethinkdb
    echo " -> Starting Discovery"
    start_discovery
    echo " -> Starting Cert Volume"
    start_certs
    echo " -> Starting Proxy"
    start_proxy
    echo " -> Starting Swarm Manager"
    start_swarm_manager
    echo " -> Starting Swarm Agent"
    start_swarm_agent
    echo " -> Starting Controller"
    start_controller
 
    wait_for_available $SHIPYARD_IP $SHIPYARD_PORT
 
    echo "Shipyard available at $SHIPYARD_PROTOCOL://$SHIPYARD_IP:$SHIPYARD_PORT"
    if [ $ENABLE_TLS = 1 ] && [ ! -z "$CERT_FINGERPRINT" ]; then
        echo "SSL SHA-256 Fingerprint: $CERT_FINGERPRINT"
    fi
    echo "Username: admin Password: shipyard"
 
elif [ "$ACTION" = "node" ]; then
    set -e
 
    if [ -z "$DISCOVERY" ]; then
        echo "You must set the DISCOVERY environment variable"
        echo "with the discovery system used with Swarm"
        exit 1
    fi
 
    check_certs
 
    echo "Adding Node"
    echo " -> Starting Cert Volume"
    start_certs
    echo " -> Starting Proxy"
    start_proxy
    echo " -> Starting Swarm Manager"
    start_swarm_manager $DISCOVERY
    echo " -> Starting Swarm Agent"
    start_swarm_agent
 
    echo "Node added to Swarm: $SHIPYARD_IP"
    
elif [ "$ACTION" = "upgrade" ]; then
    set -e
 
    check_certs
 
    get_ip
 
    echo "Upgrading Shipyard"
    echo " -> Pulling $IMAGE"
    docker pull $IMAGE
 
    echo " -> Upgrading Controller"
    remove_controller
    start_controller
 
    wait_for_available $SHIPYARD_IP $SHIPYARD_PORT
 
    echo "Shipyard controller updated"
 
elif [ "$ACTION" = "remove" ]; then
    # ignore errors
    set +e
 
    echo "Removing Shipyard"
    echo " -> Removing Database"
    remove_rethinkdb
    echo " -> Removing Discovery"
    remove_discovery
    echo " -> Removing Cert Volume"
    remove_certs
    echo " -> Removing Proxy"
    remove_proxy
    echo " -> Removing Swarm Agent"
    remove_swarm_agent
    echo " -> Removing Swarm Manager"
    remove_swarm_manager
    echo " -> Removing Controller"
    remove_controller
 
    echo "Done"
else
    echo "Unknown action $ACTION"
    exit 1
fi

 

安装完成后,访问:http:服务器ip:8080    默认账号密码:admin/shipyard (控制台可修改)

[root@docker]-[~/docker-ui]-#docker ps
CONTAINER ID   IMAGE                                      COMMAND                  CREATED             STATUS             PORTS                                                                                  NAMES
2308552f63a9   dockerclub/shipyard:latest                 "/bin/controller --d…"   About an hour ago   Up About an hour   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                              shipyard-controller
1676327a4e5a   swarm:latest                               "/swarm j --addr 10.…"   About an hour ago   Up About an hour   2375/tcp                                                                               shipyard-swarm-agent
2f368d9f81df   swarm:latest                               "/swarm m --replicat…"   About an hour ago   Up About an hour   2375/tcp                                                                               shipyard-swarm-manager
c38108f757c5   shipyard/docker-proxy:latest               "/usr/local/bin/run"     About an hour ago   Up About an hour   2375/tcp, 0.0.0.0:2376->2376/tcp, :::2376->2376/tcp                                    shipyard-proxy
e610645dfe8e   alpine                                     "sh"                     About an hour ago   Up About an hour                                                                                          shipyard-certs
c444c7df39f4   microbox/etcd:latest                       "/bin/etcd -addr 10.…"   About an hour ago   Up About an hour   0.0.0.0:4001->4001/tcp, :::4001->4001/tcp, 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp   shipyard-discovery
307b4cec4659   rethinkdb                                  "rethinkdb --bind all"   About an hour ago   Up About an hour   8080/tcp, 28015/tcp, 29015/tcp                                                         shipyard-rethinkdb
 
----------------------------------------------------------------------------------------
1)RethinkDB
deploy首先启动的就是RethinkDB容器,shipyard采用RethinkDB作为数据库来保存用户等信息
2)Discovery
为了使用Swarm,我们需要一个外部的密钥值存储群容器,shipyard默认是采用了etcd。
3)shipyard_certs
证书管理容器,实现证书验证功能
4)Proxy
默认情况下,Docker引擎只监听Socket,我们可以重新配置引擎使用TLS或者使用一个代理容器,转发请求从TCP到Docker监听的UNIX Socket。
5)Swarm Manager
Swarm管理器
6)Swarm Agent
Swarm代理,运行在每个节点上。
7)Controller
shipyard控制器,Remote API的实现和web的实现。

4.4 Ward、Lsky Pro、VoceChat

        这三个的安装更简单了,因为都是单个镜像的应用服务,所以直接走docker-compose.yml配置项就好,再通过docker-compose up一次性构建就行。为了不影响之前的dnmp配置。这里我们构建时采用别名的方式。

进入dnmp目录,创建一个tools.yml配置文件,输入执行命令:

docker-compose -f tools.yml up

 

tools.yml


#vocechat:多人聊天,端口3019
#lsky-pro:兰空图床,端口7791
#ward:服务器监控工具,端口4000

version: '3.3'
services:
    run:
        restart: unless-stopped
        container_name: ward
        ports:
            - '4000:4000'
        environment:
            - WARD_PORT=4000
            - WARD_THEME=dark
            - WARD_NAME=leons-server
        privileged: true
        image: antonyleons/ward

    vocechat:
        restart: always
        ports:
            - '3019:3000'  # 冒号左边可以改成自己服务器未被占用的端口
        container_name: vocechat-server
        volumes:
            - './data:/home/vocechat-server/data' # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
        image: privoce/vocechat-server:latest
    
    lsky-pro:
        container_name: lsky-pro
        image: dko0/lsky-pro
        restart: always
        volumes:
            - ./data/html:/var/www/html  #映射到本地
        ports:
            - 7791:80
        environment:
            - MYSQL_HOST=mysql
            - MYSQL_DATABASE=lsky-pro
            - MYSQL_USER=lsky-pro
            - MYSQL_PASSWORD=lsky-pro
            
    

5.总结畅想

        细心的人可能发现了,文章开头说的kaillinux这里没有提及。倒不是说lz没有搭建。只不过kaillinux作为专用渗透,正经开发过程中基本也不咋会用到。而且kaillinux可用的工具包,如nmap,sqlmap,hydra等等,这些一时半会也是说不完的。另外lz也在了解学习中,等了解差不多了。后面会专门开一篇博客来说明。从安装到使用,尽量从新手的角度来进行解说。

        学吧,学无止境!随着互联网浪潮的到来,希望各位都能乘风破浪~书写自己的传奇!

        他强任他强,清风拂山岗;他卷任他卷,读书破万卷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QT】基于UDP/TCP/串口 的Ymodom通讯协议客户端

【QT】基于UDP/TCP/串口的Ymodom通讯协议客户端 前言Ymodom实现QT实现开源库的二次开发-1开源库的二次开发-2 串口方式实现TCP方式实现UDP方式实现补充:文件读取补充:QT 封装成EXE 前言 Qt 运行环境 Desktop_Qt_5_11_2_MSVC2015_64bit ,基于…

PowerShell自动化Windows系统管理任务

​ 大家好,我是程序员小羊! 前言 Windows系统管理涉及许多繁琐的任务,如用户管理、文件操作、系统更新、网络配置等。PowerShell作为Windows的命令行工具和脚本语言,可以极大地简化这些管理任务。本文将探讨如何使用PowerShell自动…

【教学类-75-01】20240817“通义万相图片最大化+透明png”的修图流程

背景需求: 打印了袜子配对的PDF模版,做预测试 【教学类-74-02】彩色袜子配对02--左右配对-CSDN博客文章浏览阅读497次,点赞10次,收藏9次。【教学类-74-02】彩色袜子配对02--左右配对https://blog.csdn.net/reasonsummer/article…

09:链表的介绍

链表 1、算法的定义2、链表 1、算法的定义 通俗的定义:解题的方法与步骤。       狭义的定义:对存储的数据的操作。       广义的定义:无论数据是如何存储的,对数据从操作都是一样的。 到目前为止我们可以通过2种结构来存储…

关于订单最终一致性解决方案

背景 整体的交易架构主要由两部分组成:C端交易平台 - B端交易平台 由于组织架构的特殊性,并没有采用两阶段提交、三阶段提交这种刚性分布式事务的方案。 主要采用了基于TCC思想的TOC柔性事务补偿方案。 柔性事务:遵循BASE原则,…

Redis7.x安装系列教程(四)集群部署原理详解

1、什么是集群部署 Redis集群(cluster)是Redis的一种分布式运行模式,通过分片(sharding)提供数据的自动分区和管理,实现数据的高可用性和可扩展性。 在集群模式下,数据分布在多个Redis节点上,节点分为主节点和从节点。主节点负责…

Pytorch如何判断两个模型的权重是否相同(比较权重差异/参数字典)

参考资料: GPT-4o mini的回答 第一种方法是使用md5sum这个命令(Linux上),但是由于环境的不同,哪怕是load之后转存似乎都会有差,所以效果不大。 第二种方法是使用代码比较,这段代码是我找GPT要的,感觉非常不…

Linux线程间通信学习记录(线程同步)

0.线程间通信的方法 (1).全局变量(要结合同步机制) (2).信号量 (3).P操作 (4).V操作 一.线程同步 同步:指的是多个任务按照约定的先后次序相互…

OpenCV图像滤波(19)计算图像每个像素点的邻域内的平方和函数sqrBoxFilter()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算覆盖在滤波器上的像素值的平方和。 对于源图像中的每一个像素 (x, y),函数计算那些与放置在像素 (x, y) 上的滤波器重叠的邻域像…

【百度】25届秋招内推码

内推码 IV1RBB 介绍 📣 百度TPG技术中台事业群组—深度学习技术平台部 25届校招正在进行中,可通过定向内推形式get校招绿色通道 ! 欢迎联系我定向内推 🌟【部门介绍】 飞桨(PaddlePaddle)以百度多年的深度…

坐牢第二十七天(聊天室)

基于UDP的网络聊天室 一.项目需求: 1.如果有用户登录,其他用户可以收到这个人的登录信息 2.如果有人发送信息,其他用户可以收到这个人的群聊信息 3.如果有人下线,其他用户可以收到这个人的下线信息 4.服务器可以发送系统信息…

idea 遇到依赖引入失败问题

在引入 aspects 的相关依赖时&#xff0c;没有找到这个版本 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.0.0-M2</version> </dependency> 第一次尝试&#xff…

C++编程:生产者-消费者模型中条件变量的使用问题及优化方案

文章目录 0. 引言1. 生产者-消费者模型简介1.1 示例代码1.2 为什么必须加锁&#xff1f; 2. 上述代码存在的问题2.1 信号丢失2.2 锁的作用范围2.3 竞态条件 3. 优化方案3.1 使用两个条件变量3.2 扩展锁的作用域3.3 使用原子操作3.4 使用无锁队列 4. 底层实现与深入探讨5. 流程图…

『 C++ 』IO流

文章目录 IO流概述iostream 的标准对象C流和C标准库I/O函数的同步 sync_with_stdiofstream 文件流文件流的打开标志二进制读写二进制读写的浅拷贝问题文本读写 字符串流注意 IO流概述 流是指数据的有序传输序列,路表示数据从一个地方流向另一个地方的过程,流可以是输入流也可以…

欧盟新规:苹果App Store开发者需公开联系方式,透明度提升还是隐私挑战?

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 随着数字经济的蓬勃发展&#xff0c;欧盟对数字服务的监管也在不断加强。最近&#xff0c;苹果公司宣布了一项针对欧盟App Store的新政策&#…

Lesson 67 The weekend

Lesson 67 The weekend 词汇 greengrocer 菜市场 构成&#xff1a;green n. 绿色的    grocer n. 食杂店&#xff0c;小卖店 商店词汇&#xff1a;shop n. 商店      store n. 小店      market n. 市场      super market 超市      Sunday market 二…

Codeforces Round 949 (Div. 2) C.D构造和E题

C题链接 D题链接 E题链接 C题思路&#xff1a; 我们设相邻的两个-1的位置是的值是l和r&#xff0c;他们直接的距离是d(也就是r的下标减l的下标)。 思路1&#xff1a;直接模拟操作&#xff0c;看所有操作里是否有合法操作。 比如1 -1 -1 -1 -1 -1 7. 容易想到1*213,3*217&a…

psychopy 中文语义相关判断任务实验设计

参考文献&#xff1a; [石如彬, 谢久书, 杨梦情, & 王瑞明. (2022). 语言和情境对具体概念感知运动仿真的影响. 心理学报, 54(6), 583–594. https://doi.org/10.3724/SP.J.1041.2022.00583] 2.2.4实验1。 演示效果 按下“上方向键” 按F或J 反馈信息&#xff1a; 实验步骤…

C#中的S7协议

S7协议-S7COMM S7COMM 进行写 CTOP->PDU type已知枚举值 0X0E连接请求0x0d连接确认0x08断开请求0x0c断开确认0x05拒绝访问0x01加急数据0x02加急数据确认0x04用户数据0x07TPDU错误0x0f数据传输 S7Header->ROSCTR已知枚举值 0X01JOB REQUEST。主站发送请求0x02Ack。从站…

jmeter压测websocket

1、jmeter安装websocket插件 下载地址 pjtr / JMeter WebSocket Samplers / Downloads — Bitbucket 下载之后&#xff0c;放到lib/ext文件夹下&#xff0c;重启jmeter即可&#xff0c;看到下图这些证明插件安装成功 2、脚本 新建websocket request-response sampler