1. 程式人生 > >Docker 鏡像創建、私有倉庫搭建和數據管理

Docker 鏡像創建、私有倉庫搭建和數據管理

naconda 清除緩存 pro 管理操作 med recreate 環境變量 rom down

Docker 鏡像的創建方法

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

創建鏡像的三種方法 :

  • 基於已有的鏡像創建
  • 基於本地模板創建
  • 基於 Dockerfile 創建 (推薦)

基於已有的鏡像創建 :

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

命令格式 :docker commit [選項] 容器ID/名稱 倉庫名稱:[標簽]

-m:說明信息

-a:作者信息

-p:生成過程中停止容器的運行

[root@localhost ~]# docker images        #已有的鏡像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos/httpd        latest              e23d3fcb4169        2 weeks ago         296MB
[root@localhost ~]# docker create -it centos/httpd /bin/bash      #創建容器
8fc4cfb9a461d14526e44b3767810d893eec46363e30591ddaf644430ad03f66
[root@localhost ~]# docker ps -a        #查看進程
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8fc4cfb9a461        centos/httpd        "/bin/bash"         24 seconds ago      Created                                 keen_bhabha
[root@localhost ~]# docker commit -m "new" -a "haike" 8fc4cfb9a461 haike:test  #創建新的鏡像
sha256:e429fccbc44f20d1302fd1a77905d06b8614323c2da321607095c41c5f8ac58d
[root@localhost ~]# docker images    
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
haike               test                e429fccbc44f        17 seconds ago      296MB
centos/httpd        latest              e23d3fcb4169        2 weeks ago         296MB

基於本地模板創建 :

通過導入操作系統模板文件可以生成鏡像,模板可以從 OPENVZ 開源項目下載,下載地址 http://openvz.org/Download/template/precreated

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz   #下載 debian 模板壓縮包

cat debian-7.0-x86-minimal.tar.gz | docker import - haike:new   #導入

docker images | grep new

基於 Dockerfile 創建 :

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

Dockerfile 結構大致分為四個部分 :基礎鏡像信息、維護者信息、鏡像操作指令和容器指定啟動時執行指令。

1.編輯 Dockerfile 文件 :

mkdir  apache
cd  apache

vim Dockerfile    #固定格式

#基於的基礎鏡像
FROM centos       #第一行必須指明所基於的鏡像名稱(本地不存在會自動從公共倉庫下載)
#維護鏡像的用戶信息
MAINTAINER The porject <[email protected]>
#鏡像操作指令安裝apache軟件
RUN yum -y update
RUN yum -y install httpd
#開啟 80 端口
EXPOSE 80
#復制網站首頁文件
ADD index.html /var/www/html/index.html
#將執行腳本復制到鏡像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#啟動容器時執行腳本
CMD ["/run.sh"]

Dockerfile 操作指令

指令 含義
FROM 鏡像 指定新鏡像所基於的鏡像,第一條指令必須為FORM指令,每創建一個鏡像就需要一條FROM指令
MAINTAINER名字 說明新鏡像的維護人信息
RUN 命令 在所基於的鏡像上執行命令,並提交到新的鏡像中
CMD["要運行的程序","參數1","參數2"] 指定啟動容器時要運行的命令或腳本,Dockerfile只能有一條CMD命令,如果指定多條則只執行最後一條
EXPOSE 端口號 指定新鏡像加載到Docker時需要開啟的端口
ENV 環境變量 變量值 設置一個環境變量的值,會被後面的RUN使用
ADD 源文件/目錄 目標文件/目錄 將源文件復制到目標文件,源文件要與Dockerfile位於相同目錄中,或者是一個URL
COPY 源文件/目錄 目標文件/目錄 將本地主機上的源文件/目標復制到目標地點,源文件/目錄要與Dockerfile位於相同目錄中
VOLUME ["目錄"] 在容器中創建一個掛載點
USER 用戶名/UID 指定運行容器時的用戶
WORKDIR 路徑 為後續的RUN、CMD、ENTRYPOINT 指定工作目錄
ONBUILD 命令 指定所生成的鏡像作為一個基礎鏡像時所需要運行的命令

2.編寫執行腳本 :

vim run.sh

