CentOS7中使用docker-compose部署服務(wù)

之前講解過Docker安裝單個(gè)服務(wù)的系列教程焦辅,沒看過的可以點(diǎn)擊下面的鏈接回顧一下:

Docker的用途我在這里就不做贅述了,不懂的自己戳上面的鏈接學(xué)習(xí),假如現(xiàn)在我們有個(gè)Springboot應(yīng)用付鹿,里面用到了mysql梅尤、Redis埂淮、Nginx等服務(wù)慨畸,那現(xiàn)在我們要用Docker部署我們的服務(wù)倒谷,通常需要下面幾步:

  • 安裝docker

  • 使用docker安裝Redis

  • 使用docker安裝Mysql

  • 使用docker安裝蛛蒙、配置Nginx

  • springboot應(yīng)用打成Jar包和編寫dockerfile

安裝好以上服務(wù)之后,我們還要一一啟動(dòng)渤愁,然后再運(yùn)行項(xiàng)目才能訪問牵祟,雖然說docker有一次打包到處運(yùn)行、節(jié)省存儲(chǔ)空間和資源抖格,應(yīng)用隔離和服務(wù)器整合等優(yōu)點(diǎn)诺苹,但是仔細(xì)看上面的部署步驟咕晋,即便我們用了docker,也還是要在docker里手動(dòng)安裝其他服務(wù)收奔,現(xiàn)在只有redis掌呜、mysql、nginx幾個(gè)服務(wù)坪哄,如果我們以后還要加ES质蕉、Mongo等等越來越多的服務(wù),好像并沒有提高很多效率翩肌,那作為“萬能”的程序員模暗,有解決方法嗎?那必須有啊念祭,下面就進(jìn)入本文的重點(diǎn):docker-compose兑宇。

docker-compose簡介

Compose是用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具,是docker的服務(wù)編排工具粱坤,主要應(yīng)用于構(gòu)建基于Docker的復(fù)雜應(yīng)用隶糕,compose通過一個(gè)配置文件來管理多個(gè)docker容器,適合組合使用多個(gè)容器進(jìn)行開發(fā)的場景比规。使用compose,可以使用yml或者yaml文件配置應(yīng)用程序的服務(wù)拦英。然后蜒什,通過一個(gè)命令,可以從配置中創(chuàng)建和啟動(dòng)所有服務(wù)疤估。更多資料可以參考官網(wǎng):https://docs.docker.com/compose/overview/docker-compose安裝
安裝docker相關(guān)依賴環(huán)境:


# 安裝依賴
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
# 啟動(dòng)docker-ce
sudo systemctl start docker
# 驗(yàn)證
sudo docker --version

compose官網(wǎng)安裝文檔: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、賦權(quán)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部署服務(wù)詳解使用compose部署應(yīng)用一般需要下面幾個(gè)步驟:

  1. 用dockerfile,或者鏡像定義應(yīng)用程序所依賴的環(huán)境慷荔,以便在任何地方都可以直接復(fù)制雕什。

  2. 在docker-compose.yaml中定義應(yīng)用程序需要的服務(wù),以便這些服務(wù)可以在單獨(dú)的環(huán)境中一起運(yùn)行显晶。

  3. 運(yùn)行docker-compose build 安裝應(yīng)用程序所需要的服務(wù)鏡像贷岸。

  4. 運(yùn)行docker-compose up -d 啟動(dòng)并在后臺(tái)運(yùn)行整個(gè)應(yīng)用程序。

  5. 運(yùn)行docker compose down 停止整個(gè)應(yīng)用程序磷雇。

下面我們來詳細(xì)講解上面的四個(gè)步驟偿警。
docker-compose部署Spring Boot+Nginx+Redis+Mysql實(shí)戰(zhàn)

歷經(jīng)了一個(gè)月,終于將個(gè)人的博客發(fā)布上線了唯笙,原來準(zhǔn)備用傳統(tǒng)的方式先草草上線螟蒸,可是對(duì)于一個(gè)對(duì)前沿技術(shù)有強(qiáng)迫癥的開發(fā)者來說盒使,哪怕不精通不擅長,至少要懂點(diǎn)皮毛七嫌,要在別人聊起的時(shí)候至少能聽懂少办,于是果斷換了docker方式部署,可部署過程中發(fā)現(xiàn)既然都已經(jīng)開始了抄瑟,索性就再為難自己一下凡泣,干脆一次性到位好了,直接用compose方式皮假。其實(shí)人很多時(shí)候都是在“為難自己”的過程中成長鞋拟,只要你勇敢的邁出第一步。

