最近一直在捣鼓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也在了解学习中,等了解差不多了。后面会专门开一篇博客来说明。从安装到使用,尽量从新手的角度来进行解说。
学吧,学无止境!随着互联网浪潮的到来,希望各位都能乘风破浪~书写自己的传奇!
他强任他强,清风拂山岗;他卷任他卷,读书破万卷