一、docker-compose 常用命令和指令
1. 概要
默認的模板文件是 docker-compose.yml
,其中定義的每個服務可以通過 image
指令指定鏡像或 build
指令(需要 Dockerfile)來自動構建。
注意如果使用 build
指令,在 Dockerfile
中設置的選項(例如:CMD
, EXPOSE
, VOLUME
, ENV
等) 將會自動被獲取,無需在 docker-compose.yml
中再次設置。如果設置了會被YML覆蓋
2. 常用的docker-compose命令
命令 | 描述 |
---|---|
docker-compose up -d | 構建建啟動容器 |
docker-compose exec bash | 登錄到容器中 |
docker-compose down | 刪除所有容器,鏡像 |
docker-compose ps | 顯示所有容器 |
docker-compose restart | 重新啟動容器 |
docker-compose run --no-deps --rm php-fpm php -v | 在php-fpm中不啟動關聯容器,并容器執行php -v 執行完成后刪除容器 |
docker-compose build | 構建鏡像 |
docker-compose build --no-cache | 不帶緩存的構建 |
docker-compose logs | 查看的日志 |
docker-compose logs -f | 驗證(docker-compose.yml)文件配置,當配置正確時,不輸出任何內容,當文件配置錯誤,輸出錯誤信息 |
docker-compose pause | 暫停容器 |
docker-compose unpause | 恢復容器 |
docker-compose rm | 刪除容器(刪除前必須關閉容器) |
docker-compose stop | 停止容器 |
docker-compose start | 啟動容器 |
2.1、image
說明
指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,
Compose
將會嘗試拉去這個鏡像。
栗子
image: ubuntu
image: mysql:5.7.22
2.2、build
說明
指定
Dockerfile
所在文件夾的路徑。Compose
將會利用它自動構建這個鏡像,然后使用這個鏡像。
栗子
build: ./
build: ./web/
2.3、command
說明
覆蓋容器啟動后默認執行的命令。
栗子
command:
? ? ? --default-authentication-plugin=mysql_native_password
? ? ? --character-set-server=utf8mb4
? ? ? --collation-server=utf8mb4_general_ci
? ? ? --explicit_defaults_for_timestamp=true
? ? ? --lower_case_table_names=1
2.4、links
說明
鏈接到其它服務中的容器。使用服務名稱(同時作為別名)或服務名稱:服務別名
(SERVICE:ALIAS)
格式都可以。
栗子
links:
?- mysql
?- db:database
?- redis
使用的別名將會自動在服務容器中的 /etc/hosts
里創建。例如:
172.17.2.111 ?db
172.17.2.112 ?database
172.17.2.113 ?redis?
2.5、external_links
說明
鏈接到 docker-compose.yml 外部的容器,甚至 并非
Compose
管理的容器。參數格式跟links
類似。
栗子
?external_links:
?- redis
?- web_db_mysql:mysql
?- web_db_oracle:oracle
?- web_db_oracle:postgre
2.6、ports
說明
暴露端口信息。使用宿主:容器
(HOST:CONTAINER)
格式或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。
栗子
ports:
?- "6379"
?- "8000:8000"
?- "46200:22"
?- "127.0.0.1:8080:8080"
注:當使用 HOST:CONTAINER 格式來映射端口時,如果你使用的容器端口小于 60 你可能會得到錯誤得結果,因為 YAML 將會解析 xx:yy 這種數字格式為 60 進制。所以建議采用字符串格式。 ?
2.7、expose
說明
暴露端口,但不映射到宿主機,只被連接的服務訪問。可以指定內部端口為參數
栗子
expose:
?- "3307"
?- "6380"
2.8、volumes
說明
卷掛載路徑設置。可以設置宿主機路徑 (
HOST:CONTAINER
) 或加上訪問模式 (HOST:CONTAINER:ro 或者rw
)。
栗子?
volumes:
?- ./mysql/data:/var/lib/mysql?
?- ./configs:/etc/configs/:ro?
2.9、volumes_from
說明
從另一個服務或容器掛載它的所有卷。
栗子
volumes_from:
?- service_name
?- container_name
2.10、environment
說明
設置環境變量。只給定名稱的變量會自動獲取它在 Compose 主機上的值,可以用來防止泄露不必要的數據。
栗子
?environment:
?? ? ?MYSQL_ROOT_PASSWORD: root
?? ? ?TZ: Asia/Shanghai
2.11、networks
說明
用于設置指定網絡,子標簽aliases用于設置服務別名,相同的別名可以在不同的網絡中擁有不同的識別別名。
可以在service中使用,也可以在頂級標簽中使用
栗子
services:
? some-service:
? ? networks:
? ? ? some-network:
? ? ? ? aliases:
? ? ? ? ?- alias1
? ? ? ? ?- alias3
? ? ? other-network:
? ? ? ? aliases:
? ? ? ? ?- alias2
# 定義網絡 ? ? ? ??
networks:
? ?default:
? ? external:
? ? ? name: app
二、Docker Compose-網絡設置
一、概述
隨著微服務的事件,應用的越來越多, 經常會碰到需要多個容器共同協作, 這樣就需要多個容器之間能夠互相訪問。Docker提供了映射容器端口到宿主機和容器互聯機制來為容器提供網絡服務。隨著 docker 的快速發展,其網絡架構也在不斷的演進。
二、容器網絡模型(了解)
Docker在 1.9 版本中引入了一整套的 docker network 子命令和跨主機網絡支持。允許用戶可以根據他們應用的拓撲架構創建虛擬網絡并將容器接入其所對應的網絡。網絡部分代碼就已經被抽離并單獨成為了 docker 的網絡庫(libnetwork)。在此之后,容器的網絡模式也被抽象變成了統一接口的驅動。 為了標準化網絡驅動的開發步驟和支持多種網絡驅動,docker 公司在 libnetwork 中使用了 CNM(Container Network Model)。CNM 定義了構建容器虛擬化網絡的模型,同時還提供了可以用于開發多種網絡驅動的標準化接口和組件
CNM的理念是提供可以跨不同網絡基礎架構可實現移植的應用。這個模型平衡了應用的可移植性同時不會損失基礎架構原有的各種特性和功能。
CNM主要有三部分組成
-
沙箱(SandBox)--一個沙箱包含了容器的網絡配置。這里包括了容器接口的管理,路由表,和DNS設定。一個沙箱可以包含多個來自不同網絡的端點,可以同時連接多個網絡。
-
端點(Endpoint)--沙箱通過端點來連接網絡。端點結構的存在使到應用與網絡的連接實現虛擬化。這樣有助于維護應用的可移值性,因此一個服務可以在無須知道如何去連接網絡的情況下使用不同類型的網絡驅動。
-
網絡(Network)--CNM并不是OSI模型中說的網絡層。而是由Linux橋接,VLan等來實現。網絡收集了所有連接在其上的端點,并實現了這些端點的互連。端點如果不連接到其中一個網絡,那么將無法與外界連接。
CNM驅動接口
容器連網模型提供了兩個可拔插且開放的接口供用戶使用,這些接口是用于通訊,利用供應商提供的附加功能,網絡可見性,或網絡控制等方面。目前存在以下網絡驅動:
-
網絡驅動(Network Drivers)--Docker網絡驅動提供了使網絡可以工作的具體實現。他們是可拔插的,所以很易于支持不同的用戶使用場景。多個網絡驅動可同時用于指定的Docker引擎和群集。有以下兩個廣泛使用的CNM網絡驅動:
-
內置網絡驅動(Native Network Drivers)--內置網絡驅動是內置于Docker引擎,并隨Docker提供的驅動。有多個驅動可供選擇,以支持不同的功能,如overlay網絡和local bridge網絡。
-
遠程網絡驅動(Remote Network Drivers)--遠程網絡驅動是由社區或其它供應商建立的網絡驅動。這些驅動可用于與現有的軟件或硬件環境進行集成。用戶也可以建立自己的網絡驅動以達成各種特殊需求。
-
-
IPAM(IP地址管理)驅動--Docker有一個內置的IP地址管理驅動,在沒有特別指定IP的情況下,它會為網絡和端點提供了默認的子網或IP地址。IP地址通過網絡(docker network create),容器(docker container create)和服務(docker service create)創建指令來人工分配。遠程IPAM驅動也存在和提供了集成到現有IPAM的工具。
Docker內置網絡驅動
Docker內置網絡驅動是Docker引擎的一部份不需要任何額外模塊。他們可以被docker network命令所調用。以下是現存的內置網絡驅動:
驅動 | 描述 |
---|---|
Host | 沒有命名空間隔離,主機上的所有接口都可以直接被容器使用。 |
Bridge | 受Docker管理的Linux橋接網絡。默認在同一個bridge網絡的容器都可以相互通迅。 容器的外部訪問也可以使用bridge驅動來設置。 |
Overlay | 提供多主機的容器網絡互連。同時使用了本地Linux橋接網絡和VXLAN技術實現容器之間跨物理網絡架構的連接。 |
MACVLAN | 使用MACVLAN橋接模式建立容器接口和主機接口之間的連接。實現為容器提供在物理網絡中可路由的IP地址。 此外VLAN可以被中繼至macvlan驅動以強制實現容器的2層分段。 |
None | 容器具有屬于自己的網絡棧和網絡命名空間,但并在容器內添加網絡接口。如沒有其它的設置,則容器將完全獨立于其它網絡。 |
參考文章
https://success.docker.com/article/networking
Docker網絡體系結構:設計可擴展、可移植的Docker容器網絡-CSDN博客
三、Docker Compose-網絡設置二
一、概述
默認情況下,Compose 會為我們的應用創建一個網絡,服務的每個容器都會加入該網絡中。這樣,容器就可被該網絡中的其他容器訪問,不僅如此,該容器還能以服務名稱作為 Hostname 被其他容器訪問。
默認情況下,應用程序的網絡名稱基于 Compose 的工程名稱,而項目名稱基于 docker-compose.yml
所在目錄的名稱。如需修改工程名稱,可使用 --project-name
標識或 COMPOSE_PORJECT_NAME
環境變量。
假如一個應用程序在名為 myapp 的目錄中,并且 docker-compose.yml
如下所示:
version: '3'
services:
? web:
? ? build: .
? ? ports:
? ? ? - "8000:8000"
? db:
? ? image: mysql?
當我們運行 docker-compose up
時,將會執行以下幾步:
-
創建一個名為 myapp_default 的網絡
-
使用 web 服務的配置創建容器,它以 web 這個名稱加入網絡 myapp_default
-
使用 db 服務的配置創建容器,它以 db 這個名稱加入網絡 myapp_default
容器間可使用服務名稱(web 或 db)作為 Hostname 相互訪問。例如,web 這個服務可使用 postgres://db:5432
訪問 db 容器。
當服務的配置發生更改時,可使用 docker-compose up
命令更新配置。此時,Compose 會刪除舊容器并創建新容器。新容器會以不同的 IP 地址加入網絡,名稱保持不變。任何指向舊容器的連接都會被關閉,容器會重新找到新容器并連接上去。
二、使用 links
默認情況下,服務之間可使用服務名稱相互訪問。links 允許我們定義一個別名,從而使用該別名訪問其他服務。
version: '2'
services:
? web:
? ? build: .
? ? links:
? ? ? - "db:database"
? db:
? ? image: postgres?
三、自定義網絡
一些場景下,默認的網絡配置滿足不了我們的需求,此時我們可使用 networks 命令自定義網絡。networks 命令允許我們創建更加復雜的網絡拓撲并指定自定義網絡驅動和選項。不僅如此,我們還可使用 networks 將服務連接到不是由 Compose 管理的、外部創建的網絡。
version: '3'
services:proxy:build: nginxnetworks:- frontapp:build: ./appnetworks:- front- backdb:image: postgresnetworks:- backnetworks:front:# Use a custom driverdriver: custom-driver-1back:# Use a custom driver which takes special optionsdriver: custom-driver-2driver_opts:foo: "1"bar: "2"
其中,proxy 服務與 db 服務隔離,兩者分別使用自己的網絡;app 服務可與兩者通信。使用 networks 命令,即可方便實現服務間的網絡隔離與連接。 ?
四、配置默認網絡
version: '3'
services:web:build: .ports:- "8000:8000"db:image: postgresnetworks:default:driver: custom-driver-1
?這樣,就可為該應用指定自定義的網絡驅動。
五、已存在的網絡
我們可以預先創建一個名為 myapp 的網絡,讓 Compose 加入這個新創建的網絡,使所有 Compose 可以通信,此時使用 external 選項。
# 創建網絡
docker network create <Network Name>
# 查看已存在的網絡
docker network list
networks:
? default:
? ? external:
? ? ? name: web?
四、Docker 可視化
一、Docker常見的幾款web工具:
-
portainer(常用)
-
docker UI
-
shipyard
二、什么是Portainer?
Portainer是Docker的圖形化管理工具,提供狀態顯示面板、應用模板快速部署、容器鏡像網絡數據卷的基本操作(包括上傳下載鏡像,創建容器等操作)、事件日志顯示、容器控制臺操作、Swarm集群和服務等集中管理和操作、登錄用戶管理和控制等功能。功能十分全面,基本能滿足中小型單位對容器管理的全部需求
三、安裝
下載鏡像
docker pull portainer/portainer-ce?
運行Portainer(單機版)
docker ?run -d \
?-p 9000:9000 \
?-v /var/run/docker.sock:/var/run/docker.sock \
?portainer/portainer-ce?
訪問 http://localhost:9000/
?
設置管理員密碼
?