docker-compose部署总结

453 阅读2分钟

一、nginx容器配置

自启动

将启动脚本复制到 /etc/profile 中,这种方法在docker中并没有生效

添加自启动脚本nginx

#!/bin/bash
 
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/sbin/$NAME
SCRIPTNAME=/etc/init.d/$NAME
 
 
# If the daemon file is not found, terminate the script.
test -x $DAEMON || exit 0
 
d_start() {
        $DAEMON || echo -n " already running"
}
 
d_stop() {
        $DAEMON –s quit || echo -n " not running"
}
 
d_reload() {
        $DAEMON –s reload || echo -n " could not reload"
}
 
case "$1" in
    start)
    echo -n "Starting $DESC: $NAME"
    d_start
    echo "."
    ;;
stop)
    echo -n "Stopping $DESC: $NAME"
    d_stop
    echo "."
    ;;
reload)
    echo -n "Reloading $DESC configuration..."
    d_reload
    echo "reloaded."
    ;;
restart)
    echo -n "Restarting $DESC: $NAME"
    d_stop
# Sleep for two seconds before starting again, this should give the
# Nginx daemon some time to perform a graceful stop.
    sleep 2
    d_start
    echo "."
    ;;
*)
    echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
    exit 3
    ;;
esac
exit 0

注:需要将脚本中与nginx相关的路径替换成本地路径

编写脚本start.sh

/etc/init.d/nginx start
wine "C:\\Program Files\\Java\\jre1.8.0_291\\bin\\java.exe" -jar "D:\\test.jar"

通过docker-compose启动

services:
    test:
        container_name: "test"
        volumes:
            - ./cosimcloud/nginx:/etc/init.d/ningx
        build:
            context: ./test/
        env_file:
            - ./env/test.env
        command: /start.sh

防止容器启动后退出

有以下几种方式添加启动命令:

  • dockerfile 中的 CMD、ENTRYPOINT
  • docker run
  • docker-compose 中的command

如果指定程序是一个临时的任务,容器启动后状态会变成Exited。这时,可以通过在脚本的最后追加tail -f /dev/null避免容器退出,建议写在sh脚本中。例如:

/etc/init.d/nginx start
wine "C:\\Program Files\\Java\\jre1.8.0_291\\bin\\java.exe" -jar "D:\\test.jar"
exit 0
tail -f /dev/null

nginx 刷新后404

使用try_files尝试加载页面,结尾需要以=404或者/index.php结尾。

    location / {
        root   /usr/share/nginx/html/dist;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html =404;
    }

二、docker-compose启动顺序编排

nc命令

nc是netcat的简写,是一个简单、可靠的网络工具。作用如下:

  • 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
  • 端口的扫描,nc可以作为client发起TCP或UDP连接
  • 主机间传输文件
  • 主机间网络测速

常用参数如下:

  • -l 指定nc将处于侦听模式;被当作server,侦听并接受连接,而非向其它地址发起连接。
  • -p 设置端口
  • -s 指定发送数据的源IP地址
  • -u 使用UDP协议
  • -v 输出交互信息
  • -w 设置超时秒数
  • -z 扫描时不发送数据

nc命令用法举例

脚本配置【entrypoint.sh】

查询依赖容器脚本如下,相关容器需要支持nc命令;该sh脚本适合bashbusybox

#!/bin/bash

wait_for() {
    echo Waiting for $1 to listen on $2...
    while ! nc -z $1 $2; 
        do echo waiting...; sleep $SLEEP_SECOND; 
    done
}

declare DEPENDS
declare CMD

while getopts "d:c:" arg
do
    case $arg in
        d)a
            DEPENDS=$OPTARG
            ;;
        c)
            CMD=$OPTARG
            ;;
        ?)
            echo "unkonw argument"
            exit 1
            ;;
    esac
done