#!/bin/bash
rm -rf /run/httpd/*   #清除緩存
exec /usr/sbin/apachectl -D FOREGROUND   #啟動 httpd 服務

3.創建測試首頁 :

echo "web test" > index.html
[root@localhost apche]# ls    #三個文件必須在同一文件夾下
Dockerfile  index.html  run.sh

4.生成鏡像 :

docker build -t httpd:centos .   #註意有一個空格點   -t :指定鏡像的標簽信息

5.使用新的鏡像運行容器 :

[root@localhost apche]# docker run -d -p 1213:80 httpd:centos    #-p實現本地端口1213映射到容器80端口
ca6935190dcd0335a10ef008426df718a8443b1d7512057728894bdf3773996f
[root@localhost apche]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
ca6935190dcd        httpd:centos        "/run.sh"           8 seconds ago       Up 7 seconds        0.0.0.0:1213->80/tcp   modest_ritchie
8fc4cfb9a461        centos/httpd        "/bin/bash"         About an hour ago   Created                                    keen_bhabha

6.測試網頁訪問 :

技術分享圖片


構建私有倉庫

1.使用 registry 搭建 :

[root@localhost ~]# docker pull registry
Using default tag: latest
latest: Pulling from 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 registry:latest

2.創建 json 文件 :

vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.217.149:5000"]}   #本地IP地址

systemctl restart docker.service    #重啟服務

3.將本地目錄掛載到容器內 :

docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry 
#本地 容器  鏡像名稱    

4.更改上傳鏡像標簽 :

docker tag centos/httpd 192.168.217.149:5000/httpd  

5.上傳更改過標簽鏡像 :

[root@localhost ~]# docker push 192.168.217.149:5000/httpd
The push refers to a repository [192.168.217.149:5000/httpd]
f343a0957e4a: Pushed 
a0478e9c2d36: Pushed 
4da51a5114d3: Pushed 
bcc97fbfc9e1: Pushed 
latest: digest: sha256:e90736de0cd0c46c20dc8fb91e0c7a3f98863e8f3efde97a8d7bd455e5ac6e54 size: 1155

6.查看私有倉庫 :

[root@localhost ~]# curl http://192.168.217.149:5000/v2/_catalog
{"repositories":["httpd"]}

Docker 數據管理

在 Docker 中,為了方便查看容器內產生的數據或者將多個容器中的數據實現共享,就涉及到容器的數據管理操作。

數據卷

數據卷是一個提供使用的特殊目錄,位於容器中,可以將宿主機的目錄掛載到數據卷上,對數據卷的修改操作立刻可見,並且更新數據不會影響鏡像,從而實現數據在宿主機與容器之間的遷移。

1.掛載容器 :

[root@bogon ~]# docker run -v /var/www/:/data1 --name test -it centos /bin/bash
[root@3526de223cb8 /]# 
#宿主機目錄/var/www 掛載容器中的/data1  目錄不存在會自動創建   --name:給容器創建名稱  -v:創建數據卷

2.測試同步 :

[root@3526de223cb8 /]# cd data1/
[root@3526de223cb8 data1]# ls
cgi-bin  html
[root@3526de223cb8 data1]# mkdir tset01    
[root@3526de223cb8 data1]# ls
cgi-bin  html  tset01
[root@3526de223cb8 data1]# exit
exit
[root@bogon ~]# cd /var/www/
[root@bogon www]# ls
cgi-bin  html  tset01

數據卷容器

容器之間共享數據,最簡單的方法就只使用數據卷容器。

[root@bogon ~]# docker run --name test01 -v /data1 -v /data2 -it centos /bin/bash
#在test01容器裏創建兩個文件夾
[root@1db1dbc9562d /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
[root@1db1dbc9562d /]# exit
exit
[root@bogon ~]# docker run -it --volumes-from test01 --name db1 centos /bin/bash
#在db1容器裏使用--volumes-from 命令掛載test01的目錄 
[root@a7346747b658 /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
[root@a7346747b658 /]# cd data1
[root@a7346747b658 data1]# ls
[root@a7346747b658 data1]# mkdir test   #創建文件夾測試
[root@a7346747b658 data1]# ls
test
[root@a7346747b658 data1]# exit
exit
[root@bogon ~]# docker exec -it test01 /bin/bash   
#test01 容器需要創建、開啟才能進入 已完成忽略
[root@1db1dbc9562d /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
[root@1db1dbc9562d /]# cd data1/
[root@1db1dbc9562d data1]# ls
test

Docker 鏡像創建、私有倉庫搭建和數據管理