循序漸進Docker(一)docker簡介、安裝及docker image管理

導航:
Docker虛擬化簡介
Docker的安裝
Docker image的管理

> Docker虛擬化簡介

1.Docker是什麼?
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

docker的英文本意思就叫做“搬運工”在程序員的世界裏面集裝箱裏裝的是任意類型的App,開發者通過Docker可以將App變成一種標準化的可移植的,自管理的組件,可以在任何主流系統中開發,調試和運行,說白了搬運工就是一種用了新穎的方式實現了輕量級虛擬機,類似於VM但是在原理和應用上和VM差距是非常大的,碼頭工人的專業叫法叫做(應用容器)

2.我們爲什麼要用容器呢?
一個容器就像一個安裝好了一組特定應用的虛擬機,比如我現在想用一個有NMP環境的虛擬,那我直接去找一個裝好了的NMP的就行了,不需要再去重複安裝配置,而且有時候根據每個人的電腦不同,在安裝的nginx、MySQL、php的時候可能會報錯,而且萬一機子掛掉了,你的所有服務都得重新安裝。但是有了容器就不一樣了,有了容器你就相當於有了一個可以正常運行起來的虛擬機,只要你能運行容器,這些個環境的配置過程就省了。而且如果你想換個電腦,直接把容器拿過來就可以使用容器裏面的服務。

docker基於GO語言開發,代碼託管在Github上上,並遵循Apache2.0的的開源協議,docker容器可以封裝任何有效的負載,可以幾乎在任何服務器之間進行一致性的運行,比如說:開發者構建的應用只需一次構建即可多平臺運行。運營人員只需配置他們的服務,即可運行所有的應用。

若是利用容器的話,那麼開發直接在容器裏開發,測試的時候把整個容器給測試,測好了把測試後容器再上線就好了。通過容器,整個開發,測試和生產環境可以保持高度一致。此外容器也和VM一樣具有一定得隔離性,各個容器之間的數據和內存空間相互隔離,可以保證一定的安性。

Hyper-V,KVM和Xen等虛擬機管理程序都“基於虛擬化硬件仿真機制。這意味着,它們對系統要求很高。然而,容器卻使用共享的操作系統。這意味着它們在使用系統資源方面比虛擬機管理程序要高效得多。容器不是對硬件進行虛擬化處理,而是駐留在一個Linux實例上.Docker可以解決虛擬機能夠解決問題,同時也能夠解決虛擬機由於資源要求過高而無法解決的問題

3.爲什麼要使用Docker呢?
docker 有什麼優點呢?
1,快速交付應用程序•開發者使用一個標準的形象來構建開發容器,開發完成之後,系統管理員就可以使用這個容器來部署代碼docker可以快速創建容器,快速迭代應用程序,並讓整個過程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。並且docker容器很輕!很快!容器的啓動都是秒級別的,完全節約了開發時間等等,VM那都是分鐘.

2,更容易部署和擴展docker
容器可以在幾乎所有的環境中運行,物理機,虛擬機,公有云,私有云,個人電腦,服務器等等,有沒有覺得非常廣泛。

3,效率更高docker
容器不需要hypervisor,他是內核級的虛擬化。

4,部署快速
也。意味着更簡單的管理通常只需要小小的改變就可以替代以往巨型狀語從句:大量的更新工作。

4.Docker 優勢和劣勢

作爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有衆多的優勢。 首先,Docker 容器的啓動可以在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器。 容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的 開銷儘量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而 Docker 只需 要啓動 10 個隔離的應用即可。

5.Docker 的體系結構

docker 使用 C/S 架構,docker daemon 作爲 server 端接受 client 的請求,並處理(創建、 運行、分發容器),他們可以運行在一個機器上,也通過 socket 或者 RESTful API 通信

Docker daemon 一般在宿主主機後臺運行。 Docker client 以系統命令的形式存在,用戶用 docker 命令來跟 docker daemon 交互。

Docker 守護進程(Docker daemon) 如上圖所示,Docker 守護進程運行在一臺主機上。用戶並不直接和守護進程進行交互,而 是通過 Docker 客戶端間接和其通信。 Docker 客戶端(Docker client) Docker 客戶端,實際上是 docker 的二進制程序,是用戶與 Docker 交互方式。它接收用戶 指令並且與背後的 Docker 守護進程通信

Docker 內部: 要理解 Docker 內部構建,需要理解以下三種部件:

Docker 鏡像 - Docker images Docker

倉庫 - Docker registeries

Docker 容器 - Docker containers
接下來詳細介紹這三大件:

Docker 鏡像
Docker 鏡像是 Docker 容器運行時的只讀模板,鏡像可以用來創建 Docker 容器。每一個鏡

