CentOS7中使用docker-compose部署Springboot+Redis+Mysql+Nginx服務

之前講解過Docker安裝單個服務的系列教程,沒看過的可以點擊下面的鏈接回顧一下:

Docker的用途我在這裏就不做贅述了,不懂的自己戳上面的鏈接學習,假如現在我們有個Springboot應用,裏面用到了mysql、Redis、Nginx等服務,那現在我們要用Docker部署我們的服務,通常需要下面幾步:

  • 安裝docker

  • 使用docker安裝Redis

  • 使用docker安裝Mysql

  • 使用docker安裝、配置Nginx

  • springboot應用打成Jar包和編寫dockerfile

安裝好以上服務之後,我們還要一一啓動,然後再運行項目才能訪問,雖然說docker有一次打包到處運行、節省存儲空間和資源,應用隔離和服務器整合等優點,但是仔細看上面的部署步驟,即便我們用了docker,也還是要在docker裏手動安裝其他服務,現在只有redis、mysql、nginx幾個服務,如果我們以後還要加ES、Mongo等等越來越多的服務,好像並沒有提高很多效率,那作爲“萬能”的程序員,有解決方法嗎?那必須有啊,下面就進入本文的重點:docker-compose。

docker-compose簡介

Compose是用於定義和運行多容器Docker應用程序的工具,是docker的服務編排工具,主要應用於構建基於Docker的複雜應用,compose通過一個配置文件來管理多個docker容器,適合組合使用多個容器進行開發的場景。使用compose,可以使用yml或者yaml文件配置應用程序的服務。然後,通過一個命令,可以從配置中創建和啓動所有服務。更多資料可以參考官網:https://docs.docker.com/compose/overview/docker-compose安裝
安裝docker相關依賴環境:


# 安裝依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加docker下載倉庫
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安裝docker-ce
sudo yum install docker-ce
# 啓動docker-ce
sudo systemctl start docker
# 驗證
sudo docker --version

compose官網安裝文檔:https://docs.docker.com/compose/install/#install-compose


1、安裝Run this command to download the latest version of Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

2、賦權Apply executable permissions to the binary:
sudo chmod +x /usr/local/bin/docker-compose

3、Optionally, install command completion for the bash and zsh shell.

4、測試(查看版本)Test the installation
docker-compose --version

docker-compose部署服務詳解使用compose部署應用一般需要下面幾個步驟:

  1. 用dockerfile,或者鏡像定義應用程序所依賴的環境,以便在任何地方都可以直接複製。

  2. 在docker-compose.yaml中定義應用程序需要的服務,以便這些服務可以在單獨的環境中一起運行。

  3. 運行docker-compose build 安裝應用程序所需要的服務鏡像。

  4. 運行docker-compose up -d 啓動並在後臺運行整個應用程序。

  5. 運行docker compose down 停止整個應用程序。

下面我們來詳細講解上面的四個步驟。
docker-compose部署Spring Boot+Nginx+Redis+Mysql實戰

歷經了一個月,終於將個人的博客發佈上線了,原來準備用傳統的方式先草草上線,可是對於一個對前沿技術有強迫症的開發者來說,哪怕不精通不擅長,至少要懂點皮毛,要在別人聊起的時候至少能聽懂,於是果斷換了docker方式部署,可部署過程中發現既然都已經開始了,索性就再爲難自己一下,乾脆一次性到位好了,直接用compose方式。其實人很多時候都是在“爲難自己”的過程中成長,只要你勇敢的邁出第一步。

好了,廢話少說,在大概的看了官方文檔,又谷哥度娘了幾篇相關文章,在失敗了7次,解決了4個問題之後,最終如願使用compose方式上線成功,下面就將整個過程記錄下來和大家分享,所有步驟都經過本人親測,希望對碼之初的鄉親們也有幫助。

一、看一下完整的目錄結構

image

下面的common、dao、service、web模塊不用多做介紹了,是個人博客項目,上面的docker-build文件夾就是使用compose方式部署的文件夾,主要包括:

  • Spring Boot web項目打成的jar包

  • jar對應的Dockerfile

  • compose方式的核心配置文件docker-compose.yaml

  • config文件夾,是將宿主機本地配置掛載到docker容器中的配置文件

  • data文件夾:存放的一些初始化數據或者配置

  • log日誌文件夾

