前言
最近深度复习了了脚本,mysql,redis,nginx,docker相关内容,决定今天使用dockerfile搭建我之前直接在主机上搭建的kodcloud服务
参考内容
Docker环境可道云网盘的安装示例
如果是小白只要服务,请下载压缩包,解压,运行START脚本(注意安装环境)
kodcloud整合包下载
该整合包已经配置好了目录结构,傻瓜操作,一键启动(自定义域名+自定义存储路径)
环境
- 主机环境需要部署
需要安装php7.3+nginx+mysql5.7+redis+kodcloud - 容器环境需要部署
安装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与加速镜像
存储路径需要为空,脚本会清空存储路径防止你重复执行安装出现数据问题
实现
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/html3.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.log5.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_PASSWORroot密码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与脚本写的不多,不熟练,但是只要多练,总会有巅峰期的
哪有赌狗天天输,哪有一直努力就没回报的



