Docker安装Mysql和Redis以及构建部署应用镜像

为了方便本地测试项目,为了方便开启新的环境,为了方便部署,打算本地利用Docker安装Mysql和Redis。html

搭建Springboot项目,编写Dockerfile,打包构建镜像。java

简单使用docker-compose启动服务。mysql

简述docker-compose和K8S。nginx

环境

系统:macgit

Docker Engine:19.03.8redis

Mysql:5.7,磁盘挂载目录:/Users/yclxiao/Program/volume/mysqlspring

Redis:5.0.8,磁盘挂载目录:/Users/yclxiao/Program/volume/redissql

安装Mysql-5.7

  1. 拉取官方镜像docker

    docker pull mysql:5.7
    复制代码
  2. 查看镜像库shell

    docker images
    复制代码
  3. 建立mysql的挂载的目录

    mkdir -p /Users/yclxiao/Program/volume/mysql/data /Users/yclxiao/Program/volume/mysql/conf /Users/yclxiao/Program/volume/mysql/logs 
    复制代码
  4. 建立cnf文件

    cd /Users/yclxiao/Program/volume/mysql/conf
    touch my.cnf
    复制代码
  5. 建立容器,将数据、日志、配置文件,映射到本机

    docker run -p 3306:3306 --name mysql -v /Users/yclxiao/Program/volume/mysql/conf:/etc/mysql/conf.d -v /Users/yclxiao/Program/volume/mysql/logs:/logs -v /Users/yclxiao/Program/volume/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootpwd -d mysql:5.7
    复制代码

    -d:后台运行容器

    -p:将容器的端口映射到本机的端口

    -v:将主机目录挂载到容器的目录

    -e:设置参数

  6. 启动容器

    docker start mysql
    复制代码

    docker run xxx 和 docker start xxx 区别?

    1. docker run:

      只有在第一次运行时使用,将镜像放到容器中,之后再次启动容器的时候,只须要使用docker start就能够了。

      docker run 至关于执行了2个命令:

      • docker create:将镜像放入到容器中
      • docker start:启动容器,变成运行中的容器
    2. docker start:

      启动已经存在的容器

    image-20200317162346126
  7. 用Navicat等工具测试是否能连上

    用户名:root

    密码:rootpwd

安装Redis-5.0.8

  1. 在宿主机挂载目录下新建redis相关目录

    /Users/yclxiao/Program/volume/redis/conf

    /Users/yclxiao/Program/volume/redis/data

  2. 在/Users/yclxiao/Program/volume/redis/conf下

    touch redis.conf
    复制代码
  3. 拉取官方镜像,查看镜像

    docker pull redis:5.0.8
    docker images
    复制代码
  4. 启动容器,redis:5.0.8镜像名称

    docker run -d --name redis -p 6379:6379 -v /Users/yclxiao/Program/volume/redis/conf/redis.conf:/redis.conf -v /Users/yclxiao/Program/volume/redis/data:/data redis:5.0.8 redis-server --appendonly yes
    复制代码

    -d:让容器运行在后台

    -p:前面是暴露出去的端口,后面是容器内部的服务端口

    -v:将宿主机目录挂载到容器的/data目录,使用:

    --name:此容器的别名

    --appendonly:启用数据持久化保存

    redis-server --appendonly yes:在容器执行redis-server启动命令,而且启动redis持久化配置

  5. 查看正在运行的容器

    docker ps
    复制代码

    image-20200317172236278

  6. RDM工具链接测试OK

Docker经常使用命令

docker search #从registry仓库搜索镜像

docker pull #从仓库下载镜像到本地

docker images #列出全部镜像

docker tag #为镜像起一个别名

docker rmi 镜像名 #删除某个镜像

docker rmi $(docker images -q) #删除全部镜像

docker push #将一个镜像push到registry仓库中

docker build -t <镜像名:版本号> . #构建进行,: .不可少

docker create #建立一个容器可是不启动它

docker run #建立并启动一个容器

docker start #启动一个中止状态的容器

docker ps -aq #列出全部容器的id

docker ps #列出正在运行的容器

docker ps -a #查看全部进程

docker stop 容器id #中止某个容器

docker rm 容器id #删除某个容器

docker stop $(docker ps -aq) #中止全部容器

docker rm $(docker ps -aq) #删除全部容器

docker kill #发送信号给容器,默认SIGKILL

docker exec #进入到容器里执行命令

docker inspect #深刻容器内部获取容器全部信息

编写Dockerfile

Dockerfile是docker构建镜像的基础,也是docker区别于其余容器的重要特征,正是有了Dockerfile,docker的自动化和可移植性才成为可能。

  • FROM,从一个基础镜像构建新的镜像

    FROM openjdk:8-jdk-alpine
    复制代码
  • MAINTAINER,维护者信息

    MAINTAINER yclxiao <yclxiao@163.com>
    复制代码
  • ENV,设置环境变量

    ENV TESTVAR 123
    复制代码
  • RUN,运行shell命令

    RUN xxxxxx
    复制代码
  • ADD,将外部文件拷贝到镜像里,src能够为url

    ADD  xxxxx  /data/xxxxxx
    复制代码
  • WORKDIR /path/to/workdir,设置工做目录

    WORKDIR /var/www
    复制代码
  • USER,设置用户ID

    USER nginx
    复制代码
  • VULUME<#dir>,设置volume,设置挂载卷

    VOLUME ['/data']
    复制代码
  • EXPOSE,暴露哪些端口

    EXPOSE 8080 8081
    复制代码
  • ENTRYPOINT ["executable","param1","param2"] 执行命令

    ENTRYPOINT ["/usr/sbin/nginx"]
    复制代码
  • CMD ["param1","param2"]

    CMD ["start"]
    复制代码

    docker建立、启动container时执行的命令,若是设置了ENTRYPOINT,则CMD将做为参数

