爲了方便本地測試項目,爲了方便開啓新的環境,爲了方便部署,打算本地利用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
拉取官方鏡像docker
docker pull mysql:5.7
複製代碼
查看鏡像庫shell
docker images
複製代碼
建立mysql的掛載的目錄
mkdir -p /Users/yclxiao/Program/volume/mysql/data /Users/yclxiao/Program/volume/mysql/conf /Users/yclxiao/Program/volume/mysql/logs
複製代碼
建立cnf文件
cd /Users/yclxiao/Program/volume/mysql/conf
touch my.cnf
複製代碼
建立容器,將數據、日誌、配置文件,映射到本機
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:設置參數
啓動容器
docker start mysql
複製代碼
docker run xxx 和 docker start xxx 區別?
docker run:
只有在第一次運行時使用,將鏡像放到容器中,之後再次啓動容器的時候,只須要使用docker start就能夠了。
docker run 至關於執行了2個命令:
docker start:
啓動已經存在的容器
用Navicat等工具測試是否能連上
用戶名:root
密碼:rootpwd
在宿主機掛載目錄下新建redis相關目錄
/Users/yclxiao/Program/volume/redis/conf
/Users/yclxiao/Program/volume/redis/data
在/Users/yclxiao/Program/volume/redis/conf下
touch redis.conf
複製代碼
拉取官方鏡像,查看鏡像
docker pull redis:5.0.8
docker images
複製代碼
啓動容器,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持久化配置
查看正在運行的容器
docker ps
複製代碼
RDM工具鏈接測試OK
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是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"] 複製代碼
搭建帶有Dockerfile文件的Springboot工程,pom配置docker插件,構建鏡像推送鏡像,啓動容器。
準備工程:
配置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>
複製代碼
構建鏡像,推送倉庫:
直接在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
複製代碼
執行docker images,能夠在本地倉庫看到此鏡像。
查看dockerHub倉庫https://hub.docker.com/,能夠看到此鏡像
建立啓動容器:
docker run -p 8080:8080 yclxiao/blog-dbpool-main:0.0.1-SNAPSHOT [-d]
本地docker啓動mysql以後,訪問OK:http://localhost:8080/swagger-ui.html
容器多了以後,必然須要一種管理容器的工具,那麼docker-compose應運而生,docker-compose是用於定義和運行本機的多個docker容器的工具,負責實現對Docker容器集羣的快速編排,可使用yml文件來配置應用程序須要的全部服務。而後使用命令,從yml文件配置中建立並啓動全部服務。
兩個重要概念:
服務(service):一個應用的容器,實際能夠包括若干運行相同鏡像的容器實例。
項目(project):由一組關聯的應用容器組成的一個完整的業務單元,在
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是容器技術的核心、基礎,Docker Compose是一個基於Docker的單主機容器編排工具(容器管理工具),功能並不像Kubernetes那麼豐富,Kubernetes是基於Dcoker的跨主機的容器管理平臺。