1. 程式人生 > >Docker鏡像的創建及上傳

Docker鏡像的創建及上傳

ef7 water mod gin 停止 str 鏡像構建 dig not in

Docker鏡像的創建及上傳

Docker鏡像介紹

Docker鏡像除了是Docker的核心技術之外也是應用發布的標準格式。一個完整的Docker鏡像可以支撐一個Docker容器的運行,在Docker的整個使用過程中,進入一個已經定型的容器之後,就可以在容器中,進行操作,最常見的操作就是在容器中安裝應用,如果要把已經安裝的服務進行遷移,就需要把環境以及搭建的服務生成新的鏡像。

創建鏡像的方法有三種,分別是基於已有鏡像、基於本地模版以及基於Dockerfile創建。

基於已有鏡像創建

基於已有的鏡像創建主要使用docker commit命令。實質上就是把一個容器運行的程序以及該程序的運行環境打包起來生成新的鏡像。

下面啟動一個已經有的鏡像,在裏面容器修改後,將修改後的容器提交成為新的鏡像。

[root@master ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              5182e96772bf        6 days ago          200 MB

啟動一個容器

[root@master ~]# docker run -itd 5182e96772bf /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
4faf98f1c6619212c3205b0a7830617ff69d457c0882ed0ca4e71430fc549406

這裏提示ipv4的路由功能沒有開啟,所以,我們需要開啟ipv4的路由轉發功能。

[root@master ~]# sysctl -p
net.ipv4.ip_forward = 1

技術分享圖片
將已經創建的容器停止並且刪除,重新啟動一個容器。

[root@master ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS         
4faf98f1c661        5182e96772bf        "/bin/bash"         32 seconds ago      Up 30 seconds  
[root@master ~]# docker stop 4faf98f1c661
4faf98f1c661
[root@master ~]# docker rm 4faf98f1c661
4faf98f1c661

重新創建並啟動一個容器

[root@master ~]# docker run -itd 5182e96772bf /bin/bash
cbeb511d2b9a7a5a25ad532a1bb8183eb4008248fad3d545eaeb7f4f57f4660a

進入到容器中,查看有沒有安裝httpd服務。

[root@master ~]# docker exec -it cbeb511d2b9a /bin/bash
[root@cbeb511d2b9a /]# rpm -q httpd
package httpd is not installed

可以看到沒有安裝,我們使用yum安裝httpd服務後,將這個容器裏面運行的程序及環境重新打包生成新的鏡像。

[root@cbeb511d2b9a /]# yum install httpd -y
[root@cbeb511d2b9a /]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
#顯示已經安裝好httpd

我們使用docker commit命令創建一個新的鏡像,其中有幾個常用選項:

  • -m:說明信息
  • -a:作者信息
  • -p:生成過程中停止容器的運行
    [root@master ~]# docker commit -m "nwe" -a "test" cbeb511d2b9a apache:test
    sha256:96aaf92c7b04b6d91fcaea0d15ad7715d575dac82971458320d54d449eedc174
    [root@master ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    apache              test                96aaf92c7b04        12 seconds ago      319 MB
    docker.io/centos    latest              5182e96772bf        6 days ago          200 MB

    可以看到現在本地有兩個鏡像了,其中一個就是我們修改後,重新創建的。我們測試用這個鏡像創建並啟動容器,訪問容器的apache服務。

    [root@master ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
    5ea867891f2b        96aaf92c7b04        "/bin/bash"         8 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   upbeat_spence
    cbeb511d2b9a        5182e96772bf        "/bin/bash"         39 minutes ago      Up 39 minutes                            inspiring_davinci
[root@master ~]# docker exec -it 5ea867891f2b /bin/bash
[root@5ea867891f2b /]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
[root@5ea867891f2b /]# /usr/sbin/apachectl -D FOREGROUND
Passing arguments to httpd using apachectl is no longer supported.
You can only start/stop/restart httpd using this script.
If you want to pass extra arguments to httpd, edit the
/etc/sysconfig/httpd config file.
AH00558: httpd: Could not reliably determine the server‘s fully qualified domain name, using 172.17.0.3. Set the ‘ServerName‘ directive globally to suppress this message

技術分享圖片

基於本地模版創建

通過導入操作系統文件可以生成鏡像,模版可以從OPENVZ開源項目下載,下面就是使用docker導入命令將下載的debian模版壓縮包導入到本地鏡像的例子。

[root@master ~]# wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
--2018-08-13 19:59:32--  http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
正在解析主機 download.openvz.org (download.openvz.org)... 185.231.241.69
正在連接 download.openvz.org (download.openvz.org)|185.231.241.69|:80... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:88436521 (84M) [application/x-gzip]

[root@master ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:test
sha256:2850c25d855bb1c545ab41de6f194754fbfcd5664edb78773aa7da7acf86ea7c
[root@master ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daoke               test                2850c25d855b        11 seconds ago      215 MB
apache              test                96aaf92c7b04        5 hours ago         319 MB
docker.io/centos    latest              5182e96772bf        6 days ago          200 MB

導入操作完成後,就會返回鏡像的ID信息,查看本地鏡像列表可以看到新創建的鏡像信息。

基於Dockerfile創建

除了手動生成Docker鏡像之外,還可以使用Dockerfile自動生成鏡像。Dockerfile是由一組指令組成的文件,其中每條命令對應Linux中的一條命令,Docker程序將讀取Dockerfile中的指令生成指定的鏡像。

  • ADD 命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上復制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載並復制到容器中。
  • CMD和RUN命令相似,CMD可以用於執行特定的命令。和RUN不同的是,這些命令不是在鏡像構建的過程中執行的,而是在用鏡像構建容器後被調用。
  • EXPOSE用來指定端口,使容器內的應用可以通過端口和外界交互。
  • MAINTAINER這個命令放在Dockerfile的起始部分,雖然理論上它可以放置於Dockerfile的任意位置。這個命令用於聲明作者,並應該放在FROM的後面。
  • RUN命令是Dockerfile執行命令的核心部分。它接受命令作為參數並用於創建鏡像。不像CMD命令,RUN命令用於創建鏡像(在之前commit的層之上形成新的層)。
  • FROM命令可能是最重要的Dockerfile命令。改命令定義了使用哪個基礎鏡像啟動構建流程。基礎鏡像可以為任意鏡像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。
  • ENV命令用於設置環境變量。這些變量以”key=value”的形式存在,並可以在容器內被腳本或者程序調用。這個機制給在容器中運行應用帶來了極大的便利。
[root@master ~]# vim Dockerfile 

FROM centos
#基於的基礎鏡像centos,若本地沒有,則去倉庫下載
MAINTAINER test
#維護該鏡像的用戶信息,隨意填寫
RUN yum install httpd -y
#鏡像操作安裝apache軟件包
EXPOSE 80
#開啟80端口
ADD index.html /var/www/html/index.html
#復制網頁首頁文件
ADD run.sh /run.sh
#將啟動腳本添加到鏡像中
RUN chmod 777 /run.sh
#修改腳本執行權限
CMD ["/run.sh"]
#啟動容器時執行腳本

[root@master ~]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND

[root@master ~]# vim index.html 
this is test

[root@master ~]# docker build -t httpd:centos .
#在Dockerfile文件目錄下,運行命令,註意後面的點,一定要有
[root@master ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               centos              ef950765e1bb        2 minutes ago       319 MB
daoke               test                2850c25d855b        24 minutes ago      215 MB
docker.io/centos    latest              5182e96772bf        6 days ago          200 MB
#可以看到第一個就是我們剛才創建的鏡像

將新創建的鏡像加載到容器中運行

[root@master ~]# docker run -d -p 1200:80 httpd:centos
519bf067d1ad0e06aeb030530d3bcb517be1424ed41c0635d6aca28784c80143

[root@master ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
519bf067d1ad        httpd:centos        "/run.sh"           24 seconds ago      Up 23 seconds       0.0.0.0:1200->80/tcp   pedantic_elion

可以看到鏡像已經在容器中運行,訪問虛擬機IP以及端口即http://192.168.58.159:1200,成功訪問首頁。
技術分享圖片

將鏡像上傳到公有倉庫中

隨著創建的鏡像日益增多,就需要一個保存鏡像的地方,這就是倉庫。目前有兩種倉庫:公共倉庫和私有倉庫。最方便的就是使用公共倉庫和下載鏡像,下載公共倉庫的鏡像不需要註冊,但是上傳鏡像到公共倉庫需要註冊,在填完username和passwaord後就可以上傳自己的鏡像了。

[root@master ~]# docker login 
Login with your Docker ID to push and pull images from Docker Hub. If you don‘t have a Docker ID, head over to https://hub.docker.com to create one.
Username: lightblueyx
Password: 
Login Succeeded

[root@master ~]# docker tag httpd:centos lightblueyx/httpd:centos
[root@master ~]# docker push lightblueyx/httpd:centos 
The push refers to a repository [docker.io/lightblueyx/httpd]
cdf567d92322: Pushed 
619278fd492d: Pushed 
7e054e58afc8: Pushed 
abf29fcf5046: Pushed 
1d31b5806ba4: Pushed 
centos: digest: sha256:6ce997f142e7757853296a314ea4de4309785867988ddc06dae57d5bacc428e6 size: 1362

技術分享圖片

將鏡像上傳到私有倉庫中

可以使用registry來搭建本地私有倉庫,首先需要構建私有倉庫的服務器上下載registry鏡像。

[root@master ~]# docker pull registry
Using default tag: latest
Trying to pull repository docker.io/library/registry ... 
latest: Pulling from docker.io/library/registry
4064ffdc82fe: Pull complete 
c12c92d1c5a2: Pull complete 
4fbc9b6835cc: Pull complete 
765973b0f65f: Pull complete 
3968771a7c3a: Pull complete 
Digest: sha256:51bb55f23ef7e25ac9b8313b139a8dd45baa832943c8ad8f7da2ddad6355b3c8
Status: Downloaded newer image for docker.io/registry:latest

之後需要在/etc/docker目錄下面創建一個json文件,否則在往自定義的私有倉庫中上傳鏡像的時候會報錯,然後重新啟動docker服務。

[root@master ~]# vim /etc/docker/daemon.json 
{ "insecure-registries":["192.168.58.159:5000"]}
[root@master ~]# systemctl restart docker.service 

然後使用下載好的registry鏡像啟動一個容器,默認情況下倉庫存放於容器內的/tmp/registry目錄中,使用-v選項可以將本地目錄掛載到容器內的/tmp/registry下使用,這樣就不怕容器被刪除後鏡像也隨之消失。在本地啟動一個私有倉庫服務,監聽端口和json文件端口一致。

[root@master ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
b592e059d495c1498f364d4c4c676b18ee3b8e8468fbc054fc598835b7cb2a5a

使用docker tag命令將要上傳的鏡像標記為192.168.58.159:5000/daoke.

[root@master ~]# docker tag daoke:test 192.168.58.159:5000/daoke
[root@master ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
httpd                       centos              ef950765e1bb        46 minutes ago      319 MB
lightblueyx/httpd           centos              ef950765e1bb        46 minutes ago      319 MB
192.168.58.159:5000/daoke   latest              2850c25d855b        About an hour ago   215 MB
daoke                       test                2850c25d855b        About an hour ago   215 MB
docker.io/centos            latest              5182e96772bf        6 days ago          200 MB
docker.io/registry          latest              b2b03e9146e1        5 weeks ago         33.3 MB

使用docker push上傳標記的鏡像。

[root@master ~]# docker push 192.168.58.159:5000/daoke
The push refers to a repository [192.168.58.159:5000/daoke]
3a1d67a7fe13: Pushed 
latest: digest: sha256:7eaeca4042df243bcec277baf4867b04ad6e0b1f112b8324e05655f216dc919f size:

在本地可以查看到上傳的鏡像。

[root@master ~]# cd /data/
[root@master data]# ls
registry

Docker鏡像的創建及上傳