• 搜索
  • 夜间模式
    ©2026  依刻学习 Theme by OneBlog

    依刻学习博客

    搜索
    标签
  • 首页>
  • 学习的一天>
  • 正文
  • 基于dockerfile+脚本一键启动kodcloud

    2025年02月06日 8 阅读 0 评论 10548 字

    前言

    最近深度复习了了脚本,mysql,redis,nginx,docker相关内容,决定今天使用dockerfile搭建我之前直接在主机上搭建的kodcloud服务
    参考内容
    Docker环境可道云网盘的安装示例

    如果是小白只要服务,请下载压缩包,解压,运行START脚本(注意安装环境)
    kodcloud整合包下载
    该整合包已经配置好了目录结构,傻瓜操作,一键启动(自定义域名+自定义存储路径)

    环境

    可道云部署要求如下

    1. 主机环境需要部署
      需要安装php7.3+nginx+mysql5.7+redis+kodcloud
    2. 容器环境需要部署
      安装nginx+mysql5.7+redis+kodcloud(kodcloud容器自带php)

    要求

    kodcloud容器部署需要4个dockerfile,分别启动nginx,mysql,redis,kodcloud

    • 为了防止IP变动,使用网桥网络连接4个容器
    • nginx一般情况下需要挂载`/usr/share/nginx/html,/etc/nginx/conf.d,/etc/nginx/nginx.conf,/var/log/nginx
      本次/etc/nginx/nginx.conf使用COPY传入,/var/log/nginx挂载数据卷,其他挂载宿主机路径
    • redis一般情况下需要挂载redis.conf,/data
      本次redis.conf使用COPY传入,其他宿主机挂载
    • kodcloud一般情况下需要挂载/var/www/html
      本次使用宿主机路径挂载
    • mysql一般情况下需要挂载/var/lib/mysql,/logs,/etc/mysql/conf.d/my.cnf
      本次/etc/mysql/conf.d/my.cnf使用COPY传入,其他使用数据卷挂载

    注意:本次直接使用匿名卷,所以并不会显式的创建数据卷

    基于以上需求,综合如下

    • 需求环境

      网桥网络kodnet

    • 需求文件

      需要主机存储路径/app/docker/kodcloud,并且分别为4个容器创建各种的空目录以备挂载
      为redis准备redis.conf
      为mysql准备my.cnf
      为nginx准备nginx.conf,conf.d/kod.wym.com(kodcloud的server)

    • 其他

      为每个容器准备单独的启动脚本DR+dockerfile(本文主要介绍这种启动方式)
      准备总启动脚本START(这个脚本不介绍,在最后提供地址)

    • 注意事项

      先配置好docker与加速镜像
      存储路径需要为空,脚本会清空存储路径防止你重复执行安装出现数据问题

    路径/app/docker/kodcloud总结

    实现

    1.创建网桥网络

     docker network create kodnet
    

    2.创建主机存储路径

    mkdir -p /app/docker/kodcloud
    cd /app/docker/kodcloud
    mkdir redis mysql kod nginx
    mkdir ./redis/data ./nginx/conf.d ./nginx/html ./mysq/logs ./mysql/mysql  ./kod/html

    3.redis部署(存放在/app/docker/kodcloud/redis)

    • dockerfile(redis)
    #kod-redis
    FROM redis:alpine
    MAINTAINER wym
    ENV TZ=Asia/Shanghai
    EXPOSE 6379
    VOLUME /data
    COPY  redis.conf /etc/redis/redis.conf
    RUN mkdir /var/log/redis
    #给目录授权,不然redis进不去
    RUN chmod o+x /var/log/redis
    RUN touch /var/log/redis/redis.log    
    #给log文件授权,redis才能读写
    RUN chmod o+rw /var/log/redis/redis.log    
    #pid文件redis会自动创建
    CMD [ "redis-server", etc/redis/redis.conf" ]   
    
    • DR(redis)
    #!/bin/sh
    #author wym
    docker stop kod-redis
    docker rm kod-redis
    docker rmi wym/redis:kod
    docker build -t wym/redis:kod .
    docker run -d -it \
    --name kod-redis \
    --network kodnet  \
    -v /app/docker/kodcloud/redis/data:/data \
    wym/redis:kod
    docker logs kod-redis
    • redis.conf(redis)
    #kod-redis::redis.conf
    bind 0.0.0.0
    protected-mode no
    appendonly yes
    port 6379
    daemonize no
    logfile "/var/log/redis/redis.log"
    pidfile /var/run/redis.pid
    dir ./
    

    4.mysql部署(存放在/app/docker/kodcloud/mysql)

    • dockerfile(mysql)
    #kod-mysql
    FROM  mysql:5.7
    MAINTAINER wym
    #需要docker run传入MYSQL_R_P
    ARG MYSQL_R_P        
    #root登录密码
    ENV MYSQL_ROOT_PASSWORD=${MYSQL_R_P}
    #数据库名(不能改)
    ENV MYSQL_DATABASE=kodbox            
    #数据库用户(不能改)
    ENV MYSQL_USER=kodbox                
    #数据库用户密码
    ENV MYSQL_PASSWORD=kod123            
    EXPOSE 3306
    VOLUME /var/lib/mysql
    VOLUME /logs
    COPY my.cnf /etc/mysql/conf.d/my.cnf
    #COPY init.sh /docker-entrypoint-initdb.d/init.sh 
    #如果需要改变<数据库名>,<数据库用户>而不向重构镜像,可以传入脚本进行修改
    • DR(mysql)
    #!/bin/sh
    #author wym
    docker stop kod-mysql
    docker rm kod-mysql
    docker rmi wym/kod-mysql
    docker build -t  wym/mysql:kod  --build-arg MYSQL_R_P=MyStr0ngP@ssw0rd! .
    #--build-arg需要在构建时进行设置
    docker run -d -it \
    --name kod-mysql \
    -v /app/docker/kodcloud/mysql/mysql:/var/lib/mysql  \
    -v /app/docker/kodcloud/mysql/logs:/logs \
    --network kodnet \
    wym/mysql:kod
    
    • my.cnf(mysql)
    #kod-mysql::my.cnf
    [client]
    port = 3306
    default_character_set = utf8
    [mysqld]
    port = 3306
    max_connections = 200
    default_storage_engine = InnoDB
    [mysqld_safe]
    open_files_limit = 8192
    log-error = error.log

    5.kodcloud部署(存放在/app/docker/kodcloud/kod)

    • dockerfiel(kodcloud)
    #kodcloud,自带php
    FROM  kodcloud/kodbox
    MAINTAINER wym
    ENV TZ=Asia/Shanghai
    #指定mysql位置(容器名)
    ENV MYSQL_HOST=kod-mysql        
    #指定redis位置(容器名)
    ENV REDIS_HOST=kod-redis        
    EXPOSE 80
    #kodcloud站点路径
    VOLUME /var/www/html    
    • DR(kodcloud)
    #!/bin/sh
    #author wym
    docker stop kod
    docker rm kod
    docker build -t wym/kodcloud:kod .
    docker run -d -it \
    --name kod \
    --network kodnet \
    -v /app/docker/kodcloud/kod/html:/var/www/html \
    wym/kodcloud:kod
    

    6.nginx部署(存放在/app/docker/kodcloud/nginx)

    • dockerfile(nginx)
    #kod-nginx
    FROM nginx:alpine
    MAINTAINER wym
    WORKDIR /usr/share/nginx/html
    EXPOSE 80
    VOLUME  /var/log/nginx
    COPY nginx.conf /etc/nginx/nginx.conf
    • DR(nginx)
    #!/bin/sh
    #author wym
    docker stop kod-nginx
    docker rm kod-nginx
    docker rmi wym/nginx:kod
    docker build -t  wym/nginx:kod .
    docker run -d -it \
    -p 888:80 \
    --name kod-nginx \
    -v /app/docker/kodcloud/nginx/conf.d:/etc/nginx/conf.d \
    -v /app/docker/kodcloud/nginx/html:/usr/share/nginx/html \
    --network kodnet \
    wym/nginx:kod
    • conf.d/kod.wym.com(nginx的server)
    #kod-nginx::conf.d/kod.wym.com
    server {
        listen 80;
        server_name kod.wym.com;
    
        location / {
            #转发到kod容器的80端口
            proxy_pass http://kod:80;     
            #必须指定,默认只能上传1M以内的数据
            client_max_body_size 300M;    
            proxy_set_header Host $http_host;
            proxy_http_version 1.1;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_cache_valid 200 304 240h;
            proxy_cache_valid any 10m;
            add_header Nginx-Cache "$upstream_cache_status";
        }
    }
    
    • nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  logs/access.log  main;
        sendfile        on;
        keepalive_timeout  65;
        gzip  on;
        include /etc/nginx/conf.d/*; 
        server {
            listen       80;
            server_name  localhost;
            location / {
                root   html;
                index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
    }

    7.执行脚本

    #检查路径
    tree /app/docker/kodcloud    
    #redis
    cd /app/docker/kodcloud/redis
    chmod +x DR
    ./DR
    #mysql
    cd /app/docker/kodcloud/mysql
    chmod +x DR
    ./DR
    #kodcloud
    cd /app/docker/kodcloud/kod
    chmod +x DR
    ./DR
    #nginx
    cd /app/docker/kodcloud/nginx
    chmod +x DR
    ./DR
    #检查
    docker ps
    #访问http://kod.wym.com,注意hosts解析
    

    8.配置kodcloud服务
    其中的配置可以参考 kod-cloud-stack仓库的README
    其中的配置其实都是容器名+容器端口+ENV环境变量

    我已经验证过了,不会出问题,只要tree /app/docker/kodcloud和图一样,不会出问题

    9.一些错误(包含START脚本)

    • 权限拒绝

      redis容器出现权限拒绝,为docker run添加entrypoint=/bin/bash强制启动

      • 修改容器启动用户为1000 失败
      • 修改/var/log/redis/redis.log权限为777 失败
      • 为/var/log/redis添加x权限 成功
      • 使用--privileged=true 未验证
    • 连接拒绝

      连接拒绝,而不是没有连接,也就是说连上了redis但是redis拒绝了

      • ping kod-nginx (基于严谨,试试能不能连) 通了
      • 检查dockerfile,发现是端口开错了,应该是EXPOSE 6379写成EXPOSE 6377
    • 没有上下文环境

      实际上一开始我认为是路径错误,但是这个/app/docker/kodcloud/redis/dockerfile就是正确的路径,这时观察到prepare context,译为准备上下文环境,我立刻就想到了有关COPY.ADD的上下文环境,没有上下文环境,COPY和ADD就会出问题,所以,必须在dockerfile所在的路径内进行镜像构建,此处就是错在在该路径外构建dockerfile镜像
    • 脚本语言混用

      不难发现,使用了${命令}的形式,这是完全错误的,实际上是变量=$(命令)赋值与${变量}取值
    • 变量未取值

      错在忘记取值了,导致出现例如if [ is_kod}-eq 0 ]; then,直接使用变量进行比较

    10.一些收获

    • 构建式传参
      部分dockerfile
      ARG MYSQL_R_P
      ENV MYSQL_ROOT_PASSWORD=${MYSQL_R_P}
      构建命令
      docker build -t wym/mysql:kod --build-arg MYSQL_R_P=MyStr0ngP@ssw0rd!
      使用docker build时传入的--build-arg参数指定ARG变量,然后对ENV进行赋值
      我仔细想想发现好像没啥用,ARG构建完就没用了,ENV不如直接在docker run的时候-e指定
    • mysql容器环境变量
      MYSQL_ROOT_PASSWOR root密码
      MYSQL_DATABASE 创建数据库名
      MYSQL_USER 普通用户名
      MYSQL_PASSWORD 普通用户密码
      通过这些环境变量的设置,不需要进入mysql容器进行初始化就可直接使用
    • redis的log权限问题
      在redis.conf设置了log文件为/var/log/redis/redis.log,pid文件为/var/run/redis.pid
      需要对/var/log/redis授权,给予others的x权限使redis能够查看该目录
      需要对/var/log/redis/redis.log,给予others的rw权限时redis能够读写
      pid文件不需要创建,redis自动创建
    • git初始化覆盖问题
      git初始化仓库导致我的安装目录被覆盖了,原本只要mv进来就行的现在直接不行了
      实际上原来的文件还在,其实只是被暂时覆盖了,这与临时挂载的文件系统一样,将原来的仓库清除即可
      取消git初始化
      git remote rm origin
      不要在存在文件的目录进行git init,否则会被覆盖(但不会丢失)
    • git标签
      每一次推送标签,就代表着一个新的版本,会将当前master分支存为一个版本,之后新推上来的不会进入这个版本,
      我想标签就是git版本管理的核心

    11.待优化
    没有实现自定义密码(不难,只因为忘了,而且要熄灯没时间了)
    明天使用docker-compose安装
    尝试使用jenkins+harbor实现

    补充:
    redis.conf 下载获取redis.conf
    Docker环境可道云网盘的安装示例 | Kodcloud Documentation官网docker-compose
    nginx1.27获取nginx.conf
    获取START脚本
    我已经将目录结构推送到gitee,其中包含START(START脚本太长,不展示)

    最后总结

    一天完成脚本+dockerfile+博客+测试,从早上9:00一直到21:00,除去吃饭1h,一共11h完成,有点慢了,主要是dockerfile与脚本写的不多,不熟练,但是只要多练,总会有巅峰期的

    哪有赌狗天天输,哪有一直努力就没回报的

    本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    Copyright©2026  All Rights Reserved.  Load:0.020 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。