章节目录
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能够正常连接
- docker宿主机连接通过:
jdbc:mysql://localhost:3306
- 因为防火墙并没有开放宿主机的 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