示例:利用Dockerfile构建一个java应用的镜像

FROM openjdk:8-jdk-alpine
ENV TZ=Asia/Shanghai
#若是直接docker build命令打包镜像(非maven插件的形式),则须要加上这段变量
#ENV JAR_FILE=target/blog-dbpool-main-0.0.1-SNAPSHOT.jar
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone VOLUME /tmp #pom.xml中dockerfile插件定义的参数
ARG JAR_FILE
COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 复制代码

构建Java工程

搭建带有Dockerfile文件的Springboot工程,pom配置docker插件,构建镜像推送镜像,启动容器。

  1. 准备工程:

    搭建完毕的项目地址

  2. 配置dockerfile-maven-plugin插件,官方推荐使用dockerfile-maven-plugin,不建议使用docker-maven-plugin:

    参考这篇文章:Spotify官方推荐Maven插件构建Docker镜像

    本地maven的setting,在.m2文件夹里,注意必定要有servers,不然配置不生效

    <servers>
      <server>
        <id>docker.io</id>
        <username>yclxiao</username>
        <password>xxxxxx</password>
      </server>
    </servers>
    复制代码
  3. 构建镜像,推送仓库:

    • 直接在dockerfile目录下,执行docker命令:

      docker build -t yclxiao/blog-dbpool-main:0.0.1-SNAPSHOT .  
      docker push yclxiao/blog-dbpool-main:0.0.1-SNAPSHOT
      复制代码
    • 利用maven插件:

      mvn clean package dockerfile:build
      mvn clean package dockerfile:push
      复制代码
  4. 执行docker images,能够在本地仓库看到此镜像。

    查看dockerHub仓库https://hub.docker.com/,能够看到此镜像

  5. 建立启动容器:

    docker run -p 8080:8080 yclxiao/blog-dbpool-main:0.0.1-SNAPSHOT [-d]

  6. 本地docker启动mysql以后,访问OK:http://localhost:8080/swagger-ui.html

利用Docker-Compose部署

容器多了以后,必然须要一种管理容器的工具,那么docker-compose应运而生,docker-compose是用于定义和运行本机的多个docker容器的工具,负责实现对Docker容器集群的快速编排,可使用yml文件来配置应用程序须要的全部服务。而后使用命令,从yml文件配置中建立并启动全部服务。

两个重要概念:

​ 服务(service):一个应用的容器,实际能够包括若干运行相同镜像的容器实例。

​ 项目(project):由一组关联的应用容器组成的一个完整的业务单元,在docker-compose.yml文件中定义。

  • 在Dockerfile同级目录下,编写docker-compose.yml,示例:
version: '3.7'

# 定义服务
services:
  # 指定服务名称,例如spring-boot服务
 app-server:
 build:
 context: . # 配置须要构建Dockerfile的路径 相对于docker-compose.yml
 dockerfile: Dockerfile
    # 指定服务运行的端口
 ports:
 - "8080:8080" # 将本机8080端口映射到容器8080端口
 restart: always
    # 须要依赖的服务 率先构建
 depends_on:
 - db
 - redis
      #environment: # 设置环境变量
      #SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/airTicket?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
      #SPRING_DATASOURCE_USERNAME: root
      #SPRING_DATASOURCE_PASSWORD: 123456
      #SPRING_REDIS.HOST: redis
 db:
    # 指定服务使用的镜像
 image: mysql:5.7
    # 指定容器名称
 container_name: mysql5.7
 ports:
 - "3306:3306"
 restart: always
 environment:
 MYSQL_ROOT_PASSWORD: rootpwd
 volumes:
 - /Users/yclxiao/Program/volume/mysql/conf:/etc/mysql/conf.d
 - /Users/yclxiao/Program/volume/mysql/logs:/logs
 - /Users/yclxiao/Program/volume/mysql/data:/var/lib/mysql
 redis:
 image: redis:5.0.8
    # 指定容器名称
 container_name: redis5.0.8
 volumes:
 - /Users/yclxiao/Program/volume/redis/conf/redis.conf:/redis.conf
 - /Users/yclxiao/Program/volume/redis/data:/data
 command: ["redis-server", "--protected-mode", "no", "--appendonly", "yes"]
 hostname:
      redis
 ports:
 - "6379:6379"

复制代码
  • 而后执行命令,本地已经下载的镜像建立的容器,不会再下载建立了:
docker-compose build   #根据docker-compose.yam构建完整镜像
docker-compose up      #直接运行全部服务
docker-compose up -d   #后台运行全部服务
docker-compose stop    #中止全部容器
docker-compose ps      #列出全部容器信息
复制代码

Docker-Compose和K8S区别

Docker是容器技术的核心、基础,Docker Compose是一个基于Docker的单主机容器编排工具(容器管理工具),功能并不像Kubernetes那么丰富,Kubernetes是基于Dcoker的跨主机的容器管理平台。

原文连接

相关文章
相关标签/搜索