像由一系列的層 (layers) 組成。Docker 使用 UnionFS(聯合文件系統)來將這些層聯合到單 獨的鏡像中。UnionFS 允許獨立文件系統中的文件和文件夾(稱之爲分支)被透明覆蓋,形成 一個單獨連貫的文件系統。正因爲有了這些層的存在,Docker 是如此的輕量。當你改變了 一個 Docker 鏡像,比如升級到某個程序到新的版本,一個新的層會被創建。因此,不用替 換整個原先的鏡像或者重新建立(在使用虛擬機的時候你可能會這麼做),只是一個新的層被 添加或升級了。現在你不用重新發布整個鏡像,只需要升級,層使得分發 Docker 鏡像變得 簡單和快速。 每個 docker 都有很多層次構成,docker 使用 union file systems 將這些不同的層結合到一 個 image 中去。 例如:centos 鏡像中安裝 nginx,就成了 nginx 鏡像”,其實在此時 Docker 鏡像的層級概念就 體現出來了。底層一個 centos 操作系統鏡像,上面疊加一個 ngnx 層,就完成了一個 nginx 鏡像的構建。層級概念就不難理解,此時我們一般 centos 操作系統鏡像稱爲 nginx 鏡像層的 父鏡像

Docker 倉庫
Docker 倉庫用來保存鏡像,可以理解爲代碼控制中的代碼倉庫。同樣的,Docker 倉庫也有 公有和私有的概念。公有的 Docker 倉庫名字是 Docker Hub。Docker Hub 提供了龐大的鏡 像集合供使用。這些鏡像可以是自己創建,或者在別人的鏡像基礎上創建。
倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談, 並不嚴格區分。實際上,倉庫註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個 鏡像,每個鏡像有不同的標籤(tag)。

倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。 最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括 Docker Pool 等,可以提供大陸用戶更穩定快速的訪問。

當然,用戶也可以在本地網絡內創建一個私有倉庫。 當用戶創建了自己的鏡像之後就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下 次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。 *注:Docker 倉庫的概念跟 Git 類似,註冊服務器可以理解爲 GitHub 這樣的託管服務。

Docker 容器

Docker 利用容器來運行應用,一個 Docker 容器包含了所有的某個應用運行所需要的環境。 每一個 Docker 容器都是從 Docker 鏡像創建的。Docker 容器可以運行、開始、停止、移動 和刪除。每一個 Docker 容器都是獨立和安全的應用平臺。 容器是從鏡像創建的運行實例。它可以被啓動、開始、停止、刪除。每個容器都是相互隔離 的、保證安全的平臺。 可以把容器看做是一個簡易版的 Linux 環境(包括 root 用戶權限、進程空間、用戶空間和 網絡空間等)和運行在其中的應用程序。 *注:鏡像是隻讀的,容器在啓動的時候創建一層可寫層作爲最上層。

Docker 底層技術
docker 底層的 2 個核心技術分別是 Namespaces 和 Control groups Namespaces 用來隔離各個容器 1)pid namespace 不同用戶的進程就是通過 pid namespace 隔離開的,且不同 namespace 中可以有相同 pid。 所有的LXC進程在docker中的父進程爲docker進程,每個lxc進程具有不同的 namespace 。

2) net namespace 有了pid namespace, 每個 namespace 中的pid能夠相互隔離,但是網絡端口還是共享 host 的端口。網絡隔離是通過 net namespace 實現的,每個 net namespace 有獨立的 network devices, IP addresses, IP routing tables, /proc/net 目錄。這樣每個 container 的網絡就能隔離 開來。docker 默認採用 veth 的方式將 container 中的虛擬網卡同 host 上的一個 docker bridge: docker0 連接在一起。

3) ipc namespace container 中進程交互還是採用 linux 常見的進程間交互方法 (interprocess communication - IPC),包括常見的信號量、消息隊列和共享內存。container 的進程間交互實際上還是 host 上 具有相同 pid namespace 中的進程間交互。

4) mnt namespace 類似 chroot,將一個進程放到一個特定的目錄執行。mnt namespace 允許不同 namespace 的進程看到的文件結構不同,這樣每個 namespace 中的進程所看到的文件目錄就被隔離開 了。在 container 裏頭,看到的文件系統,就是一個完整的 linux 系統,有/etc、/lib 等,通 過 chroot 實現。

5) uts namespace UTS("UNIX Time-sharing System") namespace 允許每個 container 擁有獨立的 hostname 和 domain name, 使其在網絡上可以被視作一個獨立的節點而非 Host 上的一個進程。

6) user namespace 每個 container 可以有不同的 user 和 group id, 也就是說可以在 container 內部用 container 內部的用戶執行程序而非 Host 上的用戶。

有了以上 6 種 namespace 從進程、網絡、IPC、文件系統、UTS 和用戶角度的隔離,一個 container 就可以對外展現出一個獨立計算機的能力,並且不同 container 從 OS 層面實現 了隔離。然而不同 namespace 之間資源還是相互競爭的,仍然需要類似 ulimit 來管理每個 container 所能使用的資源 - -cgroup。 cgroups(Control groups)實現了對資源的配額和度量。