好了惹资,廢話少說贺纲,在大概的看了官方文檔,又谷哥度娘了幾篇相關(guān)文章褪测,在失敗了7次猴誊,解決了4個(gè)問題之后,最終如愿使用compose方式上線成功侮措,下面就將整個(gè)過程記錄下來和大家分享懈叹,所有步驟都經(jīng)過本人親測,希望對(duì)碼之初的鄉(xiāng)親們也有幫助分扎。

一澄成、看一下完整的目錄結(jié)構(gòu)

image

下面的common、dao畏吓、service墨状、web模塊不用多做介紹了,是個(gè)人博客項(xiàng)目菲饼,上面的docker-build文件夾就是使用compose方式部署的文件夾肾砂,主要包括:

  • Spring Boot web項(xiàng)目打成的jar包

  • jar對(duì)應(yīng)的Dockerfile

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

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

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

  • 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:基礎(chǔ)鏡像環(huán)境 JDK1.8

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

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

  • EXPOSE 8082:運(yùn)行監(jiān)聽端口

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

  • ENTRYPOINT...:啟動(dòng)jar的命令并指定運(yùn)行環(huán)境等參數(shù)

三镐确、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': 表示使用第三代語法來構(gòu)建 docker-compose.yaml 文件。

  • services: 用來表示 compose 需要啟動(dòng)的服務(wù)饼煞,上面的配置文件中有四個(gè)服務(wù)分別為:nginx辫塌、redis、mysql還有我的博客項(xiàng)目mazhichu(碼之初)派哲。

  • Image:指定下載鏡像版本

  • container_name: 指定容器名稱

  • environment: 此節(jié)點(diǎn)下的信息會(huì)當(dāng)作環(huán)境變量傳入容器臼氨,例如mysql 服務(wù)配置了數(shù)據(jù)庫、密碼和權(quán)限信息芭届。

  • ports: 表示對(duì)外開放的端口

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

  • restart: always 表示如果服務(wù)啟動(dòng)不成功會(huì)一直嘗試储矩。

  • depends_on:配置依賴服務(wù)感耙,表示需要先啟動(dòng) depends_on 下面的服務(wù)后,再啟動(dòng)本服務(wù)持隧。

  • links:與depends_on相對(duì)應(yīng)即硼,depends_on控制啟動(dòng)順序,links控制容器連接問題屡拨。值為"服務(wù)名:別名"或者直接使用服務(wù)名

  • command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker: 表示以這個(gè)命令來啟動(dòng)項(xiàng)目只酥,-Dspring-boot.run.profiles=prodr表示使用 application-prod.yml文件配置信息進(jìn)行啟動(dòng)。

  • networks:加入指定網(wǎng)絡(luò)呀狼,我這兒沒用到裂允。

四、config文件夾詳解

image.gif

config文件夾下是將宿主機(jī)本地配置掛載到docker容器中的配置哥艇,在docker-compose.yaml文件中使用volumes指定绝编。因?yàn)閱蝹€(gè)安裝這些服務(wù)時(shí)我們也會(huì)這樣做,可以見文章開頭的相關(guān)文章貌踏,這兒我就把我的貼一下十饥,大家參考一下就好。

my.cnf:mysql的配置祖乳,注意改變加密方式那個(gè)位置


[client]

default-character-set=utf8mb4

[mysqld]

character-set-client-handshake = FALSE

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

# 數(shù)據(jù)庫唯一 ID逗堵,主從的標(biāo)識(shí)號(hào)絕對(duì)不能重復(fù)。
server-id = 1

# 開啟 bin-log眷昆,并指定文件目錄和文件名前綴
log-bin=/var/log/mysql/binlog

# bin-log 日志文件格式蜒秤,設(shè)置為 MIXED 可以防止主鍵重復(fù)。
binlog_format = mixed

# 改變加密方式隙赁,遠(yuǎn)程連接(這個(gè)很重要)
default_authentication_plugin=mysql_native_password

# 解決遠(yuǎn)程訪問慢問題
skip-name-resolve

[mysql]
default-character-set=utf8mb4

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


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:我這兒其實(shí)就是redis.conf的文件伞访,只是改變了里面的連接redis的密碼。

五轰驳、詳細(xì)步驟

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

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

友情提示:

  1. 直接使用scp拷貝文件提示無權(quán)限的時(shí)候办绝,需要加上一個(gè)-r就可以了试伙。

  2. mzc:/usr/local/server:這兒我直接使用的遠(yuǎn)程服務(wù)器別名,是不是很方便勤哗,感興趣的可以看我這篇公眾號(hào):ssh使用別名免密登錄遠(yuǎn)程服務(wù)器

