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的跨主機的容器管理平臺。

原文連接

相關文章
相關標籤/搜索