1. 程式人生 > >docker管理應用程序數據、容器網絡

docker管理應用程序數據、容器網絡

網絡模式 開發環境 訪問 cal -m -h comm bbc sco

管理應用程序數據

Docker提供三種方式將數據從宿主機掛載到容器中:

  • ? volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)。保存數據的最佳方式。
  • ? bind mounts:將宿主機上的任意位置的文件或者目錄掛載到容器中。
  • ? tmpfs:掛載存儲在主機系統的內存中,而不會寫入主機的文件系統。如果不希望將數據持久存儲在任何位置,可以使用
  • tmpfs,同時避免寫入容器可寫層提高性能。

管理卷:路徑都是在/var/lib/docker/volumes/下的,路徑不可改變

[root@docker ~]# docker volume create nginx-vol
nginx-vol
[root@docker ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol
[root@docker ~]# docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2018-11-26T15:25:23+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]

volumes

用卷創建一個容器:
[root@docker ~]# docker run -d --name=nginx-test1 --mount src=nginx-vol,dst=/usr/share/nginx/html -p 88:80 nginx:1.15
9d1d1fe4e0f189b8d66e7e6682ef725b441a355b7cb9e85ee62406249fcffd6d

[root@docker ~]# cd /var/lib/docker/volumes/nginx-vol/_data --這裏的數據卷是和容器中的是一樣的內容
[root@docker _data]# ls
50x.html index.html

[root@docker _data]# echo ‘nginx1‘ > index.html

驗證:
[root@docker _data]# curl 192.168.1.13:88
nginx1

註意:

  1. 如果沒有指定卷,自動創建。
  2. 建議使用--mount,更通用

Bind Mounts

用卷創建一個容器:指定type=bind --》這個是將宿主機上app/wwwroot 掛載到/usr/share/nginx/html 上
[root@docker _data]# docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html -p 88:80 nginx

驗證:
[root@docker wwwroot]# curl 192.168.1.13:88
nginx1
進入到了該容器:
root@de4cc3ad76a0:/# cd /usr/share/nginx/html/
root@de4cc3ad76a0:/usr/share/nginx/html# ls
index.html

註意:

  1. 如果源文件/目錄沒有存在,不會自動創建,會拋出一個錯誤。
  2. 如果掛載目標在容器中非空目錄,則該目錄現有內容將被隱藏。

小結

Volume特點:

  • ? 多個運行容器之間共享數據。
  • ? 當容器停止或被移除時,該卷依然存在。
  • ? 多個容器可以同時掛載相同的卷。
  • ? 當明確刪除卷時,卷才會被刪除。
  • ? 將容器的數據存儲在遠程主機或其他存儲上
  • ? 將數據從一臺Docker主機遷移到另一臺時,先停止容器,然後備份卷的目錄(/var/lib/docker/volumes/)

Bind Mounts特點:

  • ? 從主機共享配置文件到容器。默認情況下,掛載主機/etc/resolv.conf到每個容器,提供DNS解析。
  • ? 在Docker主機上的開發環境和容器之間共享源代碼。例如,可以將Maven target目錄掛載到容器中,每次在Docker主機
  • 上構建Maven項目時,容器都可以訪問構建的項目包。
  • ? 當Docker主機的文件或目錄結構保證與容器所需的綁定掛載一致時

容器網絡

網絡模式

bridge
–net=bridge
默認網絡,Docker啟動後創建一個docker0網橋,默認創建的容器也是添加到這個網橋中。
? host
–net=host
容器不會獲得一個獨立的network namespace,而是與宿主機共用一個。這就意味著容器不會有自己的網卡信息,而是使用宿主
機的。容器除了網絡,其他都是隔離的。
? none
–net=none
獲取獨立的network namespace,但不為容器進行任何網絡配置,需要我們手動配置。

? container   2個容器的網絡可以通訊   
–net=container:Name/ID
與指定的容器使用同一個network namespace,具有同樣的網絡配置信息,兩個容器除了網絡,其他都還是隔離的。
? 自定義網絡
與默認的bridge原理一樣,但自定義網絡具備內部DNS發現,可以通過容器名或者主機名容器之間網絡通信。

容器網絡訪問原理

技術分享圖片

技術分享圖片

驗證:
註意系統必須指定 -it 不然啟動失敗
[root@docker wwwroot]# docker run -itd --net=bridge --name=icar1 -h icar1 centos
90b9a40f6290e6136e438bab5dcbd2720ed1b2c0a7b9c6abaede64574d4831e8

[root@docker wwwroot]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90b9a40f6290 centos "/bin/bash" 4 seconds ago Up 3 seconds icar1
[root@docker wwwroot]# docker exec -it 90b9a40f6290 bash

docker管理應用程序數據、容器網絡