image
image

2抡爹、給log文件夾加上所有權(quán)限,然后重啟一下docker服務(wù)

image

3芒划、使用docker-compose build構(gòu)建服務(wù)

image

4冬竟、使用docker-compose up -d 啟動(dòng)并在后臺(tái)運(yùn)行yaml中定義的所有服務(wù)

image

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

image

docker-compose常用命令介紹

  • docker-compose --verbose:輸出更多的調(diào)試信息

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

  • docker-compose -f --file FILE:使用特定的compose模板文件,默認(rèn)為docker-compose.yaml笑诅。

  • docker-compose -p --project-name NAME 指定項(xiàng)目名稱调缨,默認(rèn)使用目錄名稱。

  • docker-compose build:構(gòu)建或重建服務(wù)

  • docker-compose ps:查看已經(jīng)啟動(dòng)的服務(wù)狀態(tài)

  • docker-compose kill:停止某個(gè)服務(wù)吆你、殺掉容器

  • docker-compose logs:可以查看某個(gè)服務(wù)的log弦叶、顯示容器的輸出內(nèi)容

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

  • docker-compose pull:拉取服務(wù)鏡像

  • docker-compose up:啟動(dòng)yml定義的所有服務(wù)

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

  • docker-compose start:啟動(dòng)被停止的yml中的所有服務(wù)

  • docker-compose kill:強(qiáng)行停止yml中定義的所有服務(wù)

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

  • docker-compose restart:重啟yml中定義的所有服務(wù)

  • docker-compose scale:設(shè)置服務(wù)的容器數(shù)目

  • docker-compose run:運(yùn)行一個(gè)一次性命令

總結(jié)在寫這篇文章之前,我從來沒有接觸過compose早处,以前只關(guān)注過docker一些基礎(chǔ)知識(shí)湾蔓,整個(gè)部署過程花了我整整一天的時(shí)間,從看文檔到查資料再到不斷試錯(cuò)砌梆,最終又花了半天時(shí)間總結(jié)寫這篇文章默责。說了這么多,只是想表達(dá)如果你想學(xué)習(xí)一門語言或者技術(shù)咸包,那你就必須走近它桃序,必須動(dòng)手嘗試才能有真正的成長和體驗(yàn),就跟你看到一個(gè)漂亮的高冷小姐姐一樣烂瘫,你只有走近她才有接觸的機(jī)會(huì)媒熊,只有敢于追求才有成功脫單的機(jī)會(huì),道理是一樣一樣的坟比。最后芦鳍,原創(chuàng)不易,如果鄉(xiāng)親們覺得本文不錯(cuò)葛账,麻煩幫忙右下角點(diǎn)個(gè)在看或者分享給其他有需要的人柠衅,這就是給我最大的鼓勵(lì)和堅(jiān)持原創(chuàng)的動(dòng)力了,謝謝籍琳!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菲宴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趋急,更是在濱河造成了極大的恐慌喝峦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呜达,死亡現(xiàn)場離奇詭異谣蠢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門眉踱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勋颖,“玉大人,你說我怎么就攤上這事勋锤》沽幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵叁执,是天一觀的道長茄厘。 經(jīng)常有香客問我,道長谈宛,這世上最難降的妖魔是什么次哈? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮吆录,結(jié)果婚禮上窑滞,老公的妹妹穿的比我還像新娘。我一直安慰自己恢筝,他們只是感情好哀卫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撬槽,像睡著了一般此改。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侄柔,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天共啃,我揣著相機(jī)與錄音,去河邊找鬼暂题。 笑死移剪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薪者。 我是一名探鬼主播纵苛,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啸胧!你這毒婦竟也來了赶站?” 一聲冷哼從身側(cè)響起幔虏,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤纺念,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后想括,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陷谱,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烟逊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渣窜。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宪躯,靈堂內(nèi)的尸體忽然破棺而出乔宿,到底是詐尸還是另有隱情,我是刑警寧澤访雪,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布详瑞,位于F島的核電站,受9級(jí)特大地震影響臣缀,放射性物質(zhì)發(fā)生泄漏坝橡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一精置、第九天 我趴在偏房一處隱蔽的房頂上張望计寇。 院中可真熱鬧,春花似錦脂倦、人聲如沸番宁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贝淤。三九已至,卻和暖如春政供,著一層夾襖步出監(jiān)牢的瞬間播聪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工布隔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留离陶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓衅檀,卻偏偏與公主長得像招刨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哀军,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容