host=${DEPENDS%:*}
port=${DEPENDS#*:}
wait_for $host $port

eval $CMD

该脚本支持 -d-c选项; -d用于配置依赖的容器;-c用于校验成功后执行的命令。

例如(docker-compose):

services:
    system:
        container_name: "simtek-modules-system"
        env_file:
            - ./env/microservice.env
        build:
            context: ./jar/
            args:
                JAR_FILE: simtek-modules-system.jar
                EXPOSE_PORT: 9200
        volumes:
            - ./jar/logs/simtek-system:/logs/simtek-system:rw
            - ./entrypoint.sh:/entrypoint.sh:rw
        entrypoint: sh /entrypoint.sh -d simtek-nacos1:8848 -c 'java -jar /usr/share/simtek-application.jar';
        depends_on:
            - nacos
            - redis
        ports:
            - "9201:9201"
        networks:
            simtek-net:
                aliases:
                    - simtek-modules-system
networks:
    simtek-net:
        driver: bridge
volumes:
  db-data:

三、前端项目配置

如何查看项目的vue版本?

  1. 查询package-lock.json文件

  2. npm list vue

例如:

$ npm list vue
fmumodel@3.4.0 D:\Project\GIT\front\xxx
`-- UNMET DEPENDENCY vue@2.6.12

如何配置vue

  1. 安装nodeJS

  2. 配置淘宝镜像:

npm install -g cnpm --registry=https://registry.npm.taobao.org
  1. 安装vue2
 npm install --global vue-cli vue
  1. error fmumodel@3.4.0 dev: vue-cli-service serve
npm i
npm run build:prod

四、解决验证码在docker中无效

验证码的生成需要依赖字体,在基础容器中需要配置相关的字体。可在dockerfile中添加以下命令:

RUN apk add fontconfig && fc-cache --force
COPY ./fonts/ "/usr/share/fonts/"

fonts目录存放的是字体,至于复制路径/usr/share/fonts/在不同的镜像中可能不同。

启动后,可以通过以下命令测试字体是否安装成功:

fc-list

五、日志配置

配置redis日志

相关配置如下:

loglevel debug
logfile "redis.log" # 默认不存在需要配置

日志级别:

  • debug:会打印出很多信息,适用于开发和测试阶段
  • verbose:包含很多不太有用的信息,但比debug要清爽一些
  • notice:生产模式
  • warning : 警告信息

配置 MySQL日志

错误日志

log-error=/var/log/mysql/error.log

bin日志【主从复制中,server_id需要为唯一】

server_id=99
log_bin = /var/log/mysql/mysql-bin

慢日志

slow_query_log = 1
slow_query_log_file = /var/log/mysql/localhost-slow.log
long_query_time = 0.5
log_queries_not_using_indexes

nginx配置日志

容器版本:【nginx:1.19.2-alpine】

相关配置

 access_log  /var/log/nginx/access.log  main;
 error_log  /var/log/nginx/error.log notice;

六、sh语法异常

syntax error near unexpected token $'{\r'' :表示行尾不匹配,需要修复行尾。应当转换setup.sh为 Unix 行尾,方法如下:

  1. 使用dos2unix
apt-get install -y dos2unix
dos2unix setup.sh
  1. 使用sed替换行尾
  2. 使用vscode等编辑软件

七、docker-compose的镜像在局域网下部署

在局域网下,无法连接docker-hub拉取镜像,所以需要将镜像打包后再导入。

# 导出
$ docker-compose images| awk 'FNR > 1 {print $2":"$3}'| sort -u|xargs docker save -o images.tar

# 导入
docker load -i images.tar
  • awk 'FNR > 2 {print $2":"$3}'从1步骤中获取Repository:Tag镜像列表
  • sort -u去除重复镜像
  • xargs docker save -o images.tar使用2步骤的镜像信息作为docker save命令参数合并导出多个镜像到images.tar文件

八、linux awk命令

语法

awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

选项参数说明

  • -F fs or --field-separator fs
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
  • -v var=value or --asign var=value
    赋值一个用户定义变量。
  • -f scripfile or --file scriptfile
    从脚本文件中读取awk命令。
  • -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
  • -W compact or --compat, -W traditional or --traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
  • -W copyleft or --copyleft, -W copyright or --copyright
    打印简短的版权信息。
  • -W help or --help, -W usage or --usage
    打印全部awk选项和每个选项的简短说明。
  • -W lint or --lint
    打印不能向传统unix平台移植的结构的警告。
  • -W lint-old or --lint-old
    打印关于不能向传统unix平台移植的结构的警告。
  • -W posix
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替^和^=;fflush无效。
  • -W re-interval or --re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
  • -W source program-text or --source program-text
    使用program-text作为源代码,可与-f命令混用。
  • -W version or --version
    打印bug报告信息的版本。

运算符

运算符描述
= += -= *= /= %= ^= **=赋值
?:C条件表达式
逻辑或
&&逻辑与
~ 和 !~匹配正则表达式和不匹配正则表达式
< <= > >= != ==关系运算符
空格连接
+ -加,减
* / %乘,除与求余
+ - !一元加,减和逻辑非
^ ***求幂
++ --增加或减少,作为前缀或后缀
$字段引用
in数组成员

内建变量

变量描述
$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真,则进行忽略大小写的匹配
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出字段分隔符,默认值与输入字段分隔符一致。
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/034)