二、Dockerfile文件詳解


FROM java:8
#FROM maven:3.5-jdk-8
VOLUME /tmp
ADD mazhichu.jar mazhichu.jar
EXPOSE 8082
#RUN bash -c 'touch /mazhichu.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/prod/./urandom","-Dspring.profiles.active=prod", "-jar","/mazhichu.jar"

命令解釋:

  • FROM java:8:基礎鏡像環境 JDK1.8

  • VOLUME /tmp:指定了掛載目錄

  • ADD mazhichu.jar mazhichu.jar:把指定的 jar 包拷貝到 Docker 容器中並命名爲 mazhichu.jar

  • EXPOSE 8082:運行監聽端口

  • RUN bash -c ‘touch /mazhichu.jar’:等同於上面的拷貝jar文件到容器

  • ENTRYPOINT…:啓動jar的命令並指定運行環境等參數

三、docker-compose.yaml文件詳解


version: '3'

services:

    nginx:
        container_name: nginx
        image: nginx:1.14
        environment:
            - TZ=Asia/Shanghai
        ports:
            - "80:80"
        volumes:
            - ./config/nginx/conf.d:/etc/nginx/conf.d
#            - ./data/nginx/:/usr/share/nginx/html/
            - ./log/nginx/:/var/log/nginx/
        restart: always

    redis:
        container_name: redis
        image: redis:5.0.7
        environment:
            - TZ=Asia/Shanghai
        ports:
            - "6379:6379"
        volumes:
            - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
            - ./data/redis/:/data/
            - ./log/redis/:/var/log/redis/
        command: redis-server /usr/local/etc/redis/redis.conf
        restart: always

    mysql:
        container_name: mysql
        image: mysql:8.0.18
        environment:
            TZ: Asia/Shanghai
            MYSQL_DATABASE: mazhichu
            MYSQL_ROOT_PASSWORD: Moore@2019
            MYSQL_ROOT_HOST: '%'
        ports:
            - "3306:3306"
        volumes:
            - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
            - ./data/mysql/:/var/lib/mysql/
            - ./data/init/:/docker-entrypoint-initdb.d/
            - ./log/mysql/:/var/log/mysql/
        command: [
            '--character-set-server=utf8mb4',
            '--collation-server=utf8mb4_unicode_ci',
          #這行代碼解決無法訪問的問題
            '--default-authentication-plugin=mysql_native_password'
        ]
        security_opt:
            - seccomp:unconfined
        restart: always

    mazhichu:
        container_name: mazhichu
        build:
            context: .
            dockerfile: Dockerfile
        environment:
            TZ: Asia/Shanghai
            spring.datasource.host: mysql
            spring.redis.host: redis
        expose:
            - "8082"
        depends_on:
            - nginx
            - redis
            - mysql
        links:
            - "mysql:mysql"
        restart: always
#        networks:
#            - my-network
#        command: mvn clean spring-boot:run -Dspring-boot.run.profiles=prod

配置解釋:

  • version: ‘3’: 表示使用第三代語法來構建 docker-compose.yaml 文件。

  • services: 用來表示 compose 需要啓動的服務,上面的配置文件中有四個服務分別爲:nginx、redis、mysql還有我的博客項目mazhichu(碼之初)。

  • Image:指定下載鏡像版本

  • container_name: 指定容器名稱

  • environment: 此節點下的信息會當作環境變量傳入容器,例如mysql 服務配置了數據庫、密碼和權限信息。

  • ports: 表示對外開放的端口

  • volumes: 加載本地目錄下的配置文件到容器目標地址下

  • restart: always 表示如果服務啓動不成功會一直嘗試。

  • depends_on:配置依賴服務,表示需要先啓動 depends_on 下面的服務後,再啓動本服務。

  • links:與depends_on相對應,depends_on控制啓動順序,links控制容器連接問題。值爲"服務名:別名"或者直接使用服務名

  • command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker: 表示以這個命令來啓動項目,-Dspring-boot.run.profiles=prodr表示使用 application-prod.yml文件配置信息進行啓動。

  • networks:加入指定網絡,我這兒沒用到。

四、config文件夾詳解

