Docker 學習筆記(三):數據、網絡、系統權限、docker-compose

1、Docker 數據管理

Docker 持久化數據有兩種方式:html

  1. 使用數據卷:更安全,和主機耦合度低
  2. 將主機的目錄掛載到容器中:更方便,主機和容器能夠很方便地交換數據。

數據卷相關的命令:python

docker volume create <volume name>  # 新建數據卷
docker volume ls  # 列出全部數據卷
docker volume inspect <volume name>  # 查看數據卷信息
docker volume rm <volume name>  # 刪除數據卷
docker volume prune  # 清除全部未掛載的數據卷

數據卷/文件夾的掛載命令:linux

# 1. 掛載數據卷
docker run -d -P \
    --name web \
    # -v my-vol:/wepapp \
    --mount source=my-vol,target=/webapp \
    training/webapp \
    python app.py


# 2. 掛載宿主機的文件夾
docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp:ro \
    --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
    training/webapp \
    python app.py

# P.S. 之前是使用 -v 參數,如今推薦使用 --mount

2、網絡

1. 外部訪問容器

使用端口映射 -p <宿主機端口>:<容器端口>(該參數可重複屢次使用),或者 -P 將容器 EXPOSE 出來的端口隨機映射到宿主機。git

2. 容器之間的互聯

比較方便的方案,是將容器加入自定義的 Docker 網絡以實現多容器互聯。github

  1. 新建自定義網絡
docker network create --driver=bridge  <net name>  # 新建自定義網絡,使用 bridge 模式
  1. 在運行容器時,經過 docker run --network=<net name> --name <container name> ... 將容器添加到該自定義網絡

而後在其中一個容器中 ping <container name>,該名稱會直接被解析到對應的容器 ip。這樣,容器之間就能以容器名稱爲 hostname 互聯。web

  1. 經過 docker container inspect 可獲知容器在 docker0 上的 ip 地址,容器之間能夠經過該 ip 通訊。
    • 缺點:ip 是動態分配的!每次都要手動配。。

若是容器較多,推薦使用 docker-compose 進行編排。docker

3. 容器訪問宿主機網絡

從 Docker 對這種鏈接方式的支持來看,顯然是很不推薦用戶這麼幹的。shell

可是對我的用戶而言,從容器訪問宿主機,我以爲仍是個挺常見的需求。安全

可用方法以下:網絡

  1. 經過宿主機的公網 ip 訪問宿主機
    • 缺點:宿主機須要向公網開放對應的端口。
  2. 在運行容器時指定 --network=host,容器與宿主機共用網絡
    • 缺點:容器與宿主機耦合度太高。並且可能出現端口衝突。
  3. 經過 ip addr show docker0 查看宿主機在網橋 docker0 上的 ip 地址(linux 下通常爲 172.17.0.1),容器可經過該 ip 訪問宿主機。
    • 缺點:不一樣宿主機在 docker0 上可能具備不一樣的 ip,須要運行時手動配置。
  4. 經過 shell 腳本獲取 host ip:參見 Docker for Linux - Support host.docker.internal DNS name to host
  5. special DNS record for host.docker.internal + gateway.docker.internal 被 merged,就能直接使用 host.docker.internal 訪問宿主機了。

3、系統權限

一個系統上的 docker 容器,默認狀況下是沒法修改系統的公共內核參數的。這是一種隔離機制。

若是某個容器抽風把系統參數改得一團糟,那全部容器都會崩潰,沒有人會但願碰到這種狀況。

可是有的時候,咱們確實須要在容器內修改整個系統的某些參數。好比在測試系統的時候,咱們系統直接修改整個系統的時間,而後查看咱們的應用可否應對這種問題。

爲了知足這種需求,Docker 提供了一組參數用來給容器設置額外的權限。

Docker 容器的隔離是基於 Linux 的 Capability 機制實現的, Linux 的Capability 機制容許你將超級用戶相關的高級權限劃分紅爲不一樣的小單元. 目前 Docker 容器默認只用到瞭如下的 Capability:

CHOWN, 
DAC_OVERRIDE, 
FSETID, 
FOWNER, 
MKNOD, 
NET_RAW, 
SETGID,  
SETUID, 
SETFCAP, 
SETPCAP, 
NET_BIND_SERVICE, 
SYS_CHROOT, 
KILL, 
AUDIT_WRITE

使用 --cap-add, --cap-drop 能夠添加或禁用特定的權限。

而要修改系統時間須要有 SYS_TIME 權限,因此咱們在運行容器時須要添加參數 --cap-add SYS_TIME

而後在容器裏運行 date --set "time-string",就能修改掉整個系統的時間。

P.S. --privileged 參數也能夠達到開放權限的做用, 與 --cap-add 的區別就是, --privileged 是將全部權限給容器,這至關危險!

4、docker-compose

用於編排多個容器,管理容器集羣之間的協做關係。

國內安裝鏡像:docker: install-compose

經常使用命令

  1. docker-compose up:
    • (推薦在測試時使用)新建並啓動容器,聚合輸出容器組中全部容器的 logs,命令結束時(ctrl+c),會 stop 掉整個容器組。
    • (在生產環境下要添加該選項!)在 -d 模式(detached,分離模式)下運行。與默認行爲的差異在與,命令結束後,容器組中的容器仍然會繼續運行。
  2. docker-compose start: 啓動終止的容器組。

docker-compose 大部分命令都和 docker 徹底相似。只是它是集羣版本。

docker-compose.yml 模板

Docker Compose 模板文件

參考

相關文章
相關標籤/搜索