------部分摘自百度百科、維基百科。

> Docker的安裝

docker的官網:https://docs.docker.com

centos系列安裝docker,docker支持centos6以上的版本

centos6:在redhat/centos環境下安裝docker,官方文檔要求linux的kernel至少3.8以上,並且docker只能運行在64位的系統中,由於redhat6和centos6的內核版本位2.6,因此必須先升級內核。
一定要記住升級內核,要不然會出現很多莫名其妙的問題,建議用yum安裝

1.yum安裝帶aufs模塊的3.10內核

#cd /etc/yum.repos.d

#wget http://www.hop5.in/yum/el6/hop5.repo

#yum install kernel-ml-aufs kernel-ml-aufs-devel

建議大家直接使用redhat7/centos7系列的操作系統
查詢centos7的內核版本
循序漸進Docker(一)docker簡介、安裝及docker image管理

docker軟件包已經包括在默認的centos-extras軟件源裏面,因此想要安裝docker,只需要執行下面yum命令

sudo yum -y install docker
systemctl start docker && chkconfig docker on

循序漸進Docker(一)docker簡介、安裝及docker image管理
安裝完成之後啓動東側客人並且設置開機啓動
2.查看docker版本
循序漸進Docker(一)docker簡介、安裝及docker image管理

[fuboyuan@VM04centos ~]$ sudo docker version
[sudo] password for fuboyuan: 
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-88.git07f3374.el7.centos.x8664
 Go version:      go1.9.4
 Git commit:      07f3374/1.13.1
 Built:           Fri Dec  7 16:13:51 2018
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-88.git07f3374.el7.centos.x8664
 Go version:      go1.9.4
 Git commit:      07f3374/1.13.1
 Built:           Fri Dec  7 16:13:51 2018
 OS/Arch:         linux/amd64
 Experimental:    false
[fuboyuan@VM04centos ~]$ sudo docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports dtype: true
 Native Overlay Diff: false
