目錄
- 簡介
- docker的資料管理
- 資料卷
- 創建資料卷
- 查看資料卷
- 洗掉資料卷
- 將資料卷掛在到容器上
- 查看資料卷的具體資訊
- docker容器資料管理
- dockerfile共享資料卷指令
- 資料卷
- docker的網路管理
- docker開放埠
- docker開放埠命令
- dockerfile開放網路埠指令
- 二者的區別
- docker的網路模式
- bridge(橋接網路)
- none
- host
- 指定自定義網路(常用)
- docker開放埠
- docker-compose的使用
- 介紹
- 相關命令
- 安裝
- 使用
- 示例
- 小結
- 參考資料
簡介
從上一篇Docker快速入門(上),我們學習和了解了docker的安裝和常用的命令,也嘗試了如何通過一個dockerfile檔案,可以快速創建一個docker鏡像檔案.也了解了docker鏡像的結構.
在本小節中,我們將學習到docker如何管理自己的資料和如何讓外部網路訪問到docker容器以及如何快速構建多個docker鏡像關聯.
docker的資料管理
資料卷
資料卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性
1. **資料卷**可以在容器之間共享和重用
2. 對**資料卷**的修改會立馬生效
3. 對**資料卷**的更新,不會影響鏡像
4. **資料卷**默認會一直存在,即使容器被洗掉
創建資料卷
命令 : docker volume create 自定義資料卷名稱
示例 : docker volume create my-vol

查看資料卷
命令 : docker volume ls

洗掉資料卷
命令 : docker volume rm 資料卷名稱
示例 : docker volume rm my-vol
將資料卷掛在到容器上
第一種(官方的)
命令 : docker run -itd -P --name 自定義容器名稱 --mount source=資料卷名稱(如:my-vol),target=/容器內部的檔案夾中(如:/webapp) 鏡像名:標簽
示例 : docker run -d -P --name web --mount source=my-vol,target=/webapp training/webapp python app.py
第二種命令方式(常用)
命令 : docker run -itd --name 自定義容器名稱 -v=資料卷名稱(如:my-vol):/容器內部的檔案夾中(如:/webapp) 鏡像名:標簽
示例 : docker run -d -P --name web -v my-vol:/wepapp python app.py

查看資料卷的具體資訊
命令 : docker inspect 自定義的容器名稱(如:web)
示例 : docker inspect web

docker容器資料管理
在生產環境中,關于資料卷一般采用的宿主機的檔案路徑,作為資料卷.用來掛載到容器上.這樣做的好處是,便于更新和修改應用程式
示例 : -v 宿主機檔案(/data/redis5):/容器(/var)
dockerfile共享資料卷指令

docker的網路管理
docker開放埠
對于docker里面的容器來說(也就是系統),
從系統來看是會獨立的網路,同時也會有獨立的ip,而如果說外部想要訪問的話就需要暴露埠;
可以通過dockerfile中EXPOSE引數或者 docker run -p 的方式,如下示意圖

docker開放埠命令
命令 : docker run -it -p 宿主機埠(如:81):容器埠(如:80) --name 容器名 鏡像名:標簽
示例 : docker run -itd -p 6379:6379 --name redis5 redis5:latest
dockerfile開放網路埠指令
指令 : EXPOSE 埠號(如:6379)
示例 : EXPOSE 6379

二者的區別
expose指令只是開放埠
用來指明容器內行程對外開放的埠,多個埠之間使用空替隔力,
運行容器通過引數-P(大寫)即可將EXPOSE里所指定的埠映射到主機上另外的隨機埠,容器或主機就可以通過映射后的埠與此容器通信,
同時,我們也可以通過-p (小寫)引數將dockerfile中EXPOSE中沒有列出的埠設定成公開的,
docker的網路模式
docker安裝后,默認會創建下面三種網路型別

bridge(橋接網路)
默認情況下啟動的Docker容器,都是使用 bridge,Docker安裝時創建的橋接網路,每次Docker容器重啟時,會按照順序獲取對應的IP地址,這個就導致重啟下,Docker的IP地址就變.如下圖

從上面的網路模型可以看出,容器從原理上是可以與宿主機乃至外界的其他機器通信的,
同一宿主機上,容器之間都是連接掉docker0這個網橋上的,它可以作為虛擬交換機使容器可以相互通信,
然而,由于宿主機的IP地址與容器的IP地址均不在同一個網段,不足以使宿主機以外的網路主動發現容器的存在,
為了使外 界可以方位容器中的行程,docker采用了埠系結的方式,也就是通過iptables的NAT,將宿主機上的埠埠流量轉發到容器內的埠上
在宿主機上,可以通過iptables -t nat -L -n,查到一條DNAT規則:
bridge模式的容器與外界通信時,必定會占用宿主機上的埠,從而與宿主機競爭埠資源,對宿主機埠的管理會是一個比較大的問題,
同時,由于容 器與外界通信是基于三層上iptables NAT,性能和效率上的損耗是可以預見的
none
無指定網路 使用 --network=none ,docker 容器就不會分配局域網的IP
host
主機網路 使用 --network=host,此時,Docker 容器的網路會附屬在主機上,兩者是互通的,
例如,在容器中運行一個Web服務,監聽8080埠,則主 機的8080埠就會自動映射到容器中

