五、docker-compose開鋒(docker 三劍客)

  • 2019 年 11 月 8 日
  • 筆記

前言

終於寫到docker-compose了,其實我最開始接觸docker的時候,是因為一個開源項目需要用docker 環境和docke-compose 所以我最先接觸的是docker-compse 後面才惡補的docker的一些基礎知識。

可以看到docker-composer 和docker 有關係,但是你也了解docker-compose 的命令 簡單的操作docker 容器。

說了這麼多,還沒有說docker-compose 有什麼作用,為什麼要使用docker-coompose。
其實我們都知道,在我們實際的項目中,一個項目一般都是前端服務端數據庫都進行分離的。所以一個項目一般都是有多個鏡像組成的。那怎麼將這一組鏡像管理起來呢?就是通過docker-compose 啦

docker-compose 中有兩個重要呢的概念
服務(service ): 就是我們上面說的一個應用容器,僅僅負責真箇項目的中的一部分,比如數據庫mysql.

項目(project):就是我們上面說你的項目啦,包含一組容器。

docker-compose 通過 docker-compose.yml 文件對這一組容器進行配置。

好了,正式開始接觸 docker-compose吧

安裝

docker-compose 安裝很簡單,windos 版本的已經自帶了。我們可以通過

docker-compose  -v

查看我們本機安裝的docker-compose 版本。
Linux 安裝也很簡單。
在官網上也有:https://github.com/docker/compose/releases

sudo apt-get update    #安裝最新的docke-ce  sudo apt-get install  docker-ce    # 下載最新的docker-compose  curl -L https://github.com/docker/compose/releases/download/1.25.0-rc4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose    # 修改docker-compose 權限  chmod +x /usr/local/bin/docker-compose

卸載 docke-compose

sudo rm /usr/local/bin/docker-compose

本地安裝

如果上面安裝不行的話,或者報錯,可以用下面的方式進行安裝。

在上面的官網上找到對應版本的Assests 選擇對應的文件下載。

file

下載下來後,我們放到 /usr/local/bin/ 目錄下。執行下面操作

#改名  sudo mv docker-compose-Linux-x86_64 ./docker-compose  #增加執行權限  sudo chmod +x /usr/local/bin/docker-compose

這樣就和上面的效果是一樣的啦,我們可以通過docker-compose -v 查看安裝成功沒有。

docker-compose.yml

知道了docker-compose 那最重要的就是docker-compose.yml 文件啦,通過這個文件就可以管理項目的鏡像了,那我們怎麼寫docker-compose.yml 文件呢?
官方提供了很多模版,我們按照模版來寫就可以了。

主模版

version: "3"    services:    webapp:      image: examples/web      ports:        - "80:80"      volumes:        - "/data"

可以看到格式就是我們熟悉的yml 格式,和我們springboot 項目中配置是差不多的。
我們前面知道的一個項目是由一組服務組成的,也就是你對應文件中的services。webapp 就是我們為服務起的一個名字,image 對應的鏡像名,ports 鏡像暴露的端口,volumes 鏡像的數據卷。可以看到,裏面的命令和docker run 的指令是差不多的。

depends_on

解決容器的依賴,表示一個容器依賴其他的其他容器,比如說

version: "3"    services:    webapp:      image: examples/web      ports:        - "80:80"      volumes:        - "/data"      depends_on:        - redis        - mysql      redis:      image: redis:latest      restart: always      ports:        - "6379:6379"      mysql:      image: mysql:latest      restart: always      ports:        - "3306:3306"

還是上面的例子,只不過我多加了兩個 service 。表示這個項目中用到了mysql 和redis 並且在webapp 中使用depends_on 表示redis 和mysql 先webapp 啟動。

更多的模版,大家用的時候可以參考官網上就可以了我感覺。知道是什麼意思就可以,不用都記下來。

https://yeasy.gitbooks.io/docker_practice/content/compose/compose_file.html

docker-compose 指令

我們可以通過幫助指令來查看docker-compose 怎麼使用。

docker-compose --help 

基本語法格式:

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

我這裡也就將一下常見的,因為通過--help 都可以查到。

docker-compose config

用於檢查我們的docker-compose.yml 文件的內容格式是否正確,在我們運行之前先檢測一下比較好。

docker-compose up

用來啟動項目,比如我們現在有一個docker-compose.yml 文件,那我們進入到這個文件目錄,執行docker-compose up 就可以將項目依賴的鏡像下載下來,並啟動相應的容器服務。整個項目都啟動起來了,直接使用就好了,可謂是相當強大了。

docker-compose up -d 表示後台啟動。

docker-compose down

和 up 對應,用來停止我們的項目。

docker-compose restart

重啟我們項目

其他的也不說了,可以查看官網:

https://docs.docker.com/compose/reference/overview/

demo

光說不練假把式,我們上面說的一堆基礎的知識,還是需要我們實踐才行,不然我們不會有什麼實質性的收穫。所以接下來我們就搭建一個簡單的demo。

