国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Linux運維:docker(2)-鏡像與容器

wuyumin / 1988人閱讀

摘要:用于系統引導的文件系統,包括和容器啟動完成后會被卸載以節約內存資源位于之上,表現為容器的根文件系統鏡像原理鏡像的文件系統被設計為分層存儲的架構。分層存儲的特征使得鏡像的復用,定制變得更加容易。

docker鏡像概述

操作系統分為內核kernel和用戶空間。對于Linux而言,內核(bootfs)啟動后會掛載root文件系統為其提供用戶空間支持。而docker鏡像,就相當于是一個root文件系統(rootfs)。

bootfs:用于系統引導的文件系統,包括bootloader和kernel,容器啟動完成后會被卸載以節約內存資源

rootfs:位于bootfs之上,表現為docker容器的根文件系統

鏡像原理

鏡像的root文件系統被設計為分層存儲的架構。鏡像在構建時,會一層一層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只會發生在自己這一層。

分層存儲的特征使得鏡像的復用,定制變得更加容易??梢允褂脴嫿ê玫溺R像作為基礎層,再進一步的添加新的層,以定制自己所需的內容,構建新的鏡像。
簡單來說,鏡像是:

文件和metedata的集合(rootfs)

鏡像是分層存儲的,并且每一層都可以添加改變刪除文件,成為一個新的鏡像

不同鏡像可以共享相同的layer(層)

鏡像本身是read-only的

鏡像獲取

鏡像的獲取方式:

從鏡像倉庫(registry)獲取

通過commit命令將容器保存為鏡像

通過Dockerfile定制容器(推薦使用)

通過rootfs壓縮包導入

docker save和docker load命令

鏡像管理

從Registry拉取鏡像
在docker hub上有大量高質量的鏡像可以使用,從鏡像倉庫拉取鏡像的命令格式是:

docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]

鏡像的名稱格式

Docker鏡像倉庫地址:<域名/IP>[:端口號],默認地址是docker hub

倉庫名:<用戶名>/<軟件名>,對于docker hub,如果不給出用戶名,默認是library,也就是官方鏡像

標簽:標簽一般是鏡像的版本信息,不指定標簽默認是latest

例如:docker pull centos

$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a02a4930cb5d: Pull complete 
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest

這條命令沒有給出鏡像倉庫地址,默認從Docker Hub上獲取。而鏡像名稱是centos,因此會獲取官方鏡像library/centos中標簽為latest的鏡像

配置鏡像加速器
因為docker hub地址是在國外,從國內拉取鏡像倉庫中的鏡像會比較慢,此時可以配置鏡像加速器。
目前Docker官方和國內的云服務商都有提供國內加速服務。

Docker官方提供的中國加速器

阿里云加速器

配置阿里云加速器為例:
環境說明

系統環境:centos7

docker版本:Docker version 18.03.0-ce

創建目錄文件

$ mkdir -p /etc/docker
$ vim /etc/docker/daemon.json

添加配置內容,配置內容在阿里云容器鏡像服務中可以獲取,每個阿里云賬號都有自己的鏡像加速器。

{
  "registry-mirrors": ["https://這里的配置每個人都有.mirror.aliyuncs.com"]
}

然后就是重新加載文件和重啟docker,就可以了

$ systemctl daemon-reload
$ systemctl restart docker

列出鏡像
列出本地鏡像的命令是:

$ docker image ls

或者

$ docker images

刪除鏡像
刪除本地鏡像的命令:

$ docker image rm [選項] <鏡像1> [<鏡像2> ...]

鏡像可以是鏡像短ID,長ID,鏡像名或者鏡像摘要。
下面看$ docker images列出的鏡像信息。

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
centos                       latest              1e1148e4cc2c        2 months ago        202MB
busybox                      latest              59788edf1f3e        4 months ago        1.15MB
django-compose_web           latest              cfd70f0cb009        5 months ago        969MB
postgres                     latest              ac25c2bac3c4        5 months ago        228MB
my-compose_web               latest              4867e7c35cc9        5 months ago        86.5MB

其中REPOSITORY+TAG稱為鏡像名,IMAGE ID是鏡像ID,取前幾位就是鏡像短ID。
比如用鏡像名刪除centos鏡像:

$ docker image rm centos:latest
Untagged: centos:latest
Untagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb
Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956

使用鏡像短ID刪除鏡像:

$ docker image rm 59788ed
Untagged: busybox:latest
Untagged: busybox@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bffffd8d92465812
Deleted: sha256:59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690
Deleted: sha256:8a788232037eaf17794408ff3df6b922a1aedf9ef8de36afdae3ed0b0381907b

可以看到busybox這個鏡像已經被刪除。

也可以類似管道一樣,結合其他命令的結果來刪除鏡像,比如docker image ls -q,先看看這個命令的執行結果。