缺點:
1)最明顯的就是容器不再擁有隔離、獨立的網路堆疊,容器會與宿主機競爭網路堆疊的使用,并且容器的崩潰就可能導致宿主機崩潰,在生產環境中,這種問題可能是不被允許的,
2)容器內部將不再擁有所有的埠資源,因為一些埠已經被宿主機服務、bridge模式的容器埠系結等其他服務占用掉了
指定自定義網路(常用)
因為默認的網路不能制定固定的地址,所以我們將創建自定義網路,并指定網段:192.168.1.0/24 并命名為mynetwork
注意:這個網路段不要和宿主機的網路端沖突,不然會容易對宿主機產生影響
命令: docker network create --subnet=網路地址端(如:192.168.1.0/24) 自定義網路名稱(如: mynetwork)
示例 : docker network create --subnet=192.160.1.0/24 mynetwork


docker-compose的使用
這個工具是做什么呢?可以幫助我們快速的構建和對容器的啟動以及停止等操作
介紹
Compose是 Docker 的服務編排工具,誕生主要是來幫助開發或運維人員很好地管理docker容器;減少繁瑣的單個容器創建、洗掉等操作,比較適合組合使用多個容器進行開發的場景,
對于需要多個容器的操作,傳統的方式是一個個的創建及運行,而composer則只需要通過一次性把這些命令寫在docker-composer.yml檔案中,以后每次啟動這一整個環境的時候,只需要你只要敲一個 docker-composer up命令就ok了,
相關命令
docker-compose up -d # 啟動命令
docker-compose stop
docker-compose down
具體請參考這篇文章(https://www.cnblogs.com/minseo/p/11548177.html)
安裝
#下載安裝
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#修改權限
chmod +x /usr/local/bin/docker-compose
#安裝完成后可以查看版本
docker-compose --version

使用
docker-compose的默認模版檔案為: docker-compose.yml,
和Dockerfile一樣,它也是有自己的語法命令的,
其中定義的每個服務都必須通過image指令指定鏡像或build指令(需要Dockerfile)來自動構建,
其它大部分指令都跟docker run中的類似,
需要注意的是docker-composer運用的時候一定要注意版本的問題,如下圖顯示

示例
每個docker-compose.yml必須定義image或者build中的一個,其它的是可選的, image 指定鏡像tag或者ID
# 編排php,redis,nginx容器
version: "3.6" # 確定docker-composer檔案的版本
services: # 代表就是一組服務 - 簡單來說一組容器
nginx: # 這個表示服務的名稱,課自定義; 注意不是容器名稱
build: # 根據dockerfile構建鏡像及構建為容器
context: ./nginx
image: nginx # 指定容器的鏡像檔案
container_name: nginx_compose # 這是容器的名稱
ports: # 配置容器與宿主機的埠
- "82:80"
networks: ## 引入外部預先定義的網段
lrnp:
ipv4_address: 172.100.100.110 #設定ip地址
privileged: true # 執行特殊權限的命令
volumes: # 配置資料掛載
- /www/wwwroot/2007_SRM/00-1/lrnp/nginx/conf:/conf
working_dir: /conf #作業目錄
php: # 這個表示服務的名稱,課自定義; 注意不是容器名稱
build: # 根據dockerfile構建鏡像及構建為容器
context: ./php
image: php7 # 指定容器的鏡像檔案
container_name: php_compose # 這是容器的名稱
ports: # 配置容器與宿主機的埠
- "9002:9000"
networks: ## 引入外部預先定義的網段
lrnp:
ipv4_address: 172.100.100.120 #設定ip地址
volumes: # 配置資料掛載
- /www/wwwroot/2007_SRM/00-1/lrnp/php/www:/www
redis: # 這個表示服務的名稱,課自定義; 注意不是容器名稱
image: redis5asm # 指定容器的鏡像檔案
networks: ## 引入外部預先定義的網段
lrnp:
ipv4_address: 172.100.100.130 #設定ip地址
container_name: redis_compose # 這是容器的名稱
ports: # 配置容器與宿主機的埠
- "6380:6379"
volumes: # 配置資料掛載
- /www/wwwroot/2007_SRM/00-1/lrnp/redis:/redis
# command: top
# 設定網路模塊
networks:
# 使用之前定義的網路
lrnp:
external:
name: lrnp
# 自定義網路
# nginx_net:
# driver: bridge
# ipam: #定義網段
# config:
# - subnet: "172.15.22.0/24"

小結
在本小節中,我們學習了docker如何管理它自己的資料.即通過創建資料卷或者跟宿主機檔案夾進行掛在關聯.
也知道了如何讓外部網路訪問到docker,即通過開放埠.
也明白了如何讓各個容器進行互聯互通,是通過自定義網路段來進行內部互通.
最后,為了能更快速的管理多個docker鏡像/容器,我們也學習docker-compose,用來管理
參考資料
<<docker從入門到實踐>>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/457606.html
標籤:其他
上一篇:LeetCode 84.柱狀圖中最大的矩形 | 單調堆疊的使用 | 解題思路及演算法 Java
下一篇:如何提取折扣(%off)值?
