文章目录

  • 常用命令
  • 部署方式介绍
  • 方式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

部署方式介绍

不同容器间需要网络通信,可以使用如下两种方式实现

  1. 宿主机与容器桥接,则容器间通信都是用宿主机的ip+映射到宿主机的端口通信即可
  2. 使用docker-compose

方式1:使用桥接网络

  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"]
  1. 制作MySQLDocker镜像
    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