$ docker image ls -q python
449d3495be0e
825141134528
825141134528
40792d8a2d6d

這個命令執行返回本地鏡像中所有python鏡像的鏡像ID,有了ID就可以結合docker image rm來刪除了。

docker image rm $(docker image ls -q)

這條命令對想要成批刪除鏡像很有幫助。
給鏡像打標簽
給鏡像打標簽的命令是docker tag 原鏡像 新鏡像名:標簽,注意,打標簽會新生成一個鏡像,而且這個新的鏡像ID和原鏡像一樣。
注意:鏡像的唯一標識是其ID和摘要,一個鏡像可以有多個標簽。當刪除鏡像的時候,實際上是刪除某個標簽的鏡像。

$ docker tag busybox busybox:version1
$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
busybox                      latest              d8233ab899d4        12 days ago         1.2MB
busybox                      version1            d8233ab899d4        12 days ago         1.2MB

啟動鏡像為容器
啟動鏡像為容器的命令,列舉常用的一條命令:
docker run -itd (鏡像名/ID/鏡像摘要)

$ docker run -itd busybox
aa6ef78ae7b93704cbf9f99e184c2e2cb53924d693ca67c370fa74f52ff38d15

上面示例啟動了busybox鏡像為容器,不添加標簽說明默認啟動busybox:latest。
選項說明:

-i表示讓容器的標準輸入打開,

-t表示分配一個偽終端,

-d表示后臺啟動。

要把-i -t -d 放到鏡像名字前面。
查看運行狀態的容器
查看容器運行狀態使用docker ps只能查看運行中的容器,-a選項查看全部容器,包括未運行的容器。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
aa6ef78ae7b9        busybox             "sh"                     23 minutes ago      Up 23 minutes                              thirsty_brattain
ee0034f44bc6        wordpress:latest    "docker-entrypoint.s…"   5 months ago        Up About an hour    0.0.0.0:8000->80/tcp   wordpress-compose_wordpress_1
cbcb7baa5b2f        mysql:5.7           "docker-entrypoint.s…"   5 months ago        Up About an hour    3306/tcp, 33060/tcp    wordpress-compose_db_1

$ docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS                     NAMES
aa6ef78ae7b9        busybox              "sh"                     23 minutes ago      Up 23 minutes                                         thirsty_brattain
341ea8ff6424        django-compose_web   "python3 manage.py r…"   5 months ago        Exited (137) 5 months ago                             django-compose_web_1
bffde084f040        django-compose_web   "django-admin.py sta…"   5 months ago        Exited (0) 5 months ago                               django-compose_web_run_1
0f68cb4ccae0        postgres             "docker-entrypoint.s…"   5 months ago        Exited (0) 5 months ago                               django-compose_db_1
ee0034f44bc6        wordpress:latest     "docker-entrypoint.s…"   5 months ago        Up About an hour            0.0.0.0:8000->80/tcp      wordpress-compose_wordpress_1
使用commit構建鏡像

鏡像是容器的基礎,每次執行 docker run 的時候都會指定哪個鏡像作為容器運行的基礎。

鏡像是多層存儲,每一層是在前一層的基礎上進行的修改;
而容器同樣也是多層存儲,是在以鏡像為基礎層,在其基礎上加一層作為容器運行時的存儲
層。
因此,在運行的容器對容器進行添加修改操作,也就是修改容器的存儲層,docker提供了commit命令可以將容器存儲層保存下來稱為鏡像。用例子看一下吧:
首先啟動一個nginx鏡像:

docker run --name webser -d -p 9000:80 nginx

這條命令會啟動一個nginx鏡像并命名為webser,把本地的9000端口映射到容器內的80端口,這樣可以用瀏覽器去訪問。

現在對這個webserver的默認界面進行修改。
進入容器,進行修改

$ docker exec -it webser bash
root@432bcf4daf84:/# echo "

Hello, Docker!

" > /usr/share/nginx/html/index.html root@432bcf4daf84:/# exit

重新訪問可以看到改變。

我們修改了這個容器的存儲層,接下來就可以使用commit命令來保存為鏡像了。
docker commit的命令格式是:
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標簽>]]
將上面修改的nginx容器保存提交為鏡像:

$ docker commit -a "mori" -m "修改了默認網頁" webser nginx:v2
sha256:25d8d84191b7e2ecbfb3c387797c47c1fa631386c418f63b78ab88067f62e365

-a也就是author,上面-a也可以改成--author,指定作者信息
-m是--message,可以改成--message ,說明
webser是容器名稱,也可以是容器id,容器id通過docker ps查看
nginx:v2就是保存的鏡像名稱。

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
nginx                        v2                  25d8d84191b7        6 minutes ago       109MB

可以看到鏡像已經保存在本地了。接下來停止剛剛啟動的nginx容器

$ docker stop webser

再啟動新保存的鏡像nginx:v2

