Docker鏡像除了是Docker的核心技術以外也是應用發佈的標準格式。一個完整的Docker鏡像能夠支撐一個Docker容器的運行,在Docker的整個使用過程當中,進入一個已經定型的容器以後,就能夠在容器中,進行操做,最多見的操做就是在容器中安裝應用,若是要把已經安裝的服務進行遷移,就須要把環境以及搭建的服務生成新的鏡像。html
建立鏡像的方法有三種,分別是基於已有鏡像、基於本地模版以及基於Dockerfile建立。docker
基於已有的鏡像建立主要使用docker commit命令。實質上就是把一個容器運行的程序以及該程序的運行環境打包起來生成新的鏡像。apache
下面啓動一個已經有的鏡像,在裏面容器修改後,將修改後的容器提交成爲新的鏡像。json
[root@master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos latest 5182e96772bf 6 days ago 200 MB
啓動一個容器vim
[root@master ~]# docker run -itd 5182e96772bf /bin/bash WARNING: IPv4 forwarding is disabled. Networking will not work. 4faf98f1c6619212c3205b0a7830617ff69d457c0882ed0ca4e71430fc549406
這裏提示ipv4的路由功能沒有開啓,因此,咱們須要開啓ipv4的路由轉發功能。centos
[root@master ~]# sysctl -p net.ipv4.ip_forward = 1
將已經建立的容器中止而且刪除,從新啓動一個容器。bash
[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服務。app
[root@master ~]# docker exec -it cbeb511d2b9a /bin/bash [root@cbeb511d2b9a /]# rpm -q httpd package httpd is not installed
能夠看到沒有安裝,咱們使用yum安裝httpd服務後,將這個容器裏面運行的程序及環境從新打包生成新的鏡像。dom
[root@cbeb511d2b9a /]# yum install httpd -y [root@cbeb511d2b9a /]# rpm -q httpd httpd-2.4.6-80.el7.centos.1.x86_64 #顯示已經安裝好httpd
咱們使用docker commit命令建立一個新的鏡像,其中有幾個經常使用選項:
[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信息,查看本地鏡像列表能夠看到新建立的鏡像信息。
除了手動生成Docker鏡像以外,還可使用Dockerfile自動生成鏡像。Dockerfile是由一組指令組成的文件,其中每條命令對應Linux中的一條命令,Docker程序將讀取Dockerfile中的指令生成指定的鏡像。
[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