1. 程式人生 > 其它 >拓端tecdat|R語言用igraph繪製網路圖視覺化

拓端tecdat|R語言用igraph繪製網路圖視覺化

Docker映象

映象的概念

映象上一種輕量級、可執行的獨立軟體包, 用來打包軟體執行環境和基於執行環境開發的軟體, 它包含執行某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案。
所有應用, 直接打包docker映象,可以直接跑起來。

映象獲取

  • 從遠端倉庫下載
  • 從朋友拷貝
  • 自己製作一個映象DockerFile

Docker映象載入原理

UnionFS(聯合檔案系統)

UnionFS(聯合檔案系統):Union檔案系統(UnionFS)是一種分層、輕量級並且高效能的檔案系統, 它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unit several directories into a single virtual filestyle)。Union檔案系統是Docker映象的基礎。映象可以通過分層來進行繼承, 基於基礎映象(沒有父映象),可以製作各種具體的應用映象。

特性:一次同時載入多個檔案系統, 但是從外面看起來, 只能看到一個檔案系統, 聯合載入會把各層檔案系統疊加起來, 這樣最終的檔案系統會包含所有底層的檔案和目錄。

Docker映象載入原理

docker的映象實際上由一層一層的檔案系統組成, 這種層級的檔案系統UnionFS。

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導載入kernel,Linux剛啟動時會載入bootfs檔案系統, 在Docker映象的最底層上bootfs。這一層與我們典型的Linux/Unix系統是一樣的, 包含boot載入器和核心。當boot載入完成後整個核心就都在記憶體中, 此時記憶體的使用權由bootfs轉交給核心, 此時系統也會解除安裝bootfs。

rootfs(root file system),在bootfs之上。包含的就是典型Linux系統的/dev,/proc,/bin,/etc等標準目錄和檔案。rootfs就是各種不同的作業系統發行版,比如Ubuntu,Centos等。

對於一個精簡的OS,rootfs可以很小, 只需要包含最基本的命令, 工具和程式庫就可以了, 因為底層直接用Host的kernel, 自己只需要提供rootfs就可以了。由此可見對於不同的Linux發行版, bootfs基本上一致的。rootfs會有差別,因此不同的髮型版可以共用bootfs。
虛擬機器上分鐘級別, 容器上秒級!

分層理解

分層的映象

我們可以去下載一個映象, 可以看到是一層一層的下載!

ocker pull redis
Using default tag: latest
latest: Pulling from library/redis
b4d181a07f80: Already exists 
86e428f79bcb: Pull complete 
ba0d0a025810: Pull complete 
ba9292c6f77e: Pull complete 
b96c0d1da602: Pull complete 
5e4b46455da3: Pull complete 
Digest: sha256:f631ff6c898339306ffdb8369add5c12303ec3946610ef8d6f1d05f575942f0c
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

Docker映象為什麼要採用這種分層的結構呢?
最大的好處是資源共享,比如有多個映象都從相同的Base映象構建而來, 那麼宿主機只需要在磁碟上保留一份base映象,同時記憶體中也只需要載入一份base映象,這樣就可以為所有的容器服務了,而且映象的每一層都可以被共享。

檢視驚喜分層的方式可以通過docker image inspect命令

