之前講解過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部署應用一般需要下面幾個步驟:
-
用dockerfile,或者鏡像定義應用程序所依賴的環境,以便在任何地方都可以直接複製。
-
在docker-compose.yaml中定義應用程序需要的服務,以便這些服務可以在單獨的環境中一起運行。
-
運行docker-compose build 安裝應用程序所需要的服務鏡像。
-
運行docker-compose up -d 啓動並在後臺運行整個應用程序。
-
運行docker compose down 停止整個應用程序。
下面我們來詳細講解上面的四個步驟。
docker-compose部署Spring Boot+Nginx+Redis+Mysql實戰
歷經了一個月,終於將個人的博客發佈上線了,原來準備用傳統的方式先草草上線,可是對於一個對前沿技術有強迫症的開發者來說,哪怕不精通不擅長,至少要懂點皮毛,要在別人聊起的時候至少能聽懂,於是果斷換了docker方式部署,可部署過程中發現既然都已經開始了,索性就再爲難自己一下,乾脆一次性到位好了,直接用compose方式。其實人很多時候都是在“爲難自己”的過程中成長,只要你勇敢的邁出第一步。
好了,廢話少說,在大概的看了官方文檔,又谷哥度娘了幾篇相關文章,在失敗了7次,解決了4個問題之後,最終如願使用compose方式上線成功,下面就將整個過程記錄下來和大家分享,所有步驟都經過本人親測,希望對碼之初的鄉親們也有幫助。
一、看一下完整的目錄結構
下面的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文件夾詳解
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
友情提示:
-
直接使用scp拷貝文件提示無權限的時候,需要加上一個-r就可以了。
-
mzc:/usr/local/server:這兒我直接使用的遠程服務器別名,是不是很方便,感興趣的可以看我這篇公衆號:ssh使用別名免密登錄遠程服務器
2、給log文件夾加上所有權限,然後重啓一下docker服務
3、使用docker-compose build構建服務
4、使用docker-compose up -d 啓動並在後臺運行yaml中定義的所有服務
至此,使用compose方式部署Spring Boot+Nginx+Redis+Mysql服務全部完成,訪問博客主頁http://www.mazhichu.cn,看到可以成功訪問。
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一些基礎知識,整個部署過程花了我整整一天的時間,從看文檔到查資料再到不斷試錯,最終又花了半天時間總結寫這篇文章。說了這麼多,只是想表達如果你想學習一門語言或者技術,那你就必須走近它,必須動手嘗試纔能有真正的成長和體驗,就跟你看到一個漂亮的高冷小姐姐一樣,你只有走近她纔有接觸的機會,只有敢於追求才有成功脫單的機會,道理是一樣一樣的。最後,原創不易,如果鄉親們覺得本文不錯,麻煩幫忙右下角點個在看或者分享給其他有需要的人,這就是給我最大的鼓勵和堅持原創的動力了,謝謝!