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