docker image inspect redis
[
    {
        "Id": "sha256:08502081bff61084d64fc76f0f90ea39b89935cd071d9e12c5374ae191ff53c0",
        "RepoTags": [
            "redis:latest"
        ],
        "RepoDigests": [
            "redis@sha256:f631ff6c898339306ffdb8369add5c12303ec3946610ef8d6f1d05f575942f0c"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-06-23T16:36:30.182210591Z",
        "Container": "ff24eb24b3cff07ced352081b984ecafb749404469993462cbd773258d1a56fe",
        "ContainerConfig": {
            "Hostname": "ff24eb24b3cf",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.2.4",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.4.tar.gz",
                "REDIS_DOWNLOAD_SHA=ba32c406a10fc2c09426e2be2787d74ff204eb3a2e496d87cff76a476b6ae16e"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"redis-server\"]"
            ],
            "Image": "sha256:e39f8a5eb6f06bc15438105f98a52afaa51dc6fb498e2e49ddc5e38916478394",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "19.03.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.2.4",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.4.tar.gz",
                "REDIS_DOWNLOAD_SHA=ba32c406a10fc2c09426e2be2787d74ff204eb3a2e496d87cff76a476b6ae16e"
            ],
            "Cmd": [
                "redis-server"
            ],
            "Image": "sha256:e39f8a5eb6f06bc15438105f98a52afaa51dc6fb498e2e49ddc5e38916478394",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 105394545,
        "VirtualSize": 105394545,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/efc52d654cb7676508f1953cf3ad758aea45c7fa48b39d63110b7e7a134ac758/diff:/var/lib/docker/overlay2/1caebd8a257acec0b923bd514c6891a9891312a045100c2c523bce0fb38b4be0/diff:/var/lib/docker/overlay2/84144ff6633332ca1a838865903da57c7f305607500f3b6684f424de6b63f5d9/diff:/var/lib/docker/overlay2/6ccaee3e6dcabeb6053011820b3cdd07a64602fa7f206ed751a6df5f9eb6c6ed/diff:/var/lib/docker/overlay2/25a836d7f4de49903eb0d9a2417db7f0de784db3ed88c58aab44ec6ea0034a86/diff",
                "MergedDir": "/var/lib/docker/overlay2/7342d18295a6226f169c15acb8aead6acd5f1a6cb4cc45423951dc31c6987bd8/merged",
                "UpperDir": "/var/lib/docker/overlay2/7342d18295a6226f169c15acb8aead6acd5f1a6cb4cc45423951dc31c6987bd8/diff",
                "WorkDir": "/var/lib/docker/overlay2/7342d18295a6226f169c15acb8aead6acd5f1a6cb4cc45423951dc31c6987bd8/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7",
                "sha256:245c9d23f65373415922e53424032cabe7b282c5cf8f9f8070a7d1830fca6871",
                "sha256:ebef6caacb966ed54c0c3facf2288fa5124452f2c0a17faa1941625eab0ceb54",
                "sha256:0b7b774038f08ec329e4dd2c0be440c487cfb003a05fce87cd5d1497b602f2c1",
                "sha256:a71d36a87572d637aa446110faf8abb4ea74f028d0e0737f2ff2b983ef23abf3",
                "sha256:9e1fddfb3a22146392a2d6491e1af2f087da5e6551849a6174fa23051ef8a38f"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

理解:

所有的Docker映象都起始於一個基礎映象, 當進行修改或增加新的內容時, 就會在當前映象層之上,建立新的映象層。
舉個簡單的例子, 假如基於Ubuntu Linux 16.04建立一個新的映象, 這就是映象的第一層;如果在該映象中新增python包,就會在基礎映象層之上建立第二個映象層;如果繼續新增一個安全補丁, 就會建立第三個映象層。
在新增額外的映象層的同時, 映象始終保持上當前所有映象的組合, 理解這一點是非常重要的。

Docker通過儲存引擎(新版本採用快照機制)的方式實現映象層堆疊, 並保證多映象層對外展示為統一的檔案系統。
Linux上可用的儲存引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顧名思義, 美中儲存引擎都基於Linux中對於的檔案系統或者塊裝置技術,並且美中儲存引擎都有其獨特的效能優點。
Docker在Windows上僅支援windowsfilter一種儲存引擎,該引擎基於NTFS檔案系統之上實現了分層和CoW[1]。

特點
Docker 映象都是隻讀的, 當容器啟動時, 一個新的可寫層被載入到映象的頂部!這一層通常說的是容器層, 容器之下都叫映象層!

Commit映象

# 命令和git原理類似
docker commit 提交容器成為一個新的副本
docker commit -m="提交的描述資訊" -a="作者"  容器id 目標映象名:[tag]

commit映象實戰測試

# 啟動一個預設的tomcat
docker run -it tomcat 

# 發現預設的comcat沒有webapps應用, 映象的原因, 官方的映象預設webapps下面是沒有檔案的!

# 自己拷貝基本的檔案

# 將修改後的容器通過commit提交為一個新的映象!以後使用我們修改過的映象即可, 這是我們自己修改的映象。
docker commit -a="dm" -m="add webapps application" d227e6d92a9e tomcat02:1.0
sha256:06c9bb7935cd7c5220dc187ae128b1a0e1d369d2500839f1bfa49468683bd1f9

# 檢視提交的映象
docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
tomcat02        1.0       06c9bb7935cd   4 seconds ago   672MB
tomcat          9.0       36ef696ea43d   4 days ago      667MB