Logging Driver: journald
Cgroup Driver: systemd
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
Init Binary: /usr/libexec/docker/docker-init-current
containerd version:  (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: N/A (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)
init version: fec3683b971d9c3ef73f284f176672c44b448662 (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
 seccomp
  WARNING: You are not using the default seccomp profile
  Profile: /etc/docker/seccomp.json
Kernel Version: 3.10.0-514.26.2.el7.x8664
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x8664
Number of Docker Hooks: 3
CPUs: 1
Total Memory: 1.797 GiB
Name: VM04centos
ID: LD4S:LVI2:RFSU:ECAB:OTPI:GNME:227K:EAQQ:WHR6:BBML:TC55:SZIO
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Registries: docker.io (secure)**

Docker默認使用unix socket

循序漸進Docker(一)docker簡介、安裝及docker image管理

可以使用docker images顯示本機上的images
循序漸進Docker(一)docker簡介、安裝及docker image管理

3.獲取images

當我們啓動容器使用image不在本地主機上時,docker會自動下載他們,這很耗時間,我們可以使用docker pull命令來預先下載我們需要的image,例如我們下載一個centos鏡像
循序漸進Docker(一)docker簡介、安裝及docker image管理
這下當我們使用這個容器的時候,他就可以馬上啓動

4.查找圖像
Docker的一個特點就是很多人使用了很多種不同的方式創建了不同的圖像,並且上傳到docker hub共有倉庫裏,我們就可以在docker hub的網站上來查找他們,在這裏使用docker search命令:舉個例子,我們需要mysql,docker search mysql就可以查詢所有的mysql圖像。
循序漸進Docker(一)docker簡介、安裝及docker image管理

> Docker的docker image管理

一, docker image是docker的三大組件之一,docker會把下載的圖像存儲到docker主機上,如果圖像不在主機上docker會從鏡像倉庫下載,默認的是docker hub倉庫。

  1. 使用docker
    圖像查看本機上的圖像
    Docker images
    循序漸進Docker(一)docker簡介、安裝及docker image管理
    REPOSITORY:來自於哪個倉庫
    TAG:TAG的標記
    IMAGE ID: 鏡像的id號
    CREATED: 創建時間
    SIZE:鏡像大小

若是本機暫時沒有鏡像,接下里就是獲取鏡像
Docker search 你想要的鏡像
Docker pull用來預先下載我們需要的
下載完再用docker images就有了
查看docker.io/centos的詳細信息:

Docker inspect docker.io/centos
[root@VM_0_4_centos fuboyuan]# docker inspect docker.io/centos
[
    {
        "Id": "sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb",
        "RepoTags": [
            "docker.io/centos:latest"
        ],
        "RepoDigests": [
            "docker.io/centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2018-12-06T00:21:07.135655444Z",
        "Container": "1fdbb0fcc184eb795364f7aa5fdc00299d0a2b90d8e26b4696217c22da7f983f",
        "ContainerConfig": {
            "Hostname": "1fdbb0fcc184",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:b3a68d99a4a4195c6c97c2345b83cb2d6cfd1661247816ac403cf0b584437ad7",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20181205",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "DockerVersion": "17.06.2-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:b3a68d99a4a4195c6c97c2345b83cb2d6cfd1661247816ac403cf0b584437ad7",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20181205",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 201779604,
        "VirtualSize": 201779604,
        "GraphDriver": {
            "Name": "overlay2",
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/f4f9aaf707681248e52eee6118a6cd7e3e35bd4da945722a4fbe1b2e02dd98a7/merged",
                "UpperDir": "/var/lib/docker/overlay2/f4f9aaf707681248e52eee6118a6cd7e3e35bd4da945722a4fbe1b2e02dd98a7/diff",
                "WorkDir": "/var/lib/docker/overlay2/f4f9aaf707681248e52eee6118a6cd7e3e35bd4da945722a4fbe1b2e02dd98a7/work"
            }
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956"
            ]
        }
    }
]

二, 我們也可以創建自己的images

俗話說的好,適合自己的纔是最好的,那我們當然要會自己創建屬於自己的images,創建images有兩個方法
1. 使用docker commit來擴展一個image,先使用image容器,更新後提交到新的image
[root@VM_0_4_centos fuboyuan]# docker run -it docker.io/centos /bin/bash
[root@241a0d202128 /]#
記住加粗的標識號
在容器中添加:mariadb-server應用
[root@241a0d202128 /]# yum -y install mariadb-server

循序漸進Docker(一)docker簡介、安裝及docker image管理
當結束之後,exit退出容器,此時我們已經把這個容器的內容改變了,使用dockercommint命令來提交相應的副本。

[fuboyuan@VM_0_4_centos ~]$ sudo docker commit -m 'add mariadb app'  -a 'docker then' 241a0d202128 centos:mariadb
[sudo] password for fuboyuan: 
sha256:ca658cbc0d0f8b44dfe1ec7035960e6d8146cbe09a06f70c944676aa7f919d18

-m:來指定提交的說明信息,跟我們使用的版本控制一樣,
-a:可以指定更新的用戶信息;
之後是用來創建鏡像容器的id,最後指定目標鏡像倉庫名和tag信息。

使用docker images查看新的鏡像
循序漸進Docker(一)docker簡介、安裝及docker image管理
之後可以使用新的鏡像來啓動容器

2 第二個方法:從dockerfile來創建image
Docker commit擴建一個新的image很容易,但是不容易共享這個image,在這種情況下我們可以使用docker build來創建image,用這個方法需要先創建一個dockerfile,在dockerfile中包含一些我們創建image的指令。
創建一個dockerfile

[root@VM_0_4_centos fuboyuan]# mkdir -p /docker/httpd
[root@VM_0_4_centos fuboyuan]# cd /docker/httpd/
[root@VM_0_4_centos httpd]# vim Dockerfile
#This is a comment
From  ca658cbc0d0f
RUN yum -y install apr apr-util
RUN yum -y install http

這裏RUN開頭的指令會在創建過程中運行
編寫ok之後用docker bulid來生成鏡像。
[root@VM_0_4_centos httpd]# docker build -t='centos:httpd'.
注意最後末尾處有 .
-t是添加標記的tag

查看docker images
循序漸進Docker(一)docker簡介、安裝及docker image管理
開啓這個新建image的容器
Docker run -it centos:httpd /bin/bash
循序漸進Docker(一)docker簡介、安裝及docker image管理

三:從本地載入images

要從本地文件導入一個鏡像很簡單
先把下載好的文件導入到linux
查看目前的images
Docker load < 導入文件名稱就歐克了

四:上傳鏡像

我們可以通過docker push命令把自己新建的鏡像上傳到倉庫來共享,比如,我們在docker hub上完成註冊後可以通過推送自己的鏡像到倉庫中,
科學上網,完成註冊

之後上傳自己的鏡像到docker hub

首先在命令行輸入:docker login
之後使用docker push命令上傳,要記得在docker hub上的dashboard中創建一個個人的Repository;創建相對應的namespace和repository name;
循序漸進Docker(一)docker簡介、安裝及docker image管理
等待上傳完成… …

Docker管理額外操作:

增加會了,現在刪除:docker rmi imageid

Docker ps 命令
-a:展現出你的所有的images
-h:求助

Docker start/stop:啓動/終止容器的運行

Docker inspect:查看容器詳細信息

希望對您有幫助,接下來是dockerfile構建容器方法和網絡配置的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章