文章目录
- 常用命令
- 部署方式介绍
- 方式1:使用桥接网络
- 方式2:docker-compose
常用命令
- docker build -t 镜像名称[:版本] dockerfile位置
如:docker build -t test-project ./ - 查所有镜像 docker images
- 删除镜像 docker rm 镜像id
- 部署镜像为容器 docker run
参数:
- -d 使容器后台运行
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -it:以交互模式运行,直接进入容器的终端
- -p:端口映射,用法->宿主机端口:容器端口
- –name:给容器指定一个名称
- -v:挂载目录,用法->宿主机目录:容器目录
- –env:添加环境变量,用法-> 环境变量key=环境变量值
如:docker run -p 9988:9999 --name springboot-neat-dish-source --env file.uploadPath="/usr/src/neat-dish-source-demo/img/" -v ~/Desktop/img/:/usr/src/neat-dish-source-demo/img/ -d neat-dish-source[:latest]
- 查看运行中的容器 docker ps
- 查看所有容器 docker ps -a
- 查看容器的日志 docker logs 容器id
- 查看容器详情 docker inspect 容器id
部署方式介绍
不同容器间需要网络通信,可以使用如下两种方式实现
- 宿主机与容器桥接,则容器间通信都是用宿主机的ip+映射到宿主机的端口通信即可
- 使用docker-compose
方式1:使用桥接网络
- 在springboot项目中编写Dockerfile文件将应用打包成Docker镜像
application.yaml
文件配置
host
的地址不能使用127.0.0.1,因为当容器运行时,127.0.0.1指的是当前的容器
spring:
datasource:
host: 127.0.0.1
url: jdbc:mysql://${spring.datasource.host}:3306/neat-dish-source-demo?characterEncoding=utf-8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
Dockerfile
配置文件
FROM java:8
# 指定维护者的名字
MAINTAINER ZhangXing
ENV PROJECT=neat-dish-source-demo
# 将jar包添加到容器中
ADD ./target/$PROJECT-*.jar /usr/src/$PROJECT/app.jar
ENTRYPOINT ["sh", "-c", "java -jar /usr/src/$PROJECT/app.jar"]
- 制作
MySQL
的Docker
镜像MySQL
需要配置文件、保存数据的目录,所以我们在宿主机上创建配置文件以及数据的目录和一个初始化SpringBoot项目的数据库脚本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IMDccbaZ-1619451960087)(…/…/Library/Application Support/typora-user-images/image-20210426222109928.png)]
my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[mysql]
default-character-set=utf8mb4
![image-20210426223833982](../../Library/Application Support/typora-user-images/image-20210426223833982.png)
> 为了将Springboot项目的网络与mysql的网络在docker容器中连接起来,我们创建一个桥接网络
```shell
docker network create --driver bridge springboot_mysql_bridge
> 拉取mysql镜像
```shell
docker pull mysql:8.0
```
> 运行mysql容器
>
> -p:端口映射(宿主机端口:容器端口)
> --name:启动后的容器名称
> --network:连接到网络
> -v:第一个 -v 为映射配置文件(宿主机目录:容器目录)
> -v:第二个 -v 为映射数据目录,相当于把容器中的数据备份到宿主机指定的目录(宿主机目录:容器目录)
-v:第三个 -v 为初始化 sql 目录(宿主机目录:容器目录)
-e MYSQL_ROOT_PASSWORD=123456:设置 root 连接密码
映射实际上是把宿主机和容器相连通
容器中映射目录的文件发生改变时,宿主机中映射目录的文件也发生变化
-d:后台启动
docker run -p 3307:3306 --name mysql-neat-dish-source --network springboot_mysql_bridge -v /Users/zhangxing/software/docker/neat-dish-source-mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /Users/zhangxing/software/docker/neat-dish-source-mysql/data/:/var/lib/mysql/ -v /Users/zhangxing/software/docker/neat-dish-source-mysql/sql/:/docker-entrypoint-initdb.d/ -e MYSQL_ROOT_PASSWORD=12345678 -d mysql
> 启动后台应用
>
> -p: 指定端口(宿主机端口:容器端口)
>
> --name:指定容器名称
>
> --env:添加环境变量,修改application.yaml中的参数,修改文件在容器中保存的位置
>
> -v:将文件在容器中保存的位置挂在到我们宿主机上来(宿主机目录:容器目录)
>
> -d:指定为后台运行
>
> neat-dish-source:镜像的名称
```shell
docker run -p 9988:9999 --name springboot-neat-dish-source --env file.uploadPath="/usr/src/neat-dish-source-demo/img/" -v ~/Desktop/img/:/usr/src/neat-dish-source-demo/img/ -d neat-dish-source
```
方式2:docker-compose
改造springboot项目的application.yaml文件,动态的读取mysql的ip地址
server:
port: 9999
servlet:
session:
timeout: 600m
spring:
application:
name: neat-dish-source-demo
servlet:
multipart:
max-file-size: 120MB
max-request-size: 120MB
datasource:
username: root
password: ${MYSQL_ROOT_PASSWORD}
url: jdbc:mysql://mysql-host:3306/neat-dish-source-demo?characterEncoding=utf-8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 8
min-idle: 1
max-active: 20
max-wait: 60000
time-between-eviction-runsMillis: 60000
min-evictable-idle-timeMillis: 300000
validation-query: select 'x' FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-open-prepared-statements: 20
max-pool-prepared-statement-per-connection-size: 20
filters: stat
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
use-global-data-source-stat: true
stat-view-servlet.url-pattern: /druid/*
stat-view-servlet.allow: 127.0.0.1
stat-view-servlet.login-username: admin
stat-view-servlet.login-password: SclfNo1
thymeleaf:
cache: false
mode: LEGACYHTML5
prefix: "classpath:/templates/"
suffix: ".html"
enabled: true
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
file:
uploadPath: ${WORKSPACE}/img/
mappingPath: /file/
先改造Dockerfile
# 通过docker hub的java8镜像构建当前镜像
FROM java:8
# 指定维护者的名字
MAINTAINER zhangxing
# 将项目名称加入环境变量
ENV PROJECT=neat-dish-source
# 将项目的工作路径加入环境变量
ENV WORKSPACE=/usr/src/$PROJECT
# 将jar包添加到容器中的工作目录下
ADD ./target/$PROJECT-*.jar $WORKSPACE/app.jar
ENTRYPOINT ["sh", "-c", "java -jar $WORKSPACE/app.jar"]
#ENTRYPOINT ["java -jar /usr/src/$PROJECT/app.jar"]
编写docker-compose.yaml
# 指定 yml 依从的 compose 哪个版本制定的,如果docker-compose版本为1.2xxx,则使用version3即可
version: "3"
# 服务节点,描述需要哪些服务
services:
# 服务取名
neat-dish-source:
# 上述的服务,通过哪一个镜像构建
image: neat-dish-source:1.0.0
# 该容器的端口暴露信息
ports:
- "8888:9999"
# 该容器的环境参数,通过上面的springboot的application.yaml文件可以看到,数据库的密码可以通过环境变量的方式来覆盖
environment:
spring.datasource.password: "12345678"
# 将上述Dockerfile中的文件上传地址的路径挂载到宿主机上
volumes:
- /Users/zhangxing/Desktop/img/:/usr/src/neat-dish-source/img/
# 该容器启动依赖服务名为mysql的容器,即下面的mysql服务
depends_on:
- mysql
# 添加关联,[服务名]:[别名],目的是为了将服务mysql以hosts的方式注入到服务neat-dish-source的容器中,则我们的springboot项目连接mysql的url,可以用动态的方式解析hosts拿到mysql服务的ip地址
links:
- mysql:mysql-host
# redis:
# image: redis:latest
# restart: always
# ports:
# - "6389:6379"
# volumes:
# - /redis/redis.conf:/etc/redis/redis.conf
# command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: "12345678"
MYSQL_ROOT_HOST: '%'
ports:
- "3307:3306"
volumes:
- "/Users/zhangxing/software/docker/neat-dish-source-mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
- "/Users/zhangxing/software/docker/neat-dish-source-mysql/data:/var/lib/mysql"
- "/Users/zhangxing/software/docker/neat-dish-source-mysql/sql:/docker-entrypoint-initdb.d"
通过上述的Dockerfile构建我们springboot项目的镜像
docker build -t neat-dish-source:1.0.0 ./
后台启动方式以依赖顺序启动服务
docker-compose up -d