image.gif

config文件夾下是將宿主機本地配置掛載到docker容器中的配置,在docker-compose.yaml文件中使用volumes指定。因爲單個安裝這些服務時我們也會這樣做,可以見文章開頭的相關文章,這兒我就把我的貼一下,大家參考一下就好。

**my.cnf:**mysql的配置,注意改變加密方式那個位置


[client]

default-character-set=utf8mb4

[mysqld]

character-set-client-handshake = FALSE

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

# 數據庫唯一 ID,主從的標識號絕對不能重複。
server-id = 1

# 開啓 bin-log,並指定文件目錄和文件名前綴
log-bin=/var/log/mysql/binlog

# bin-log 日誌文件格式,設置爲 MIXED 可以防止主鍵重複。
binlog_format = mixed

# 改變加密方式,遠程連接(這個很重要)
default_authentication_plugin=mysql_native_password

# 解決遠程訪問慢問題
skip-name-resolve

[mysql]
default-character-set=utf8mb4

mzc.conf:主要配置ip域名映射,注意proxy_pass那兒的碼之初是docker-compose.yaml文件中指定的服務名。


upstream mazhichu {
    server mazhichu:8082;
  }
server {
    listen 80;
    server_name www.mazhichu.cn;
    charset utf-8;

    location / {
        proxy_pass http://mazhichu;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

redis.conf:我這兒其實就是redis.conf的文件,只是改變了裏面的連接redis的密碼。

五、詳細步驟

1、將docker-build文件夾上傳到centos指定目錄中,使用命令:

scp -r docker-build mzc:/usr/local/server

友情提示:

  1. 直接使用scp拷貝文件提示無權限的時候,需要加上一個-r就可以了。

  2. mzc:/usr/local/server:這兒我直接使用的遠程服務器別名,是不是很方便,感興趣的可以看我這篇公衆號:ssh使用別名免密登錄遠程服務器

image

image

2、給log文件夾加上所有權限,然後重啓一下docker服務

image

3、使用docker-compose build構建服務

image

4、使用docker-compose up -d 啓動並在後臺運行yaml中定義的所有服務

image

至此,使用compose方式部署Spring Boot+Nginx+Redis+Mysql服務全部完成,訪問博客主頁http://www.mazhichu.cn,看到可以成功訪問。

image

docker-compose常用命令介紹

  • docker-compose --verbose:輸出更多的調試信息

  • docker-compose --version:查看compose的版本

  • docker-compose -f --file FILE:使用特定的compose模板文件,默認爲docker-compose.yaml。

  • docker-compose -p --project-name NAME 指定項目名稱,默認使用目錄名稱。

  • docker-compose build:構建或重建服務

  • docker-compose ps:查看已經啓動的服務狀態

  • docker-compose kill:停止某個服務、殺掉容器

  • docker-compose logs:可以查看某個服務的log、顯示容器的輸出內容

  • docker-compose port:打印綁定的public port(開放端口)

  • docker-compose pull:拉取服務鏡像

  • docker-compose up:啓動yml定義的所有服務

  • docker-compose stop:停止yml中定義的所有服務

  • docker-compose start:啓動被停止的yml中的所有服務

  • docker-compose kill:強行停止yml中定義的所有服務

  • docker-compose rm:刪除yml中定義的所有服務

  • docker-compose restart:重啓yml中定義的所有服務

  • docker-compose scale:設置服務的容器數目

  • docker-compose run:運行一個一次性命令

總結

在寫這篇文章之前,我從來沒有接觸過compose,以前只關注過docker一些基礎知識,整個部署過程花了我整整一天的時間,從看文檔到查資料再到不斷試錯,最終又花了半天時間總結寫這篇文章。說了這麼多,只是想表達如果你想學習一門語言或者技術,那你就必須走近它,必須動手嘗試纔能有真正的成長和體驗,就跟你看到一個漂亮的高冷小姐姐一樣,你只有走近她纔有接觸的機會,只有敢於追求才有成功脫單的機會,道理是一樣一樣的。最後,原創不易,如果鄉親們覺得本文不錯,麻煩幫忙右下角點個在看或者分享給其他有需要的人,這就是給我最大的鼓勵和堅持原創的動力了,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章