Docker 部署 详细全过程 附代码
2020-03-28 01:54:01 7662
Docker 部署本站 全过程
环境:CentOS7.6
1. 安装Docker
其他版本CentOS可以参考这个https://help.aliyun.com/document_detail/187598.html
查看本机内核版本,内核版本需高于 3.10
uname -r
确保 yum 包最新
yum update
安装相关软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker
install docker-ce
配置阿里云镜像加速docker镜像下载
参考这个
https://help.aliyun.com/document_detail/60750.html
启动docker
systemctl start docker
验证安装
docker version
2. 创建自定义网络
docker 默认是使用bridge,容器每次启动,IP都会发生变动,不利于维护管理, 172.17.0.0/16
是docker默认网段
docker network create --subnet=172.18.0.0/16 blognet
3. 创建容器
注意所有中间件都需呀设置密码
如果在公网服务器部署, 注意配置防火墙/安全组
3.1 启动mysql容器
拉取mysql镜像
docker pull centos/mysql-56-centos7
创建并运行容器,123456
是 root
密码, --network blognet --ip 172.18.0.2
使用之前创建的网络, 172.18.0.1
是网关
docker run --name mysql56 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --network blognet --ip 172.18.0.2 -d centos/mysql-56-centos7
测试连接mysql,如:命令行或navicat,连接上即成功创建mysql容器,随后进行建库建表操作,blog-sql文件
3.2 启动redis容器
docker pull redis
以配置文件启动,这有现成的 链接:https://pan.baidu.com/s/1ptvnDPVdqfwgfnpvYHVnJQ 提取码:7h82
/root/redis/redis.conf 中daemonize=NO。非后台模式,如果为YES 会的导致 redis 无法启动,因为后台会导致docker无任务可做而退出。
-v /root/redis/data:/data 容器 /data 映射到宿主机 /root/redis/data
-d redis 后台模式启动 redis
redis-server /etc/redis/redis.conf redis 将以 /etc/redis/redis.conf 为配置文件启动
--appendonly yes 开启redis 持久化
docker run -p 6379:6379 --network blognet --ip 172.18.0.5 --name redis -v /root/redis/redis.conf:/etc/redis/redis.conf -v /root/redis/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
3.3 启动rabbitmq容器
这个是带web管理页面的,启动后访问ip:15672
docker pull rabbitmq:management
docker run -di --name=rabbitmq --network blognet --ip 172.18.0.6 -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq:management
3.4 启动mongo容器
docker pull mongo
docker run --network blognet --ip 172.18.0.7 -itd --name mongo -p 27017:27017 mongo --auth
进入容器
docker exec -it mongo mongo admin
mongo5.0以上使用
docker exec -it mongo mongosh admin
创建全局用户
db.createUser({ user:'admin', pwd:'123456', roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
创建用户以及关联数据库
db.createUser({ user: 'log', pwd: '123456', roles: [ { role: "readWrite", db: "log" } ] });
use log
3.5 启动后端容器
创建maven工程,导入源码,更改配置文件
spring:
datasource:
###url/username/password都需要更改
url: jdbc:mysql://192.168.43.150:3306/blog?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123456
driverClassName: com.mysql.jdbc.Driver
druid:
initial-size: 5
max-active: 20
min-idle: 5
max-wait: 60000
validation-query: SELECT 1
validation-query-timeout: 2000
####找不到处理器直接抛出异常
mvc:
throw-exception-if-no-handler-found: true
####是否为工程中的资源文件建立映射
resources:
add-mappings: false
###邮箱配置
mail:
host: smtp.qq.com
port: 465
username: ***@qq.com
password: ***
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
### 如果使用qq邮箱,且部署在阿里云,需要启动ssl,且端口配置为465
# ssl:
# enable: true
data:
mongodb:
username: 'log'
password: '123456'
host: 172.18.0.7
port: 27017
database: log
field-naming-strategy: org.springframework.data.mapping.model.SnakeCaseFieldNamingStrategy
###Redis
redis:
host: 172.18.0.5
port: 6379
timeout: 1000
jedis:
pool:
max-active: 10
max-idle: 8
min-idle: 2
max-wait: 100
###RabbitMQ
rabbitmq:
host: 172.18.0.6
port: 5672
username: guest
password: guest
mybatis:
###数据库模型对象
type-aliases-package: com.zzx.model.pojo
mapper-locations: mapper/*.xml
###打印sql
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
###是否启用swagger
swagger:
enable: false
logging:
level:
org.springframework.security: info
root: info
path: e:/springboot-blog
### jwt
jwt:
###过期时间 s数432000 5天
time: 432000
###安全密钥
secret: "BlogSecret"
###token前缀
prefix: "Bearer "
###http头key
header: "Authorization"
###图片上传配置
upload:
#静态资源对外暴露的访问路径 一个* 代表只匹配该路径下的一级子路径
staticAccessPath: /img/*
#文件上传目录
uploadFolder: /root/images
#文件夹层数
layerCount: 2
#文件夹内单位数
folderSize: 16
###站点介绍
site:
introduction: "分享知识"
server:
port: 8001
打包项目,jar打包在target文件夹下,blog-1.0.jar
mvn clean package
编写dockerfile
#基础镜像jdk
FROM frolvlad/alpine-oraclejdk8:slim
#挂载的路径
VOLUME /tmp
#将jar打入镜像之中
ADD blog-1.0.jar app.jar
#容器向外暴露的端口
EXPOSE 8001
#入口命令,执行jar
ENTRYPOINT ["java","-jar","/app.jar"]
将dockerfile与blog-1.0.jar放在同级文件夹,
docker build -t springboot-blog .
打包完后查看一下,IMAGE ID 会不一样,正常
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot-blog latest 568f1a418c79 3 hours ago 208MB
启动后端容器
docker run --name springboot-blog -p 8001:8001 --network blognet --ip 172.18.0.3 -d springboot-blog
浏览器访问centos的ip+端口,例:192.168.125.100:8001,出现如下代码,即说明启动成功
{
"code":404,
"message":"接口不存在",
"data":null
}
3.6 启动nginx容器
拉取nginx镜像
docker pull nginx
创建并启动nginx容器
docker run --name=nginx -p 80:80 --network blognet --ip 172.18.0.4 -d docker.io/nginx
default.conf
server {
listen 80;
server_name localhost;
#访问vue项目
location / {
root /usr/share/nginx/html;
index index.html;
}
#将api转发到后端
location /api/ {
proxy_pass http://172.18.0.3:8001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#转发图片请求到后端
location /img/ {
proxy_pass http://172.18.0.3:8001/img/;
}
}
将配置文件拷贝至容器内
docker cp default.conf nginx:/etc/nginx/conf.d/default.conf
前端工程,下载好,cmd 切换目录到vue工程内 安装依赖
npm install
打包
npm run build
将打包生成的dist
文件夹改名为html
,拷贝到nginx容器
docker cp html nginx:/usr/share/nginx
重启nginx容器
docker restart nginx
打开浏览器,输入centos ip
如192.168.125.100
, 看到了空空的首页 登录 账号admin
密码1
,登录成功,即docker部署完成