1 阿里云服务器项目部署-单机部署 docker-compose
1.1 搭建背景
服务器 阿里云服务器
前端 vue
后端 springboot
服务 redis 、nginx、minio 都做单机模式部署,不做集群部署
博客内容参考了其他博文,会贴出来
1.2 <重要>端口开放前提说明
任何开放的端口都需要先在阿里云控制台进行开放
1.2 docker搭建
两种方式安装
1、yum方式安装docker,我用的是这个
2、采用源码包方式安装,一般内网部署会用到,这个我不会
官方开发博客: https://docs.docker.com/engine/install/centos/
参考博文:https://blog.csdn.net/qq_42971035/article/details/121733265
操作步骤
# 1.卸载旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 如有需要,可以安装gcc
yum -y install gcc
# 以及gcc-c++
yum -y install gcc-c++
# 2.需要的安装包
sudo yum install -y yum-utils
# 3.设置镜像仓库
sudo yum-config-manager \
--add-repo \
# 默认是国外的,不要使用
https://download.docker.com/linux/centos/docker-ce.repo
# 建议使用阿里云的镜像,十分快
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引(安装前的工作,非必须)
yum makecache fast
# yum makecache: error: argument timer: invalid choice: 'fast' (choose from 'timer')
# 安装报错了,yum makecache fast是centOS7的命令, 不使用8,可以直接使用
yum makecache # 或者
dnf makecache
# 4.安装docker docker-ce:社区版的,docker-ee:企业版的
sudo yum install docker-ce docker-ce-cli containerd.io
# 5.启动docker
systemctl start docker
# 6.查看docker版本
docker version # 或者
sudo docker version
# 7.测试Hello World
docker run hello-world # 或者
sudo docker run hello-world
当出现"Hello from Docker!”时,代表我们镜像安装成功。
# 8.查看下载的hello-world镜像
docker images #或者
sudo docker images
此时会有对应的镜像显示:
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
到了这里才真正代表着docker安装成功并成功拉取对应的镜像。
如果需要卸载docker的话:
# 1.卸载docker
yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker的默认工作路径
1.3 docker-compose搭建
也可以不用docker-compose 管理多个容器,自己选择
需要从github上下载docker-compose二进制文件安装
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-
uname -s
-uname -m
-o /usr/local/bin/docker-compose
这个命令是用于从 GitHub 上下载 Docker Compose 的二进制文件,并将其保存到 /usr/local/bin/docker-compose
路径下。
下面是对该命令的解释:
curl
:一个用于在命令行中进行网络请求的工具。它可以用于从远程服务器下载文件。-L
:在下载过程中,如果服务器返回重定向(HTTP 3xx 响应),则自动跟随重定向。https://github.com/docker/compose/releases/download/1.16.1/docker-compose-
uname -s-
uname -m``:这部分是要下载的文件的 URL。其中,uname -s
返回当前操作系统的名称,uname -m
返回当前机器的架构。这样,URL 就会根据操作系统和机器架构自动选择相应的文件进行下载。-o /usr/local/bin/docker-compose
:指定下载的文件保存的路径和文件名。在这里,下载的文件将被保存为/usr/local/bin/docker-compose
。
该命令的目的是将 Docker Compose 的二进制文件下载到你的系统中,以便你可以在命令行中直接使用 docker-compose
命令来管理 Docker 容器。完成下载后,可能需要给下载的文件添加可执行权限,才能在命令行中正常使用。例如,可以执行以下命令:
sudo chmod +x /usr/local/bin/docker-compose
请注意,该命令需要在具有适当权限的用户或使用管理员(root)权限下运行,以保证文件可以被保存到 /usr/local/bin/
目录中。
查看docker-compose版本,是否安装完成
[root@iZbp1ao8rgk3c56ynu2aliZ /]# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
以下的服务 我都安装在docker目录下了
1.3 mysql搭建
参考博客:https://blog.csdn.net/qq_34383510/article/details/130902638
1.3.1创建目录
-- 在root目录下创建docker目录
mkdir docker
-- 在docker目录下创建mysql目录
cd /docker
mkdir mysql
1.3.2创建docker-compose.yml
在docker目录下执行 vim docker-compose.yml
输入内容如下:
version: '3'
services:
# mysql容器 - Mysql container
mysql: # 这里mysql是服务名
# 容器名
container_name: container-mysql
# 指定了容器的网络模式为桥接模式
network_mode: bridge
environment:
# 时区上海 - Time zone Shanghai (Change if needed)
TZ: Asia/Shanghai
# root 密码 - root password
MYSQL_ROOT_PASSWORD: 你的密码
#镜像
image: mysql/mysql-server:8.0.28
# 指定了容器停止后总是重新启动
restart: always
# 端口 定义了容器的端口映射,将容器内的 MySQL 服务的 3306 端口映射到主机的 13306 端口
ports:
- 13306:3306
# 数据挂载 - Data mounting
volumes:
# 将主机上的 /docker/mysql/data 目录挂载到容器内的 /var/lib/mysql 目录。这样做的目的是将 MySQL 数据目录与主机上的目录进行映射,使得数据在容器重启或删除后不会丢失
- /docker/mysql/data:/var/lib/mysql
# 将主机上的 /docker/mysql/conf/my.cnf 文件挂载到容器内的 /etc/my.cnf 文件。这样做的目的是将 MySQL 的配置文件与主机上的配置文件进行映射,以便在容器启动时加载自定义的 MySQL 配置。
- /docker/mysql/conf/my.cnf:/etc/my.cnf
# 将主机上的 /docker/mysql/log 目录挂载到容器内的 /var/log/mysql 目录。这样做的目的是将 MySQL 的日志文件与主机上的目录进行映射,以便在容器运行时可以方便地查看 MySQL 的日志信息。
- /docker/mysql/log:/var/log/mysql
# 将主机上的时间配置文件 /etc/localtime 挂载到容器内的 /etc/localtime 文件,并设置为只读模式。这样做的目的是让容器内的时间与主机上的时间保持一致,以避免时间不一致可能带来的问题。
- /etc/localtime:/etc/localtime:ro
ports:
- 13306:3306
定义了容器的端口映射,将容器内的 MySQL 服务的 3306 端口映射到主机的 13306 端口,那么应该如最上面所说,在阿里云开放13306端口,在本地连接时,也应该用 公网ip:13306 连接服务器上的mysql,我自己嫌麻烦,用的都是3306
ports:
- 3306:3306
执行命令启动:docker-compose up -d
或者 :docker-compose up
docker-compose up -d
: 使用-d
参数,表示以“后台模式”(detached mode)启动容器。这意味着容器将在后台运行,并且你可以继续使用终端窗口进行其他操作,而不会被容器的输出所阻塞。这在生产环境或需要长期运行的服务中很常见。docker-compose up
: 没有-d
参数,表示以“前台模式”(foreground mode)启动容器。容器将在当前终端窗口中运行,并且你将看到容器的输出信息。如果你使用Ctrl + C
组合键来终止命令,容器也将停止运行。这在开发和调试阶段通常更为方便,因为你可以立即看到容器的输出信息和错误提示。
如果你想让容器在后台运行,并且不希望终端被容器的输出所阻塞,可以使用 docker-compose up -d
。如果你希望在当前终端中看到容器的输出信息,并且方便地终止容器的运行,可以使用 docker-compose up
。
如果 执行docker-compose up -d
启动,再输入 docker ps
查看启动的镜像
如果有mysql,那表示启动成功
关闭所有服务 docker-compose down
关闭某个服务 docker-compose stop 服务名
服务名不是容器名
1.3.3 mysql远程访问
本地打开mysql软件,用公网ip:开放的端口 密码 远程连接
连接失败解决方法
执行命令docker ps查询启动的镜像
docker exec -it 容器id bin/bash 进入容器
mysql -u root -p登录mysql
use mysql;切换数据库
update user set host='%' where user='root';
grant all privileges on *.* to 'root'@'%';
flush privileges;
设置成功后,重新连接成功。
1.4 redis搭建
参考博客:https://blog.csdn.net/qq_34383510/article/details/131352344
在docker目录下创建redis目录
cd /docker
mkdir redis
在redis目录下创建data目录
cd redis
mkdir data
创建redis.conf
在redis
目录下,创建redis.conf
配置文件
主要修改以下几项配置
# 开启密码验证(可选),要是注释掉就不用密码登录了
# requirepass 123456
requirepass 123456
# 允许redis外地连接,需要注释掉绑定的IP
# bind 127.0.0.1
# 关闭保护模式 当 protected-mode 设置为 yes(默认值)时,Redis 服务器只允许通过本地环回地址(127.0.0.1)进行访问,并拒绝来自外部网络的连接请求。这样可以确保 Redis 服务器只能被本地应用程序访问,我们需要远程访问,所以修改为no
protected-mode no
# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
# 开启redis数据持久化, (可选)
appendonly yes
完成配置
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#bind 127.0.0.1
protected-mode no
port 6379
tcp-backlog 511
requirepass 123456
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
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-time-limit 5000
slowlog-max-len 128
notify-keyspace-events ""
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
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
打开docker-compose.yml
输入以下内容 复制过去注意缩进,和 mysql是同级
#redis容器 - Redis container
redis:
image: redis:6.2.5
container_name: container-redis
ports:
- 6379:6379
environment:
# 时区上海 - Time zone Shanghai (Change if needed)
TZ: Asia/Shanghai
volumes:
# 数据文件 - data files
- /docker/redis/data:/data:rw
- /docker/redis/redis.conf:/usr/local/etc/redis/redis.conf
- /docker/redis/data/logs:/logs
command: "redis-server /usr/local/etc/redis/redis.conf --requirepass 123456 --appendonly yes"
privileged: true
restart: always
network_mode: bridge
要去阿里云开放6379端口
再次执行docker-compose up -d
,成功启动redis
1.5 minio搭建
打开docker-compose.yml
输入以下内容 复制过去注意缩进,和 mysql是同级 没有指定minio版本
minio:
image: minio/minio
hostname: "minio"
ports:
- 9000:9000 # api 端口
- 9001:9001 # 控制台端口
environment:
MINIO_ACCESS_KEY: admin #管理后台用户名
MINIO_SECRET_KEY: admin123 #管理后台密码,最小8个字符
volumes:
- /docker/minio/data:/data #映射当前目录下的data目录至容器内/data目录
- /docker/minio/config:/root/.minio/ #映射配置目录
command: server --console-address ':9001' /data #指定容器中的目录 /data
privileged: true
restart: always
要去阿里云开放9000端口
再次执行docker-compose up -d
,成功启动minio
1.6 nginx搭建
参考博客:https://blog.csdn.net/PyongSen/article/details/123054599
# 切换目录
cd /docker
# 创建nginx文件交
mkdir nginx
创建nginx.conf
#user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8083; # 前端的端口
server_name localhost;
location / {
# 这里的root 是下面的docker-compose.yml实现了前端网页的挂载
root /usr/share/nginx/html;
# nginx 报404需要加下面这行
try_files $uri $uri/ /index.html last;
index index.html index.htm;
#nginx 报405加下面这行
error_page 405 =200 http://$host$request_uri;
}
#nginx 报 连接错误 、没有数据(We’re sorry but “XXX” doesn’t work...放开下面的注释
# 跨域
location ^~/api/ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Credentials true;
proxy_set_header X-NginX-Proxy true;
#rewrite ^(.*)api(.*)$ $1/$2; break;
proxy_pass http://公网ip:后端端口/;
#rewrite ^/api/(.*) /$1 break;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
打开docker-compose.yml
输入以下内容 复制过去注意缩进,和 mysql是同级
nginx: # 服务名称,用户自定义
container_name: container-nginx
image: nginx:latest # 镜像版本
ports:
- 8083:8083 # 前端项目暴露的端口
restart: always #docker启动的时候会自动启动这个服务
#network_mode: host #不在对应某个端口,我认为的解释是对应所有端口了
volumes: # 挂载
# html和nginx.conf 挂载
# 将宿主机上的 /docker/nginx/logs 目录挂载到容器内的 /var/log/nginx 目录。这样做的目的是将 Nginx 的日志文件存储在宿主机上,以便于日志的管理和查看。
- /docker/nginx/logs:/var/log/nginx
# 将宿主机上的 /docker/nginx/html 目录挂载到容器内的 /usr/share/nginx/html 目录。这样做的目的是将网站的静态文件存储在宿主机上,从而实现网站内容的持久化和管理。
- /docker/nginx/html:/usr/share/nginx/html
# 将宿主机上的 /docker/nginx/nginx.conf 文件挂载到容器内的 /etc/nginx/nginx.conf 文件。这样做的目的是将 Nginx 的配置文件存储在宿主机上,并使之对 Nginx 服务产生影响,从而实现配置的持久化和灵活性
- /docker/nginx/nginx.conf:/etc/nginx/nginx.conf
privileged: true # 这个必须要,解决nginx的文件调用的权限问题
先不用启动,等前后端全部署好一起启动
1.7 jdk搭建
参考博客:https://blog.csdn.net/m0_49762804/article/details/132362282
下载地址:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
下载完上传,放在哪个文件交都行,我嫌麻烦,统一放在docker文件夹里
cd /docker
madir java
上传文件到 /docker/java
tar -zxvf jdk-8u381-linux-x64.tar.gz
接下来配置环境变量
vim命令打开/etc/profile
vim /etc/profile
添加下面内容
#Set Java_Environment
export JAVA_HOME=/docker/java/jdk1.8.0_381
export JRE_HOME=/docker/java/jdk1.8.0_381/jre
export CLASSPATH=.:$JAVA_HOME/lib$:JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin/$JAVA_HOME:$PATH
退出编辑模式
按 esc 按键
英文输入法状态下
输入 :wq
按回车
加载环境变量
source /etc/profile
验证是否安装成功
java -version
1.8 前端部署
前端是 vue 项目
在控制台 输入 npm run build
在 /docker/nginx/
目录下创建 html文件交
cd /docker/nginx
mkdir html
前端打包好之后,会创建dist文件夹,将该文件夹下的文件都上传到 /docker/nginx/html
路径下,这样前端就配置好了
前端部署好,这时候就能启动docker-compose了
docker-compose up -d
1.9 后端部署
我是把后端和服务分成了两个docker-compose.yml,可以不用这么做
一个yml用来启动服务,一个用来启动jar包
cd /docker
mkdir app
后端架包上传到该路径,创建Dockfile文件,该文件没有后缀名
Dockfile内容
#使用java 8 版本
FROM openjdk:8
# 将本目录下的park-0.0.1-SNAPSHOT.jar 复制到 /docker/app/,并重命名为 park-jar.jar
COPY park-0.0.1-SNAPSHOT.jar /docker/app/park-jar.jar
WORKDIR /docker/app
#对外暴露的端口
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/docker/app/park-jar.jar" ]
创建docker-dompose.yml 编写内容
version: '3'
services:
park-jar:
container_name: container-park-jar
restart: always
image: park-jar
build: # 表示以当前目录下的Dockerfile开始构建镜像
context: . #Dockerfile 所在目录
dockerfile: Dockerfile
ports:
- 8081:8081 #后端项目暴露的端口
privileged: true
启动后端
docker-compose up -d
然后再浏览器地址栏输入 公网ip:前端端口,就能正常访问项目了。
结束。
Ub-1712815960265)]
后端架包上传到该路径,创建Dockerfile文件,该文件没有后缀名
Dockerfile内容
#使用java 8 版本
FROM openjdk:8
# 将本目录下的park-0.0.1-SNAPSHOT.jar 复制到 /docker/app/,并重命名为 park-jar.jar
COPY park-0.0.1-SNAPSHOT.jar /docker/app/park-jar.jar
WORKDIR /docker/app
#对外暴露的端口
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/docker/app/park-jar.jar" ]
创建docker-dompose.yml 编写内容
version: '3'
services:
park-jar:
container_name: container-park-jar
restart: always
image: park-jar
build: # 表示以当前目录下的Dockerfile开始构建镜像
context: . #Dockerfile 所在目录
dockerfile: Dockerfile
ports:
- 8081:8081 #后端项目暴露的端口
privileged: true
启动后端
docker-compose up -d
docker ps
所有的镜像都在这里了
然后再浏览器地址栏输入 公网ip:前端端口,就能正常访问项目了。
结束。