$ docker run --name webser2 -d -p 9000:80 nginx:v2

瀏覽器訪問,結果不是nginx默認網頁,而是修改后的界面。

注意:docker commit雖然可以很好理解鏡像的構成,但是盡量不要用,雖然上面只是簡單修改了網頁文件,但是使用docker diff webser 可以發現有很多文件被改動或者添加,這會使鏡像變得臃腫。

通過壓縮包導入創建鏡像

首先去下載一個壓縮包
http://openvz.org/Download/te... //下載速度不快,我下載了一個centos6的模板

下載完導入該鏡像的命令為:

$ cat centos-6-x86-minimal.tar.gz|docker import - centos6

docker images查看導入的鏡像

把現有鏡像,導出為一個文件:

$ docker save -o moli_nginx.tar nginx 

我們還可以用該文件恢復本地鏡像:

$ docker load --input  moli_nginx.tar  #或者
$ docker load <  moli_nginx.tar

鏡像構建之Dockerfile

Dockerfile是什么?
Dockerfile是用來構建docker鏡像的鏡像文件,是由一系列命令和參數構成的腳本。
構建步驟

手動編寫一個Dockerfile文件(這個文件最好創建在一個空白目錄下),必須符合Dockerfile文件規范

有了這個文件后,使用docker build命令生成一個自定義的鏡像

然后就docker run

這個Dockerfile文件長什么樣?
以centos為例,文件內容如下:

FROM scratch
ADD centos-7-docker.tar.xz /

LABEL org.label-schema.schema-version="1.0" 
    org.label-schema.name="CentOS Base Image" 
    org.label-schema.vendor="CentOS" 
    org.label-schema.license="GPLv2" 
    org.label-schema.build-date="20181205"

CMD ["/bin/bash"]

所謂定制鏡像,也就是在一定鏡像的基礎上,而FROM指令的作用就是指定基礎鏡像?;A鏡像是必須指定的,而且必須是Dockerfile文件的第一條指定。關于其他指令見下面。

Dockerfile文件中常見的指令

指令 說明
FROM 指定基礎鏡像,當前新鏡像是基于哪個鏡像的
MAINTAINER 鏡像維護者的姓名和郵箱地址
RUN 容器構建時需要運行的命令
EXPOSE 當前容器對外暴露的端口
WORKDIR 指定在創建容器后,終端默認登錄進來的工作目錄,一個落腳點
ENV 用來在構建鏡像過程中設置環境變量,這個變量可以被后續的RUN命令,WORKDIR命令使用
ADD 將宿主機目錄下的文件拷貝進鏡像并且ADD命令會自動處理URL和解壓tar壓縮包
COPY 類似ADD命令,拷貝目錄文件到鏡像中
VOLUME 容器數據卷,用于數據保存和持久化工作
CMD 指定一個容器啟動時要運行的命令,Dockerfile中可以有多個CMD,但只有最后一個生效,CMD會被docker run之后的參數替換掉
ENTRYPOINT 和CMD類似,都是指定一個容器啟動時要運行的命令,不過他不會被替換,而是追加
ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承后父鏡像的onbuild被觸發

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27716.html

相關文章

  • 容器化-Docker介紹

    摘要:容器作為一類操作系統層面的虛擬化技術,其目標是在單一主機交付多套隔離性環境,容器共享同一套主機操作系統內核。與其它容器平臺不同,引入了一整套與容器管理相關的生態系統。每個容器都是相互隔離的保證安全的平臺。 導讀:本文章對Docker技術進行了介紹,闡述了Docker的技術發展歷程、容器與虛擬機的差異、Docker原理、特點、Docker三組件和Docker帶來的影響,為我們進一步理解D...

    李增田 評論0 收藏0
  • 技術選型之Docker容器引擎

    摘要:是系統提供的容器化技術,簡稱,它結合和技術為用戶提供了更易用的接口來實現容器化。公司結合和以下列出的技術實現了容器引擎,相比于,具備更加全面的資源控制能力,是一種應用級別的容器引擎。 showImg(https://segmentfault.com/img/bVbtPbG?w=749&h=192); 題外話   最近對Docker和Kubernetes進行了一番學習,前兩天做了一次技術...

    monw3c 評論0 收藏0
  • 【 全干貨 】5 分鐘帶你看懂 Docker !

    摘要:本文從定義,作用,技術架構,安裝和使用等全方位帶你看懂。如圖中左邊紅框中和右邊的紅框中都唯一表示為同一個鏡像。最后,于開發者而言提供了一種開發環境的管理辦法,與測試人員而言保證了環境的同步,于運維人員提供了可移植的標準化部署流程。 作者丨唐文廣:騰訊工程師,負責無線研發部地圖測試。 導語:Docker,近兩年才流行起來的超輕量級虛擬機,它可以讓你輕松完成持續集成、自動交付、自動部署...

    Edison 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<