layout: post
title: “中间件服务部署-Docker版”
description: “分享”
tag: Docker
0、注意事项
1、权限回收(rabbitmq建议使用命令方式创建用户等信息)
2、严禁使用localhost
3、生产环境常见问题:没有网络、没有yum命令等
1、MySQL
docker pull mysql:5.7docker pull redis:7.0.0docker pull rabbitmq:managementdocker pull elasticsearch:7.2.0docker pull nginx:1.19.10-alpine
# 创建目录mkdir /docker/mysql/{etc,data,logs} -p# 如果已经存在,清空rm -rf /docker/mysql/{etc,data,logs}/*# 创建配置文件vim /docker/mysql/etc/mysqld.cnf[mysqld]pid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sockdatadir = /var/lib/mysql#log-error = /var/log/mysql/error.log# By default we only accept connections from localhost#bind-address = 127.0.0.1# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0# mysql日志时间跟随系统时间log_timestamps=systemcharacter-set-server=utf8vim /docker/mysql/etc/mysql.cnf[mysql]default-character-set=utf8# 启动日志docker run -d -p 3306:3306 --name=mysql -v "/docker/mysql/etc/mysqld.cnf":"/etc/mysql/mysql.conf.d/mysqld.cnf" --mount type=bind,src=/docker/mysql/data,dst=/var/lib/mysql \-v mysql-logs:/var/log/mysql/ \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=Geray@2022 \--restart always mysql:5.7
-v:挂载配置文件到容器中
—mount:将数据文件从容器中映射到本地
-e TZ=Asia/Shanghai:设置容器中的系统时区
-e MYSQL_ROOT_PASSWORD=Geray@2022:设置mysql密码
—restart always :设置容器的重启策略
修改mysql数据库编码:
# 查看编码docker exec -it mysql mysql -uroot -pmysql> show variables like '%char%';+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | latin1 || character_set_connection | latin1 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | latin1 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/share/mysql/charsets/ |+--------------------------+----------------------------+8 rows in set (0.00 sec)mysql># 修改编码:(修改配置文件mysqld : character-set-server=utf8)# 添加mysql的[mysql]组文件挂载并重新配置容器启动查看[mysql]default-character-set=utf8# 启动日志docker run -d -p 3306:3306 --name=mysql -v "/docker/mysql/etc/mysqld.cnf":"/etc/mysql/mysql.conf.d/mysqld.cnf" -v "/docker/mysql/etc/mysql.cnf":"/etc/mysql/conf.d/mysql.cnf" --mount type=bind,src=/docker/mysql/data,dst=/var/lib/mysql \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=Geray@2022 \--restart always mysql:5.7mysql> show variables like '%char%';+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | utf8 || character_set_connection | utf8 || character_set_database | utf8 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | utf8 || character_set_system | utf8 || character_sets_dir | /usr/share/mysql/charsets/ |+--------------------------+----------------------------+8 rows in set (0.01 sec)
创建用户并授权
CREATE USER 'username'@'host' IDENTIFIED BY 'password';# 创建用户CREATE USER 'ump'@'%' IDENTIFIED BY 'Gsww_2022';FLUSH PRIVILEGES;
- username:你将创建的用户名
- host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符
%- password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
GRANT privileges ON databasename.tablename TO 'username'@'host'# 授权GRANT ALL ON *.* TO 'ump'@'%';FLUSH PRIVILEGES;
- privileges:用户的操作权限,如
SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL- databasename:数据库名
- tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用
*表示,如*.*
更简单的Podman
podman run --name mysql-server -t \-e MYSQL_DATABASE="zabbix" \-e MYSQL_USER="aa" \-e MYSQL_PASSWORD="cc" \-e MYSQL_ROOT_PASSWORD="cc" \-v /data/zabbix/:/var/lib/mysql/:Z \--restart=always \--pod=zabbix \-d mysql:8.0 \--character-set-server=utf8 --collation-server=utf8_bin \--default-authentication-plugin=mysql_native_password
2、Redis
redis.conf(7.0.0模板)
#删除注释行和空行sed -i '/^#/d;/^$/d' redis.conf
cat > /docker/redis/conf/redis.conf << EOF#bind 127.0.0.1 -::1 # 注释掉protected-mode yesport 6379tcp-backlog 511timeout 0tcp-keepalive 300daemonize nopidfile /var/run/redis_6379.pidloglevel noticelogfile ""databases 16always-show-logo noset-proc-title yesproc-title-template "{title} {listen-addr} {server-mode}"stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbrdb-del-sync-files nodir ./replica-serve-stale-data yesreplica-read-only yesrepl-diskless-sync yesrepl-diskless-sync-delay 5repl-diskless-sync-max-replicas 0repl-diskless-load disabledrepl-disable-tcp-nodelay noreplica-priority 100acllog-max-len 128lazyfree-lazy-eviction nolazyfree-lazy-expire nolazyfree-lazy-server-del noreplica-lazy-flush nolazyfree-lazy-user-del nolazyfree-lazy-user-flush nooom-score-adj nooom-score-adj-values 0 200 800disable-thp yesappendonly noappendfilename "appendonly.aof"appenddirname "appendonlydir"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yesaof-use-rdb-preamble yesaof-timestamp-enabled noslowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-listpack-entries 512hash-max-listpack-value 64list-max-listpack-size -2list-compress-depth 0set-max-intset-entries 512zset-max-listpack-entries 128zset-max-listpack-value 64hll-sparse-max-bytes 3000stream-node-max-bytes 4096stream-node-max-entries 100activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit replica 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10dynamic-hz yesaof-rewrite-incremental-fsync yesrdb-save-incremental-fsync yesjemalloc-bg-thread yesrequirepass Gsww_2022EOF
mkdir -p /docker/redis/{conf,data}# 通过docker inspect redis命令查看镜像中的redis版本和使用的软件包来下载获取对应版本的配置文件# 修改配置文件requirepass Gsww_2022 #密码#bind 127.0.0.1 #注释掉(或者修改为0.0.0.0)protected-mode yes #启用保护模式
# 添加域名解析vim /etc/hosts# GitHub Start52.74.223.119 github.com192.30.253.119 gist.github.com54.169.195.247 api.github.com185.199.111.153 assets-cdn.github.com151.101.76.133 raw.githubusercontent.com151.101.108.133 user-images.githubusercontent.com151.101.76.133 gist.githubusercontent.com151.101.76.133 cloud.githubusercontent.com151.101.76.133 camo.githubusercontent.com151.101.76.133 avatars0.githubusercontent.com151.101.76.133 avatars1.githubusercontent.com151.101.76.133 avatars2.githubusercontent.com151.101.76.133 avatars3.githubusercontent.com151.101.76.133 avatars4.githubusercontent.com151.101.76.133 avatars5.githubusercontent.com151.101.76.133 avatars6.githubusercontent.com151.101.76.133 avatars7.githubusercontent.com151.101.76.133 avatars8.githubusercontent.com# GitHub End
docker run -d -v /docker/redis/conf/:/etc/redis/ -v /docker/redis/data:/data --privileged=true -p 6379:6379 --restart always -e TZ=Asia/Shanghai --name redis redis:7.0.0 redis-server /etc/redis/redis.conf --appendonly yes
包含您的文件
/docker/redis/conf/的本地目录在哪里。redis.conf使用这种方法意味着您不需要为您的 redis 容器提供 Dockerfile。映射目录应该是可写的,因为根据配置和操作模式,Redis 可能需要创建额外的配置文件或重写现有的配置文件。
# 测试docker exec -it redis redis-cli
3、Rabbitmq
配置文件:
cat > /docker/rabbitmq/conf/rabbitmq-env.conf << EOFRABBITMQ_NODENAME=rabbitmq001#RABBITMQ_NODE_IP_ADDRESS=192.168.6.21RABBITMQ_NODE_PORT=5672#RABBITMQ_MNESIA_BASE=/opt/rabbitmq/data#RABBITMQ_LOG_BASE=/var/logEOFcat > /docker/rabbitmq/conf/rabbitmq.config <<EOF[{rabbit,[{tcp_listeners, [5672]},{dump_log_write_threshold, [1000]},{vm_memory_high_watermark, 0.5},{disk_free_limit, "200MB"},{hipe_compile,true}]}].EOF
mkdir -p /docker/rabbitmq/{conf,data,logs}rm -rf /docker/rabbitmq/{data,logs}/*docker run -d --name rabbitmq -p 15672:15672 -p 5672:5672 -v /docker/rabbitmq/conf:/opt/rabbitmq/etc/rabbitmq -v /docker/rabbitmq/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=Geray@2022 -v /etc/localtime:/etc/localtime:ro --restart always rabbitmq:managementdocker exec -it rabbitmq bash
配置账号密码
# 创建账号和密码(用户存在可以跳过改步骤)docker exec -it rabbitmq rabbitmqctl add_user admin Geray_2022# 设置用户角色docker exec -it rabbitmq rabbitmqctl set_user_tags admin administrator# 设置用户权限# 用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限# 格式:set_permissions [-p <vhostpath>] <user> <conf> <write> <read># 给/这个vhost设置了admin权限docker exec -it rabbitmq rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"# 更改密码docker exec -it rabbitmq rabbitmqctl change_password admin Gsww_2022# 当前用户和角色docker exec -it rabbitmq rabbitmqctl list_users
追加启动策略
# 查看容器启动时间docker inspect -f "{{ .State.StartedAt }}" rabbitmq# 重启次数docker inspect -f "{{ .RestartCount }}" rabbitmq# 重启策略docker inspect rabbitmq | grep -i -A 3 restartPolicy# 重新设置容器的重启策略docker container update --restart=always rabbitmq
4、ES
1. 优化系统:
# 设置虚拟内存大小,Elasticsearch使用了 NioFs(非阻塞文件系统)和 MMapFs(内存映射文件系统)。# 配置最大映射数量,以便有足够的虚拟内存可用于mmapped文件echo "vm.max_map_count=262144" >> /etc/sysctl.conf# 禁止内存与硬盘交换echo "vm.swappiness=1" >> /etc/sysctl.conf# 是配置生效sysctl -p
es至少需要的内存权限为:262144,默认用户的内存权限为:65530
修改该配置是为了防止es在启动时出现下面的错误
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
创建es账号
es不能使用root账号启动
useradd espasswd es
2. 启动
docker pull elasticsearch:7.2.0#启动镜像docker run -d --name es \-v es-conf:/usr/share/elasticsearch/config/ \-v es-data:/usr/share/elasticsearch/data/ \-v es-log:/usr/share/elasticsearch/logs/ \-v es-plugins:/usr/share/elasticsearch/plugins/ \-v /etc/localtime:/etc/localtime:ro \-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-e TZ=Asia/Shanghai \-p 9200:9200 -p 9300:9300 \--restart=always \elasticsearch:7.2.0
ES_JAVA_OPTS设置了ES的启动内存,自己按需修改
discovery.type=single-node表示该es为单节点,不加这个的话,你的es健康状态会显示为黄色
3. 修改配置文件
# 添加配置文件cat > /var/lib/docker/volumes/es-conf/_data/elasticsearch.yml << EOF# 集群名cluster.name: docker-cluster-es# 节点名node.name: node# 监听ipnetwork.host: 0.0.0.0# 开启x-pack插件,用于添加账号密码xpack.security.enabled: trueEOF
修改JVM内存参数(本地环境资源有限)
生产环境建议配置物理内存的50%,但不要超过32G
sed -i "s/Xms1g/Xms512m/g" /var/lib/docker/volumes/es-conf/_data/jvm.optionssed -i "s/Xmx1g/Xmx512m/g" /var/lib/docker/volumes/es-conf/_data/jvm.options
4. 重启容器
docker restart es
5. 设置密码
# 交互式配置密码docker exec -it es elasticsearch-setup-passwords interactive
根据提示,先输入y,然后输入密码,这里会要求输入多次,主要是需要给好几个系统添加密码,用户默认elastic(Gsww_2022)
5、Nginx
docker pull nginx:1.19.10-alpinedocker run -d --name nginx \-p 80:80 \-v nginx-conf:/etc/nginx/ \-v nginx-data:/usr/share/nginx/ \-e TZ=Asia/Shanghai \--restart=always \nginx:1.19.10-alpine
6、Dockerfile
1. jdk
FROM alpine:latest#MAINTAINER "Geray <1690014753@qq.com>"# 打标签LABEL version="1.0" \description="alpine:latest" \maintainer="geray<1690014753@qq.com>"# 配置apk包加速镜像为阿里RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositoriesRUN apk update \# && apk add s6 \# && apk add nghttp2-dev \&& apk add ca-certificates \&& apk add wget \# && apk add curl \# && apk add tcpdump \# && apk add bash-completion \# && apk add iputils \# && apk add iproute2 \&& apk add libc6-compat \&& apk add -U tzdata \&& rm -rf /var/cache/apk/* \# 设置操作系统时区&& rm -rf /etc/localtime \&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime# 设置时区变量ENV TIME_ZONE Asia/Shanghai# 设置 语言支持ENV LANG=zh_CN.UTF-8# 配置 应用工作目录WORKDIR /data/VOLUME /data/COPY jdk1.8.0_281/ /data/# 设置jdk环境变量ENV JAVA_VERSION=1.8.0_281 \JAVA_HOME=/data/jdk1.8.0_281 \JRE_HOME=$JAVA_HOME/jre \CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar \PATH=$PATH:${JAVA_HOME}/bin# 配置 对外端口#EXPOSE 11000# 设置启动时预期的命令参数, 可以被 docker run 的参数覆盖掉.#CMD ["bash", "sleep 20m"]
zip glibc 是GNU发布的libc库,即c运行库。. glibc 是linux系统中最底层的api,几乎其它任何运行库都会依赖于 glibc, 在制作docker alpine镜像可以需要用到他.(docker官方推荐java是基于glibc库,而alpine默认只提供mini libc,故需要安装glibc库)
下载glibc安装包
glibc-2.29-r0.apk、glibc-bin-2.29-r0.apk、glibc-i18n-2.29-r0.apk到文件夹下,下载地址:
构建:
docker build -t jdk:1.8-alpine .
| 名称 | 说明 | 实例 |
|---|---|---|
| s6 | s6是一个unix服务管理器(更像runit和supervisord)。 虽然Docker容器应该有一个明确的焦点,但通常情况下,您需要在容器中运行多个进程。 consur就是一个很好的例子;您需要consur代理来加入consur集群和主服务. | 如Nginx或js节点. 日志管理也是可能需要运行另一个进程的一个关键考虑因素。 |
| iputils | iputils软件包是Linux 环境下一些实用的网络工具的集合 |
|
| iproute2 | iproute2是linux下管理控制TCP/IP网络和流量控制的新一代工具包,旨在替代老派的工具链net-tools,即大家比较熟悉的ifconfig,arp,route,netstat等命令。 | |
| libc6-compat | 这个包提供了一个轻量级的glibc兼容层。对于简单的应用程序,这可能就足够了。 | |
| ca-certificates | 我们在构建 docker镜像时一般使用的是 alpine linux系统,默认是不带 ca-certificates根证书的,导致无法识别外部 https 携带的数字证书。 |
附件:镜像加速
cat > /etc/docker/daemon.json << EOF{"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://docker.mirrors.ustc.edu.cn","https://3fc19s4g.mirror.aliyuncs.com"]}EOF
