CentOS Docker 用简单脚本部署Nginx+SSL证书+Mysql+Redis

1. 部署 Nginx

1.1. 初始化Nginx挂载目录

编写shell脚本来实现,也可以自行按照脚本手动执行每一个命令:

# 编写脚本,请找一个用户习惯管理的目录存放脚本
vim init_nginx_dir.sh
# 增加脚本可执行权限
chmod +x init_nginx_dir.sh
# 执行脚本
./init_nginx_dir.sh 

脚本内容如下:

#!/bin/bash

echo "开始初始化 docker nginx 挂载目录"

echo "创建容器中 /root/nginx/conf 目录对应的外部挂载目录"
mkdir -p /root/docker-volume/nginx/conf
echo "创建容器中 /root/nginx/html 目录对应的外部挂载目录"
mkdir -p /root/docker-volume/nginx/html
echo "创建容器中 /root/nginx/logs 目录对应的外部挂载目录"
mkdir -p /root/docker-volume/nginx/logs
echo "创建容器中 /root/docker-volume/nginx/cert 目录对应的外部挂载目录"
mkdir -p /root/docker-volume/nginx/cert

echo "运行一个临时的 nginx docker 容器,容器名称叫 nginx-temp ,这不重要,因为这个临时容器会在脚本结束时删除"
docker run -itd --name="nginx-temp" nginx

echo "从临时容器中复制 conf.d 目录的内容到外部挂载目录"
docker cp nginx-temp:/etc/nginx/conf.d /root/docker-volume/nginx/conf

echo "从临时容器中复制 nginx.conf 目录的内容到外部挂载目录"
docker cp nginx-temp:/etc/nginx/nginx.conf /root/docker-volume/nginx/conf

echo "从临时容器中复制 html 目录的内容到外部挂载目录"
docker cp nginx-temp:/usr/share/nginx/html /root/docker-volume/nginx

echo "停止临时 nginx 容器"
docker stop nginx-temp

echo "删除临时 nginx 容器"
docker rm nginx-temp

脚本执行日志:

[root@VM-8-9-centos ~]# mkdir -p docker-images/nginx/
[root@VM-8-9-centos ~]# cd docker-images/nginx/
[root@VM-8-9-centos nginx]# vim init_nginx_dir.sh
[root@VM-8-9-centos nginx]# chmod +x init_nginx_dir.sh
[root@VM-8-9-centos nginx]# ./init_nginx_dir.sh 
开始初始化 docker nginx 挂载目录
创建容器中 /root/nginx/conf 目录对应的外部挂载目录
创建容器中 /root/nginx/html 目录对应的外部挂载目录
创建容器中 /root/nginx/logs 目录对应的外部挂载目录
创建容器中 /root/docker-volume/nginx/cert 目录对应的外部挂载目录
运行一个临时的 nginx docker 容器,容器名称叫 nginx-temp ,这不重要,因为这个临时容器会在脚本结束时删除
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
e9995326b091: Pull complete 
71689475aec2: Pull complete 
f88a23025338: Pull complete 
0df440342e26: Pull complete 
eef26ceb3309: Pull complete 
8e3ed6a9e43a: Pull complete 
Digest: sha256:943c25b4b66b332184d5ba6bb18234273551593016c0e0ae906bab111548239f
Status: Downloaded newer image for nginx:latest
4c9b60fdfbe6dcd6cb58d2e9cff714b9e3b906cb79965a6e1f7900162d210e1f
从临时容器中复制 conf.d 目录的内容到外部挂载目录
从临时容器中复制 nginx.conf 目录的内容到外部挂载目录
从临时容器中复制 html 目录的内容到外部挂载目录
停止临时 nginx 容器
nginx-temp
删除临时 nginx 容器
nginx-temp

脚本执行过后,会发现 root/ 目录下多出来下面的目录结构和 Nginx 相关文件:

[root@VM-8-9-centos ~]# tree docker-volume/
docker-volume/
`-- nginx
    |-- cert
    |-- conf
    |   |-- conf.d
    |   |   `-- default.conf
    |   `-- nginx.conf
    |-- html
    |   |-- 50x.html
    |   `-- index.html
    `-- logs

6 directories, 4 files

1.2. 安装SSL证书

很多场景都要求 SSL 证书,例如微信小程序的后端服务就一定要求有 SSL 证书,并提供 443 端口的 https 安全访问方式。

由于我们上一小节已经准备好了 Nginx 证书的挂载目录,其实安装非常的简单。

从腾讯云下载 SSL 证书,选择 Nginx 适用的压缩包。

下载完成后解压缩,得到一个目录如下:

[root@VM-8-9-centos nginx]# tree xxxx.com_nginx/
xxxx.com_nginx/
|-- xxxx.com_bundle.crt
|-- xxxx.com_bundle.pem
|-- xxxx.com.csr
`-- xxxx.com.key

