docker项目部署

简介

首先通过maven工具将微服务项目进行打包,然后通过Dockerfile将微服务jar包构建成docker镜像,配置nginx、redis,最后通过docker-compose工具实现对Docker容器集群的快速编排,微服务项目进行一键部署。

IDEA

修改配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
spring:
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://mysql:3306/reggie?characterEncoding=UTF-8&useSSL=false # 在docker中使用服务名即可
username: root
password: 123456

# redis相关配置
redis:
host: redis # 在docker中使用服务名即可
port: 6379
database: 0
password: 123456
jedis: # redis连接池配置
pool:
max-active: 8 # 最大连接数
max-wait: 1ms # 连接池最大阻塞等待时间
max-idle: 4 # 连接池中最大空闲连接
min-idle: 0 # 连接池中最小空闲连接
cache:
redis:
time-to-live: 1800000 # 设置缓存过期时间

# 文件目录
reggie:
path: /usr/local/source/imgDir/

注:将IP改为docker-composes.yml配置的服务名。

通过maven将微服务项目打包成jar:

服务器

在/root目录下创建reggie目录,将微服务jar包上传到该目录下。

服务器需要放行6379、3306、8080端口。

Dockerfile

将微服务jar包构建成新镜像。

第一步:编写Dockerfile,上传到与微服务jar包相同目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER lrw
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
#VOLUME /tmp
# 将jar包添加到容器中并更名为lrw_docker.jar
ADD reggie_take_out-1.0-SNAPSHOT.jar reggie_docker.jar
# 运行jar包
RUN bash -c 'touch /reggie_docker.jar'
ENTRYPOINT ["java","-jar","/reggie_docker.jar"]
#暴露8080端口(与微服务yaml配置一致)
EXPOSE 8080

第二步:构建新镜像:docker build -t reggie_docker:1.0 .

nginx

静态资源项目部署,配置反向代理。

第一步:创建/lrwuse/nginx目录,并在nginx中创建html目录,将前端项目打包资源拷贝到html目录。

第二步:拷贝 nginx.conf 配置文件到nginx目录下。

第三步:修改 nginx.conf 配置文件。

注意:

  • root配置需要与容器中的静态资源路径一致,反向代理proxy_pass可以使用服务名。
  • 这些配置和文件后面会通过docker的容器数据卷挂载到容器实例里面。

redis

配置redis缓存。

第一步:在/lrwuse目录下创建redis目录,拷贝 redis.conf 配置文件到该目录下。

第二步:修改redis.conf 配置文件。

设置远程连接及密码:

  • vim redis.conf
  • 找到requirepass foobared,这里被注释,说明不需要密码,将注释去掉,foobared改为自己的密码
  • 找到bind 127.0.0.1,这里表面只允许本机连接,注释即可支持远程连接

docker-compose

对Docker容器集群实现快速编排,微服务项目一键部署。

第一步:编写 docker-compose.yml 文件,将文件上传到reggie目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
version: "3"

services:
nginx: # 服务名
image: nginx:latest # 镜像名
ports:
- "80:80" # 端口映射
volumes:
- /lrwuse/nginx/html:/usr/share/nginx/html
- /lrwuse/nginx/nginx.conf:/etc/nginx/nginx.conf # 容器数据卷挂载
privileged: true
networks:
- reggie_net # 网络模式

reggie:
image: reggie_docker:1.0 # 镜像名
container_name: reggie # 容器名
ports:
- "8080:8080" # 端口映射
volumes:
- /lrwuse/reggie:/data # 容器数据卷挂载
- /lrwuse/reggie/imgDir:/usr/local/source/imgDir
networks:
- reggie_net # 网络模式
depends_on: # 启动依赖(先后顺序)
- redis
- mysql

redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /lrwuse/redis/redis.conf:/etc/redis/redis.conf
- /lrwuse/redis/data:/data
networks:
- reggie_net
command: redis-server /etc/redis/redis.conf

mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456' # root密码
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'test' # 初始化启动时要创建的数据库的名称
MYSQL_USER: 'lrw'
MYSQL_PASSWORD: 'lrw123'
ports:
- "3306:3306"
volumes:
- /lrwuse/mysql/log:/var/log/mysql
- /lrwuse/mysql/data:/var/lib/mysql
- /lrwuse/mysql/conf:/etc/mysql/conf.d
networks:
- reggie_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

networks: # 创建网络
reggie_net:

注意:nginx与redis容器数据卷挂载需要与本机创建的配置文件等目录一致。

第二步:将imgDir图片文件上传到/lrwuse/reggie目录下。

通过docker的容器数据卷挂载到容器实例中。

第三步:执行docker-compose。

执行命令:

  • 检查文件是否有误:docker-compose config -q
  • 执行容器编排:docker-compose up -d

远程连接docker容器mysql,建库建表。

第一步:通过服务器ip、端口、数据库用户名和密码远程连接mysql。

第二步:配置mysql字符编码。

配置mysql字符编码:

  • 在宿主机挂载的/lrwuse/mysql/conf文件夹的新建my.cnf:vim my.cnf
  • 编辑 my.cnf 添加:
1
2
3
4
5
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
  • 查看mysql字符编码:SHOW VARIABLES LIKE ‘character%’;

第三步:建库建表。

建库建表:

  • 创建reggie数据库,指定字符编码为utf8
  • 执行reggie.sql文件,创建数据库表。