Docker生产环境搭建(MySQL5.7、Nginx、Redis)
- 自定义网络
- 一、Docker安装Mysql5.7
- 1.1、拉取并查看mysql镜像
- 1.2、创建Mysql容器实例
- 1.3、设置MySQL配置文件 并重启MySQL容器
- 1.4、进入MySQL容器实例
- 1.5、修改MySQL容器密码
- 二、Docker安装Nginx
- 2.1、拉取镜像
- 2.2、容器中的nginx.conf文件和conf.d文件夹复制到宿主机
- 2.3、创建Nginx容器并运行
- 2.4、Nginx热加载
- 2.5、配置文件修改
- 2.5.1、nginx.conf
- 2.5.2、default.conf
- 三、Docker安装Redis
- 3.1、拉取镜像
- 3.2、上传redis配置文件
- 创建容器
- 进入redis容器实例
使用docker安装单机版MySQL5.7、Nginx、Redis
自定义网络
生产环境因为不止单独一个应用,所以尽量使用自定义网络,来保证各个容器间可以通过容器名来访问,保证数据互通
docker network create orange_network
一、Docker安装Mysql5.7
Docker官网查询MySQL版本 - https://registry.hub.docker.com/_/mysql
1.1、拉取并查看mysql镜像
docker pull mysql:5.7
docker images mysql:5.7
1.2、创建Mysql容器实例
docker run -d \
-p 3306:3306 \
--restart=always \
--privileged=true \
--network orange_network \
-v /docker/mysql/logs:/var/log/mysql \
-v /docker/mysql/data:/var/lib/mysql \
-v /docker/mysql/conf:/etc/mysql/conf.d \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql5.7 \
mysql:5.7
-
-d
后台运行 -
-p 3306:3306
指定宿主机3306端口与容器3306端口映射 -
--restart=always
设置容器开机自启 -
--privileged=true
扩大容器的权限解决挂载目录没有权限的问题 -
-v
将docker容器内的数据保存进宿主机的磁盘中,并进行挂载 -
-e MYSQL_ROOT_PASSWORD=123456
初始化MySQL密码为123456 -
--name mysql5.7
指定容器运行名称为mysql5.7 -
mysql:5.7
docker镜像名称
# 查看所有的容器
docker ps -a
容器创建后通过update命令实现容器的开机自启动
如果创建时未指定--restart=always
,可通过update 命令设置:
# docker update --restart=always 容器名称(或者容器ID)
docker update --restart=always mysql5.7
--restart
具体参数值详细信息如下:
-
no
默认值,表示容器退出时,docker不自动重启容器 -
on-failure
只有在非0状态退出时才重新启动容器; -
always
无论退出状态是如何,都重启容器;
1.3、设置MySQL配置文件 并重启MySQL容器
cd /docker/mysql/conf/
vim my.cnf
# 粘贴以下内容(解决中文字符乱码问题)
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
# 重启MySQL容器
docker restart mysql5.7
如果启动失败,可以通过以下命令进行查看
# docker logs --tail=行数 容器名称
docker logs --tail=100 mysql5.7
# docker logs --since 10m 容器名称(--since 10m 是查看此容器10分钟之内的日志情况。)
docker logs --since 10m mysql5.7
1.4、进入MySQL容器实例
docker exec -it mysql5.7 bash
# 查看MySQL编码
show variables like 'character%';
1.5、修改MySQL容器密码
# 修改普通用户密码为1234567,只改一个就好
SET PASSWORD FOR '你的用户' = PASSWORD('1234567');
# 注意:修改root用户,需要改两个
SET PASSWORD FOR 'root' = PASSWORD('xxxxxxxxx');
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('xxxxxxxxx');
退出容器,执行:docker restart mysql5.7
二、Docker安装Nginx
2.1、拉取镜像
# 拉取镜像
docker pull nginx
# 查看镜像
docker images nginx
# 创建数据挂载目录
mkdir -p /docker/nginx/conf
mkdir -p /docker/nginx/logs
mkdir -p /docker/nginx/html
2.2、容器中的nginx.conf文件和conf.d文件夹复制到宿主机
# 生成容器
docker run --name nginx -p 80:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /docker/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /docker/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /docker/nginx/
2.3、创建Nginx容器并运行
# 找到nginx对应的容器id
docker ps -a
# 关闭该容器
docker stop nginx
# 删除正在运行的nginx容器
docker rm -f nginx
# 创建Nginx容器并运行
docker run \
-p 80:80 \
--name nginx \
--restart=always \
--privileged=true \
--network orange_network \
-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /docker/nginx/logs:/var/log/nginx \
-v /docker/nginx/html:/usr/share/nginx/html \
-v /etc/localtime:/etc/localtime \
-d nginx:latest
2.4、Nginx热加载
# 配置文件语法检查
# docker exec [nginx容器名] nginx -t
docker exec nginx nginx -t
# docker exec [nginx容器名] nginx -s reload
docker exec nginx nginx -s reload
# 可能出现错误:nginx: [emerg] host not found in upstream "backend" in /etc/nginx/conf.d/default.conf:14
# 这时需要重启nginx容器
docker restart nginx
2.5、配置文件修改
2.5.1、nginx.conf
nginx.conf
user root;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# backend用于负载的nginx服务名
upstream backend {
# shr-middle-dev:docker的容器名称,相当于IP
server shr-middle-dev:9000 weight=1;
}
include ./conf.d/*.conf;
}
2.5.2、default.conf
default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 拦截路径
location /shrMiddle/ {
proxy_pass http://backend;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
三、Docker安装Redis
3.1、拉取镜像
# 拉取镜像
docker pull redis
# 查看镜像
docker images redis
# 创建数据挂载目录
mkdir -p /docker/redis
3.2、上传redis配置文件
上传myredis.conf
配置文件到/docker/redis
目录
配置内容如下:
################################## NETWORK #####################################
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
# 这里要注释掉
# bind 127.0.0.1
# 关闭保护模式 改为no
protected-mode no
# 设置运行端口
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
################################# TLS/SSL #####################################
# 后台运行为no无需修改
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
################################ SNAPSHOTTING ################################
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
################################# REPLICATION #################################
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
############################### KEYS TRACKING #################################
################################## SECURITY ###################################
acllog-max-len 128
# 设置redis访问密码,无需密码可以注释掉
# requirepass foobared
################################### CLIENTS ####################################
############################## MEMORY MANAGEMENT ################################
############################# LAZY FREEING ####################################
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
############################## APPEND ONLY MODE ###############################
# 开启redis 持久化,改为yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
################################ LUA SCRIPTING ###############################
lua-time-limit 5000
################################ REDIS CLUSTER ###############################
########################## CLUSTER DOCKER/NAT support ########################
################################## SLOW LOG ###################################
slowlog-log-slower-than 10000
slowlog-max-len 128
################################ LATENCY MONITOR ##############################
latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
notify-keyspace-events ""
############################### GOPHER SERVER #################################
############################### ADVANCED CONFIG ###############################
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
创建容器
docker run \
-p 6379:6379 \
--restart=always \
--name myredis \
--log-opt max-size=100m \
--log-opt max-file=2 \
--privileged=true \
--network orange_network \
-v /docker/redis/myredis.conf:/etc/redis/redis.conf \
-v /docker/redis/data:/data \
-v /etc/localtime:/etc/localtime \
-d redis \
redis-server /etc/redis/redis.conf
-
-p 6379:6379
将6379端口挂载出去 -
--restart=always
总是开机启动 -
--name myredis
给这个容器个名字为myredis -
-log
是日志方面的 -
--privileged=true
扩大容器的权限解决挂载目录没有权限的问题 -v
数据卷挂载
-
/docker/redis/myredis.conf:/etc/redis/redis.conf
这里是将 liunx 路径下的myredis.conf
和redis下的redis.conf
挂载在一起。 -
/docker/redis/data:/data
这个同上
-
-d redis
表示后台启动redis -
redis-server /etc/redis/redis.conf
以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的/home/redis/myredis/myredis.conf -
--appendonly yes
开启redis 持久化 -
--requirepass 000415
设置密码
进入redis容器实例
docker exec -it myredis redis-cli
-----------or-----------
docker exec -it myredis bash