说明:
证书目录和文件名中的 xxx.com 是绑定证书的域名,腾讯云下载默认以域名作为命名。

复制证书文件到 Nginx 挂载目录下:

cp xxxx.com_nginx/* /root/docker-volume/nginx/cert/

复制完成后再观察一下整个挂载目录:

[root@VM-8-9-centos ~]# tree docker-volume
docker-volume
`-- nginx
    |-- cert
    |   |-- xxxx.com_bundle.crt
    |   |-- xxxx.com_bundle.pem
    |   |-- xxxx.com.csr
    |   `-- xxxx.com.key
    |-- conf
    |   |-- conf.d
    |   |   `-- default.conf
    |   `-- nginx.conf
    |-- html
    |   |-- 50x.html
    |   `-- index.html
    `-- logs
        |-- access.log
        `-- error.log

配置Nginx开启SSL

vim docker-volume/nginx/conf/conf.d/default.conf

初始的 Nginx 配置如下所示:

server {
    
    
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
    
    
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    
    
        root   /usr/share/nginx/html;
    }
}

将其改为:

server {
    
    
    # 注释 80 端口监听
    # listen       80;
    # listen  [::]:80;
    
    # 监听 443 端口并开启 ssl,旧版本的 Nginx 开启 ssl 需要新加一行:`ssl on;`
    listen    443 ssl;

    # 改为ssl证书绑定的域名
    server_name  wwww.xxxx.com;

    # 证书路径(容器内的路径)
    ssl_certificate    /etc/nginx/cert/xxxx.com_bundle.crt;
    ssl_certificate_key    /etc/nginx/cert/xxxx.com.key;

    location / {
    
    
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    
    
        root   /usr/share/nginx/html;
    }
}

提示:
如果是更新已经启动的 Nginx 需要更改配置文件,则:

# conf.d目录下的所有`*.conf`文件都会被nginx.conf包含进去
vim /root/nginx/conf/conf.d/default.conf

# vim更新完成后让Nginx重载
docker exec -i nginx nginx -s reload

1.2. 启动Nginx容器

编写shell脚本来开启 Nginx 容器,也可以自行按照脚本手动执行每一个命令:

# 编写脚本,请找一个用户习惯管理的目录存放脚本
vim build.sh
# 增加脚本可执行权限
chmod +x build.sh
# 执行脚本
./build.sh 

build.sh 脚本内容:

#!/bin/bash

echo "beginning rebuild nginx..."

declare -A dirmap=()
dirmap["/root/docker-volume/nginx/html"]="/usr/share/nginx/html"
dirmap["/root/docker-volume/nginx/logs"]="/var/log/nginx"
dirmap["/root/docker-volume/nginx/conf/conf.d"]="/etc/nginx/conf.d"
dirmap["/root/docker-volume/nginx/cert"]="/etc/nginx/cert"

declare -A filemap=()
filemap["/root/docker-volume/nginx/conf/nginx.conf"]="/etc/nginx/nginx.conf"

command="docker run -itd -p 443:443 --restart=always --name nginx --privileged=true "

### volumn-file
# docker文件挂载时,需要先在宿主机创建好文件,不然会出问题,自己不创建文件的话 执行完命令后会将它创建成目录
for file in ${
    
    !filemap[@]} 
do
    if [ ! -f $file ] ; then
        echo "------[ERROR] $file not found, please copy from ningx container"
        exit 1
    else
        echo "$file exist"
        command="${command}-v $file:${filemap[$file]} "
    fi
done

### volumn-dir
for dirmapkey in ${
    
    !dirmap[@]} 
do
    if [ ! -d $dirmapkey ]; then
        echo "------[ERROR] $dirmapkey not found, please create it"
        exit 1
    else
        echo "$dirmapkey exit"
        command="${command}-v $dirmapkey:${dirmap[$dirmapkey]} "
    fi
done


command="${command}nginx"

echo "docker stop nginx"
docker stop nginx

echo "docker rm nginx"
docker rm nginx

echo "$command"
eval $command
if [ $? != 0 ];then
    echo "------[ERROR] docker run error"
    exit 1
fi

脚本执行日志:

[root@VM-8-9-centos nginx]# ./build.sh 
beginning rebuild nginx...
/root/docker-volume/nginx/conf/nginx.conf exist
/root/docker-volume/nginx/html exit
/root/docker-volume/nginx/logs exit
/root/docker-volume/nginx/conf/conf.d exit
/root/docker-volume/nginx/cert exit
docker stop nginx
nginx
docker rm nginx
nginx
docker run -itd -p 443:443 --restart=always --name nginx --privileged=true -v /root/docker-volume/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/docker-volume/nginx/html:/usr/share/nginx/html -v /root/docker-volume/nginx/logs:/var/log/nginx -v /root/docker-volume/nginx/conf/conf.d:/etc/nginx/conf.d -v /root/docker-volume/nginx/cert:/etc/nginx/cert nginx
1875d96a74575c49d37b511492e17114392019bd60c28cbbcc9f171c957a53a4

1.3. 验证Nginx正确生效

执行命令 docker ps 查看 docker 容器列表:

[root@VM-8-9-centos nginx]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                           NAMES
1875d96a74e7   nginx     "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx

容器启动正常!

域名解析改为当前服务器的公网ip,然后在外网浏览器访问一下 SSL 证书绑定的域名:www.xxxx.com,如果出现:“Welcome to nginx!”的欢迎页字样即可。

2. 部署Mysql

编写shell脚本来开启 Mysql 容器,也可以自行按照脚本手动执行每一个命令:

# 编写脚本,请找一个用户习惯管理的目录存放脚本
vim build.sh
# 增加脚本可执行权限
chmod +x build.sh
# 执行脚本
./build.sh 

build.sh 脚本内容:

#!/bin/bash

docker stop mysql

docker rm mysql

docker run -itd --name mysql \
--restart=always \
-e MYSQL_ROOT_PASSWORD=xxxxxx \
-e MYSQL_DATABASE=xxxxxx_db \
-e MYSQL_USER=xxxx_user \
-e MYSQL_PASSWORD=xxxxxxxx \
-v /root/docker-volume/mysql/datadir:/var/lib/mysql \
-v /root/docker-volume/mysql/conf.d:/etc/mysql/conf.d \
-v /root/docker-volume/mysql/initdb.d:/docker-entrypoint-initdb.d \
-p 3306:3306 \
mysql \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

说明:
用户密码请自行设置;
将存储文件和配置挂载到宿主机,方便管理已经保证数据安全

脚本执行日志:

[root@VM-8-9-centos mysql]# ./build.sh 
Error response from daemon: No such container: mysql
Error: No such container: mysql
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
feec22b5b798: Pull complete 
3b33952322b1: Pull complete 
8632ee03bb1c: Pull complete 
636ccd115361: Pull complete 
b07c8fac8eea: Pull complete 
e44c54db9c14: Pull complete 
cf9c45749101: Pull complete 
9f2fa3febc47: Pull complete 
44d5e1d3c311: Pull complete 
bb3db2c5d8ec: Pull complete 
e0ead729abd9: Pull complete 
Digest: sha256:717e6f25ed8997b7ecb0408e063c4dcba202a68b341ebac4c4d97f51439b87ee
Status: Downloaded newer image for mysql:latest
726747a597a721679780516315b57e968b33ca17ae0ba2d151279e2207f313ae

1.1 验证mysql能够正常连接

  1. docker宿主机连接通过:jdbc:mysql://localhost:3306
  2. 因为防火墙并没有开放宿主机的 3306 端口,也不应该开放,所以docker宿主机外部连接则先通过宿主机的 sshd 服务连接之后,再通过jdbc:mysql://localhost:3306来访问mysql。

3. 部署Redis

编写shell脚本来开启 Redis 容器,也可以自行按照脚本手动执行每一个命令:

# 编写脚本,请找一个用户习惯管理的目录存放脚本
vim build.sh
# 增加脚本可执行权限
chmod +x build.sh
# 执行脚本
./build.sh 

build.sh 脚本内容:

docker stop redis

docker rm redis

docker run -itd \
--restart=always \
--name redis \
-p 6379:6379 \
redis \
--requirepass "xxxxxx"

说明:
用户密码请自行设置;

脚本执行日志:

[root@VM-8-9-centos redis]# ./build.sh 
Error response from daemon: No such container: redis
Error: No such container: redis
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
e9995326b091: Already exists 
f2cd78d6f24c: Pull complete 
8f3614d34c89: Pull complete 
697fd51ec515: Pull complete 
a554cf50a327: Pull complete 
66f93c02e79c: Pull complete 
Digest: sha256:aeed51f49a6355df0cb2c1039ae3d2d70d882be3f48bde75cd24045aa2348e88

猜你喜欢

转载自blog.csdn.net/lijiewen2017/article/details/127719166