我們還是用前面的的hello的項目,我們對項目進行一些修改,增加 redis。
這裡我就不具體的講啦,有不會的可以看我這篇文章,寫的很簡單明了:

三、Redis在SpringBoot中使用案例

我們這裡先在在pom.xml 中增加redis 依賴:

<!--Redis使用starter-->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-data-redis</artifactId>          </dependency>

在application.properties 中增加redis 配置

#配置redis  # Redis數據庫索引(默認為0)  spring.redis.database=0  # Redis服務器地址  spring.redis.host=192.168.252.53  # Redis服務器連接端口  spring.redis.port=6389  # Redis服務器連接密碼(默認為空)  spring.redis.password=  # 連接池最大連接數(使用負值表示沒有限制) 默認 8  spring.redis.lettuce.pool.max-active=8  # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1  spring.redis.lettuce.pool.max-wait=-1  # 連接池中的最大空閑連接 默認 8  spring.redis.lettuce.pool.max-idle=8  # 連接池中的最小空閑連接 默認 0  spring.redis.lettuce.pool.min-idle=0  

在controller 包中創建一個redisController 類

@RestController  @RequestMapping("/redis")  @Slf4j  public class RedisController {        @Autowired      private StringRedisTemplate stringRedisTemplate;        @RequestMapping(value = "/add",method = RequestMethod.GET)      public String add(@RequestParam(value="key")String key,@RequestParam(value = "value") String value){          ValueOperations ops=stringRedisTemplate.opsForValue();          ops.set(key,value);          return "success";      }        @RequestMapping(value = "/get",method = RequestMethod.GET)      public String get(@RequestParam(value = "key")String key){          ValueOperations ops=stringRedisTemplate.opsForValue();          return (String) ops.get(key);      }    }

好了,我們將項目打包成鏡像,至於怎麼打包成鏡像上一篇我已經講了,不會的可以查看:

三、DockerFile 定製屬於自己的專屬鏡像

準備我們的redis.conf

我們使用 redis 鏡像,但是我們不想使用默認的配置,想要使用自己的配置啟動redis。所以我們來複制一份redis.conf 。我就修改了

#設置redis 可以遠程訪問  bind 0.0.0.0  #後台啟動  daemonize yes

file
redis.conf 放在我們上圖的redis目錄下。

docker-compose.yml

我們來編寫docker-compose.yml ,直接套用上面的模版。

  version: "3"    services:    webapp:      image: quellanan/hello:1.0.0      ports:        - "9000:9000"      volumes:        - "/data"      depends_on:        - redis      redis:      image: redis:latest      restart: always      ports:        - "6389:6379"      volumes:        - /redis/redis.conf:/etc/redis/redis.conf      command: redis-server /etc/redis/redis.conf  

可以看到基本上是根據模版來的,指定我們鏡像,端口,數據卷。
這裡webapp 的沒有什麼好說的 ,上面都說了,一看就能懂,說一下redis的。
images 指定的鏡像為redis:latest ,如果你本地沒有這個鏡像,就會從官網上下載。
restart:always 表示自動重啟。

 ports:"6389:6379"

表示鏡像啟動redis容器的端口是6379,映射到服務器的6389 端口,所以我們在項目配置的redis 端口應該是6389.

volumes: /redis/redis.conf:/etc/redis/redis.conf

表示將 ./redis/redis.conf 文件加載到 容器中的 /etc/redis/redis.conf 位置。
說明第一個路徑是相對路徑,第二個路徑是絕對路徑。

command: redis-server /etc/redis/redis.conf

表示在啟動redis 容器的時候會執行的命令。這樣就可以實現啟動redis鏡像加載我們自己的配置文件了。

docker-compose up

準備工作都做好了,開始我們大展拳腳,哈哈,其實不然,我們準備工作做好了,就已經成功一大半了,我們接下來要做的就是 就是通過docker-compose 啟動鏡像。我們直接在存放docker-compose.yml 目錄下執行:

docker-compose up

file
這樣我們就啟動成功了。

如果想後台啟動的話輸入:

docker-compose up -d 

測試

我們項目啟動,現在來測試一下到底成功沒有。

http://192.168.252.53:9000/

這個是測試項目是正常啟動了。
file
我們接下來看看我們配置的redis 有沒有成功。

http://192.168.252.53:9000/redis/add?key=a&value=123qaz  http://192.168.252.53:9000/redis/get?key=a

file
file

可以看到界面上接口沒有問題了,redis已經已經生效了,我們還不太確定,可以去服務器上看下。
file。本地沒有裝redis ,我們可以進入到redis容器中去查看。
操作如下:
先通過docker ps 查看redis 容器id
然後通過下面命令進入容器。

docker exec -it 容器id  /bin/bash

最後連接redis

redis-cli 

file

番外

好了,就說這麼多啦

後續加油♡

歡迎大家關注個人公眾號 "程序員愛酸奶"

分享各種學習資料,包含java,linux,大數據等。資料包含視頻文檔以及源碼,同時分享本人及投遞的優質技術博文。

如果大家喜歡記得關注和分享喲❤

file