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


前言

終於寫到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM