原文: https://blog.csdn.net/weixin_71429850/article/details/127437081
# Docker之compose介紹
前言
使用一個Dockerfile模板文件可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排。下面介紹Docker官方產品,Docker Compose。
Dockerfile可以讓用戶管理一個單獨的應用容器,而compose則允許用戶在一個模板(yaml格式)中定義一組相關聯的應用容器(被稱為一個project,即項目)
例如一個web服務再加上后端的數據庫服務容器等。
一、Docker-compose簡介
1、docker-compose基礎概念
docker-compose項目是docker官方的開源項目, 負責實現對docker容器集群的快速編排。
docker-compose將所管理的容器分為三層, 分別是工程(project),服務(service)以及容器(containner)
docker-compose運行目錄下的所有文件(docker-compose.yml文件、extends文件或環境變量等)組成一個工程,如無特殊指定,工程名即為當前目錄名。
一個工程當中,可以包含多個服務,每個服務中定義了容器運行的鏡像、參數、依賴。
一個服務中可以包括多個容器實例,docker-compose并沒有解決負載均衡的問題。因此需要借助其他工具實現服務發現及負載均衡,比如consul。
docker-compose的工程配置文件默認為docker-compose.yml。可以通過環境變量COMPOSE_FILE -f 參數自定義配置文件,其自定義多個有依賴關系的服務及每個人服務運行的容器。
2、為什么要使用docker-compose
使用一個Dockerfile模板文件,可以讓用戶很方便的定義一個單獨應用容器。在工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況,例如要實現一個web項目,除了web服務容器本身,往往還需要再加上后端的數據庫服務容器,甚至還包括負載均衡容器等。
compose允許用戶通過一個單獨docker-compose.yml模板文件(YAML格式)來定義一組相關聯的應用容器為一個項目(project)
docker-compose項目由pypthon編寫,調用docker服務提供的API來對容器進行管理,因此, 只要所操作的平臺支持docker-API,就可以在其上利用conpose來進行編排管理。
簡單來說:就是來管理多個容器的,定義啟動順序的,合理編排,方便管理。
二、YAML文件格式及編寫注意事項
1、YAML文件格式
YAML是一種標記性語言,它可以很直觀的展示數據序列化格式,可讀性高。
類似于json數據描述語言,但是語法要比json簡單很多。
YAML數據結構通過縮進來表示,連續的項目通過減號來表示,鍵值對用冒號分隔,數組用中括號[ ] 括起來,bash用花括號{ } 括起來。
2、YAML格式的注意事項
不支持制表符tab鍵縮進,只能使用空格縮進
通常開頭縮進2個空格
字符后縮進1個空格,如冒號【:】、逗號【,】、橫杠【-】
用#號表示注釋
如果包含特殊字符用單引號【’ '】引起來作為普通字符,如果用雙引號【“ ”】表示特殊字符本身的意思,
布爾值必須用【“ ”】括起來
YAML區分大小寫
3、YAML數據結構案例
#鍵值對表示
animal:pets
#數組:一組按次序排列的列表
- cat
- dog
- goldfish
#布爾值
debug: "true"
debug: "false"
#yaml實例
languages: #序列的映射
- java
- Golang
- Python
websites: #映射的映射
Baidu: www.baidu.com
Wangyi: www.163.com
Souhu: www.souhu.com
#或者
languages: ["java","Golong","Python"]
websites:
Baidu:
www.baidu.com
Wangyi:
www.163.com
Souhu:
www.souhu.com
#Json格式
{
languages: [
'Java',
'Golong',
'Python',
],
websites: [
Baidu: 'www.baidu.com',
Wangyi: 'www.163.com',
Souhu: 'www.souhu.com',
]
}
三、Docker Compose 配置常用字段
1、Docker Compose配置常用字段
字段 描述
build 指定Dockerfile文件名(要指定的Dockerfile文件需要在build標簽的子級標簽中用dockefile標簽指定)
dockerfile 構建鏡像上下文路徑
context 可以是dockerfile路徑,或者時執行git倉庫的url地址
images 指定鏡像(已存在)
command 執行命令,會覆蓋容器啟動后默認執行的命令(會覆蓋dockefile中的CMD指令)
container_name 指定容器名稱,由于容器名稱是唯一的,如果指定自定義名稱,則無法scale指定容器數量。
deploy 指定部署和運行服務相關配置,只能在swarm模式使用
environment 添加環境變量
networks 加入網絡,引用頂級networks下條目
network-mode 設置容器的網絡模式
ports 暴露容器端口,與-p相同,但是端口不能低于60
volumes 掛載一個宿主機目錄或命令卷到容器,命令卷要在頂級volumes定義卷名稱
volumes_from 從另一個服務或容器掛載卷,可選參數:ro和rw(僅版本‘2’支持)
hostname 在容器內設置內核參數
links 連接誒到另一個容器,- 服務名稱[ : ]
privileged 用來給容器root權限,注意是不安全的,true
restart 重啟策略,定義是否重啟容器1、no,默認策略,在容器退出時不重啟容器2、on-failure,在容器非正常退出時(退出狀態非0),才會重啟容器3、on-failure:3 在容器非正常退出時,重啟容器,最多重啟3次4、always,在容器退出時總是重啟容器,5、unless-stopped,在容器退出時總是重啟容器,但是不考慮在Docker守護進程啟動時就已經停止了的容器。
depends_on 此標簽用于解決容器的依賴,啟動先后問題。如啟動應用容器,需要先啟動數據庫容器。php:depends_on:- apache- mysql
2、Docker-compose常用命令
運行這些命令需要結合docker-compose一起使用。
且必須要在含有docker-compose.yml文件的目錄中才可以使用,不然報錯。
命令 描述
build 重新構建服務
ps 列出容器
up 創建和啟動容器
exec 在容器里面執行命令
scale 指定一個服務容器啟動數量
top 顯示正在運行的容器進程
logs 查看服務容器的輸出
down 刪除容器、網絡、數據卷和鏡像
stop/start/restart 停止/啟動/重啟服務
四、docker-compose安裝
docker-compose是docker的獨立產品,因此需要安裝docker之后再單獨安裝docker compose。
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#下載docker-compose文件
mv docker-compose /usr/local/bin
#將文件復制到/usr/local/bin環境變量下面
chmod +x /usr/local/bin/docker-compose
#給他一個執行權限
五、docker-compose部署nginx服務訪問自定義頁面
1、準備依賴文件
mkdir /root/compose_nginx yum install -y tree vim /root/compose_nginx/docker-compose.yml version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - 1216:80 - 1217:443 networks: - cluster volumes: - ./wwwroot:/usr/local/nginx/html networks: cluster:
[root@docker compose_nginx]# vim /root/compose_nginx/docker-compose.yml
[root@docker compose_nginx]# ls
docker-compose.yml
[root@docker compose_nginx]# mkdir nginx
[root@docker compose_nginx]# mkdir wwwroot
[root@docker compose_nginx]# ls
docker-compose.yml nginx wwwroot
[root@docker compose_nginx]# echo "liyong xuexijiugenwanyiyang" > wwwroot/index.html
[root@docker compose_nginx]# cat wwwroot/index.html
liyong xuexijiugenwanyiyang
[root@docker compose_nginx]# cd nginx
[root@docker nginx]# ls
[root@docker nginx]# rz -E
rz waiting to receive.
[root@docker nginx]# ls
nginx-1.20.2.tar.gz
mkdir -p /opt/compose_nginx/nginx
cd /opt/compose_nginx/nginx
#上傳nginx的包
vim Dockerfile
FROM centos:7
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.15.9.tar.gz /usr/local/src
WORKDIR /usr/local/src/nginx-1.15.9
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module &> /dev/null
RUN make -j 4 && make install &> /dev/null
RUN ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#ENV PATH /usr/local/nginx/sbin/:PATH
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
CMD ["/usr/local/nginx/sbin/nginx"]
2、編寫配置文件docker-compose.yml文件
cd /opt/compose_nginx
vim docker-compose.yml
version: '3' #定義編排版本,共3版(1,2,3),1被淘汰,2的話只能單機編排,3的話即可以實現單機編排,也可以實現多機編排。
services: #定義服務
nginx: #定義nginx服務
hostname: nginx #容器的主機名為nginx
build: #定義創建容器的過程 //如果有線程的鏡像,直接寫images:
context: ./nginx #指定創建容器的目錄位置(存儲dockerfile的目錄)
dockerfile: Dockerfile #指定Dockerfile文件
ports: #定義端口
- 1234:80 #暴露端口
- 4321:443 #暴露端口
networks: #指定網絡
ydq: #指定網絡名稱
ipv4_address: 172.100.0.10 #指定ip地址
volumes: #數據卷,掛載目錄
- ./wwwroot:/usr/local/nginx/html #前面宿主機,后面容器
networks: #自定義網絡
ydq: #自定義網絡名稱
driver: bridge #自定義網絡模式
ipam: #網絡管理器
config: #配置參數
- subnet: 172.100.0.0/16 #配置子網網段
//networks的參數ipam即網絡管理,其下還有driver參數即指定使用的網絡模式,以及config配置參數(比如配置子網等)
echo "this is ydq" >/opt/compose_nginx/wwwroot/index.html
3、生成鏡像容器
4、查看目錄結構
yum -y install tree &>/dev/null
cd /opt/compose_nginx
tree
docker-compose -f docker-compose.yaml up -d //-f調用文件。-d:開啟守護進程
docker network ls
docker ps -a
docker-compose ps
5、訪問測試
curl 192.168.100.3:1234
或者
網頁訪問:http:192.168.100.3:1234
- Golang
- Beego框架
- Gin框架
- gin框架介紹
- 使用Gin web框架的知名開源線上項目
- go-admin-gin
- air 熱啟動
- 完整的form表單參數驗證語法
- Go 語言入門練手項目推薦
- Golang是基于多線程模型
- golang 一些概念
- Golang程序開發注意事項
- fatal error: all goroutines are asleep - deadlock
- defer
- Golang 的內建調試器
- go部署
- golang指針重要性
- 包(golang)
- Golang框架選型比較: goframe, beego, iris和gin
- GoFrame
- golang-admin-項目
- go module的使用方法及原理
- go-admin支持多框架的后臺系統(go-admin.cn)
- docker gocv
- go-fac
- MSYS2
- 企業開發框架系統推薦
- gorm
- go-zero
- 優秀系統
- GinSkeleton(gin web 及gin 知識)
- 一次 request -> response 的生命周期概述
- 路由與路由組以及gin源碼學習
- 中間件以及gin源碼學習
- golang項目部署
- 獨立部署golang
- 代理部署golang
- 容器部署golang
- golang交叉編譯
- goravel
- kardianos+gin 項目作為windows服務運行
- go env
- 適用在Windows、Linux和macOS環境下打包Go應用程序的詳細步驟和命令
- Redis
- Dochub
- Docker部署開發go環境
- Docker部署運行go環境
- dochub說明
- Vue
- i18n
- vue3
- vue3基本知識
- element-plus 表格單選
- vue3后臺模板
- Thinkphp
- Casbin權限控制中間件
- 容器、依賴注入、門面、事件、中間件
- tp6問答
- 偽靜態
- thinkphp-queue
- think-throttle
- thinkphp隊列queue的一些使用說明,queue:work和queue:listen的區別
- ThinkPHP6之模型事件的觸發條件
- thinkphp-swoole
- save、update、insert 的區別
- Socket
- workerman
- 介紹
- 從ThinkPHP6移植到Webman的一些技術和經驗(干貨)
- swoole
- swoole介紹
- hyperf
- hf官網
- Swoft
- swoft官網
- easyswoole
- easyswoole官網地址
- EASYSWOOLE 聊天室DEMO
- socket問答
- MySQL
- 聚簇索引與非聚簇索引
- Mysql使用max獲取最大值細節
- 主從復制
- 隨機生成20萬User表的數據
- MySQL進階-----前綴索引、單例與聯合索引
- PHP
- 面向切面編程AOP
- php是單線程的一定程度上也可以看成是“多線程”
- PHP 線程,進程、并發、并行 的理解
- excel數據畫表格圖片
- php第三方包
- monolog/monolog
- league/glide
- 博客-知識網站
- php 常用bc函數
- PHP知識點的應用場景
- AOP(面向切面編程)
- 注解
- 依賴注入
- 事件機制
- phpspreadsheet導出數據和圖片到excel
- Hyperf
- mineAdmin
- 微服務
- nacos注冊服務
- simps-mqtt連接客戶端simps
- Linux
- 切換php版本
- Vim
- Laravel
- RabbitMQ
- thinkphp+rabbitmq
- 博客
- Webman框架
- 框架注意問題
- 關于內存泄漏
- 移動端自動化
- 懶人精靈
- 工具應用
- render
- gitlab Sourcetree
- ssh-agent失敗 錯誤代碼-1
- 資源網站
- Git
- wkhtmltopdf
- MSYS2 介紹
- powershell curl 使用教程
- NSSM(windows服務工具)
- MinGW64
- 知識擴展
- 對象存儲系統
- minio
- 雪花ID
- 請求body參數類型
- GraphQL
- js 深拷貝
- window 共享 centos文件夾
- 前端get/post 請求 特殊符號 “+”傳參數問題
- 什么是SCM系統?SCM系統與ERP系統有什么區別?
- nginx 日志格式統一為 json
- 特殊符號怎么打
- 收藏網址
- 收藏-golang
- 收藏-vue3
- 收藏-php
- 收藏-node
- 收藏-前端
- 規劃ITEM
- 旅游類
- 人臉識別
- dlib
- Docker&&部署
- Docker-compose
- Docker的網絡模式
- rancher
- DHorse
- Elasticsearch
- es與kibana都docke連接
- 4種數據同步到Elasticsearch方案
- GPT
- 推薦系統
- fastposter海報生成
- elasticsearch+logstash+kibana
- beego文檔系統-MinDoc
- jeecg開源平臺
- Java
- 打包部署
- spring boot
- 依賴
- Maven 相關 命令
- Gradle 相關命令
- mybatis
- mybatis.plus
- spring boot 模板引擎
- SpringBoot+Maven多模塊項目(創建、依賴、打包可執行jar包部署測試)完整流程
- Spring Cloud
- Sentinel
- nacos
- Apollo
- java推薦項目
- gradle
- Maven
- Nexus倉庫管理器
- Python
- Masonite框架
- scrapy
- Python2的pip2
- Python3 安裝 pip3
- 安全攻防
- 運維技術
- 騰訊云安全加固建議
- 免費freessl證書申請
- ruby
- homeland
- Protobuf
- GIT
- FFMPEG
- 命令說明
- 音頻
- ffmpeg合并多個MP4視頻
- NODEJS
- 開發npm包
- MongoDB
- php-docker-mongodb環境搭建
- mongo基本命令
- Docker安裝MongoDB最新版并連接
- 少兒編程官網
- UI推薦
- MQTT
- PHP連接mqtt
- EMQX服務端
- php搭建mqtt服務端