亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker 鏡像的創建與構建私有庫

發布時間:2020-07-18 18:43:35 來源:網絡 閱讀:305 作者:張九冫 欄目:云計算

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

創建鏡像的方法有三種,分別是基于已有鏡像創建、基于本地模板創建及基于dockerfile創建。

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

命令格式:docker commit [選項] 容器ID/名稱 倉庫名稱:[標簽]
常用選項
-m:說明信息;
-a:作者信息;
-p:生成過程中停止容器的運行;

啟動一個鏡像,在容器里做修改,然后將修改后的容器提交為新的鏡像,需要記住該容器的ID號

[root@test /]# docker ps -a                   # 查看當前容器
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
bdd5bb814008        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   5 seconds ago       Created                                 stupefied_ptolemy
[root@test /]# docker exec -it bdd5bb814008 /bin/bash            # 進入到該容器,創建一個測試文件
root@bdd5bb814008:/# ls
bin  boot  core  dev  entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@bdd5bb814008:/# touch test.txt
root@bdd5bb814008:/# exit
exit
[root@test /]# docker commit -m "newdhcp" -a "test" bdd5bb814008 docker:mydhcp          # 將已有容器創為鏡像
sha256:d6197c6e3f650d3ef69d13324634759705821b0ed516e8fe631fded72acb9d54
[root@test /]# docker images  | grep docker              # 查看剛剛創建好的鏡像
docker                        mydhcp              d6197c6e3f65        24 seconds ago      125 MB
docker.io/networkboot/dhcpd   latest              6f98b6b9b486        19 months ago       125 MB
[root@test /]# docker create -it docker:mydhcp /bin/bash               # 添加為容器
ea434b08d511867be662704ee81d0b5876e922efa50f5f52843daa762185c16a
[root@test /]# docker ps -a
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
ea434b08d511        docker:mydhcp                 "/entrypoint.sh /b..."   25 seconds ago      Created                                 compassionate_shirley
bdd5bb814008        docker.io/networkboot/dhcpd   "/entrypoint.sh /b..."   5 minutes ago       Up 4 minutes                            stupefied_ptolemy
[root@test /]# docker start ea434b08d511                        # 啟動該容器
ea434b08d511
[root@test /]# docker exec -it ea434b08d511 /bin/bash             # 進入到該容器,查看剛剛所創建的測試文件
root@ea434b08d511:/# ls
bin  boot  core  dev  entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test.txt  tmp  usr  var

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

[root@test /]# wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
# 下載一個迷你版的Ubuntu模板
[root@test /]# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - docker:new
sha256:7457fecee0fb28ab06d935e7a9a5a040d9d6ec8931959b752f596cde76a5d647
# 將模板導入
[root@test /]# docker images |grep new              # 查看已經導入
docker                        new                 7457fecee0fb        About a minute ago   215 MB

3、基于 Dockerfile 創建
dockerfile是由一組指令組成的文件,其中每條指令對應Linux中的一條命令,docker程序將讀取dockerfile中的指令生成指定鏡像。

dockerfile結構大致分為四個部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。dockerfile每行支持一條指令,每條指令可攜帶多個參數,支持使用“#”號開頭的注釋。
dockerfile中的配置項介紹:

[root@localhost ~]# docker tag docker:new centos7:system            
#將上面下載的centos 7迷你鏡像更改下名字及標簽,以便區分
[root@localhost ~]# docker images | grep system             
#確認基礎鏡像已經準備好(就是一個centos 7的迷你系統進行)
centos7                       system              c065d5c0571d        About an hour ago   435 MB
[root@localhost ~]# vim Dockerfile   #編輯一個Dockerfile文件,注意:文件名最好就是Dockerfile

FROM centos           #第一行必須指明基于的基礎鏡像(該鏡像必須存在)
MAINTAINER The centos project <ljz@centos.org>    #維護該鏡像的用戶信息
#以下是鏡像的操作指令
RUN yum -y update      
RUN yum -y install openssh-server
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
EXPOSE 22       #開啟22端口
CMD ["/usr/sbin/sshd","-D"]     #啟動容器時執行指令

在編寫dockerfile時,有嚴格的格式需要遵循:第一行必須使用FROM指令指明所基于的鏡像名稱;之后使用MAINTAINER指令說明維護該鏡像的用戶信息;然后是鏡像操作相關指令,如RUN指令,每運行一條指令,都會給基礎鏡像添加新的一層;最后使用CMD指令來指定啟動容器時要運行的命令操作。

dockerfile有十幾條命令可用于構建鏡像,其中常見的指令如下:

Docker 鏡像的創建與構建私有庫
例:使用dockerfile創建apache鏡像并在容器中運行

[root@test /]# mkdir apache                        # 創建工作目錄
[root@test /]# cd /apache/
[root@test apache]# vim Dockerfile                # 創建并編寫 Dockerfile文件
FROM    centos                               # 基于的基礎鏡像centos
MAINTAINER      the centos            # 維護該鏡像的用戶信息
RUN     yum -y update                     # 鏡像操作指令安裝 Apache 軟件包
RUN     yum -y install httpd 
EXPOSE  80                                    # 開啟80端口
ADD     index.html /var/www/html/index.html               # 復制網站首頁文件
ADD     run.sh /run.sh                     # 將執行腳本復制到鏡像中
RUN     chmod 775 /run.sh             
RUN     systemctl disable httpd           # 設置Apache服務不自行啟動
CMD     ["/run.sh"]                     # 啟動容器時執行腳本

[root@test apache]# vim run.sh                     # 編寫執行腳本內容
#!/bin/bash
rm -rf /run/httpd/*                           # 清理 httpd 緩存
exec /usr/sbin/apachectl -D FOREGROUND                # 啟動Apache服務
[root@test apache]# echo "www.test.com" > index.html                 # 創建測試頁面
[root@test apache]# ls
Dockerfile  index.html  run.sh
[root@test apache]# docker build -t httpd:centos .               
............................               // 省略部分內容
# 注意注意注意:這條命令后面有一個“.”    代表當前路徑,否則會報錯,切記千萬不要忘記
[root@test apache]# docker run -d -p 12345:80 httpd:centos               # 使用新的鏡像運行容器,-p 選項實現從本地端口12345到容器的80端口映射
0721b1641ce0651d618a393b85d34606180dd33d4795621db320865cda8f3a0a
[root@test apache]# docker ps -a             # 查看容器
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                   NAMES
0721b1641ce0        httpd:centos                  "/run.sh"                6 seconds ago       Up 6 seconds        0.0.0.0:12345->80/tcp   sad_mcclintock

訪問容器中的apache服務
Docker 鏡像的創建與構建私有庫
二、搭建私有庫及其使用方法
隨著創建的鏡像增多,就需要有一個保存鏡像的地方,這就是倉庫,目前有兩種倉庫:公共倉庫和私有倉庫,公司的生產環境中大多數都是保存到私有倉庫的,最簡單的還是在公共倉庫上下載鏡像,若是上傳鏡像至公共倉庫,還需要注冊并登陸,關于公共倉庫的上傳,可以參考https://blog.51cto.com/14227204/2453408
怎么構建私有倉庫呢?可以使用registry來搭建本地私有倉庫

[root@test ~]# docker search registry               #查詢關鍵字“registry”
INDEX       NAME                                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/registry                            The Docker Registry 2.0 implementation for...   2679      [OK]       
                 ..................#省略部分內容
[root@localhost ~]# docker pull docker.io/registry     #下載排名靠前的鏡像
                 ..................#省略部分內容
Status: Downloaded newer image for docker.io/registry:latest    #下載成功
[root@localhost ~]# vim /etc/sysconfig/docker           
#修改docker配置文件指定私有倉庫URL,否則在自定義的私有倉庫中上傳鏡像時會報錯

# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --insecure-registry=192.168.1.1:5000'
#更改上面一行內容,其中的IP地址是作為私有倉庫服務器的IP地址,這里就是本機的IP地址。
                           ..................#省略部分
#修改完畢后保存退出
[root@test ~]# systemctl restart docker      #重啟docker

使用下載好的registry鏡像啟動一個容器,默認情況下倉庫存放于容器內的/tmp/registry目錄下,使用-v選項可以將本地目錄掛載到容器內的/tmp/registry目錄下使用,這樣就不怕容器被刪除后鏡像也會隨之丟失。在本地啟動一個私有倉庫服務,監聽端口號為5000。

注意:我本地有一個/data/registry目錄(掛載的是一個高可用的GFS文件系統,也可以使用NFS,自行選擇即可,但是建議對于重要的數據存放目錄,一定要保證容量的動態擴展以及磁盤損壞造成數據丟失的問題),將要掛載到私有倉庫容器中的/tmp/registry目錄中用于存放上傳到私有倉庫的鏡像文件。

[root@test ~]# df -hT /data/registry/             #查看我這個目錄所使用的文件系統
文件系統         類型            容量  已用  可用 已用% 掛載點
node4:dis-stripe fuse.glusterfs   80G  130M   80G    1% /data/registry
[root@test ~]# docker run -d -p 5000:5000 -v /data/registry/:/tmp/registry docker.io/registry
#啟動私有倉庫,并做端口映射到主機的5000端口,將本地的/data/registry目錄掛載到容器中的/tmp/registry目錄
#docker.io/registry是剛才下載的私有倉庫鏡像。
a6bf726c612b826e203d6a5bc9eaba26c36195913d3ea546c2111ce290a5524d
[root@test ~]# docker tag docker.io/registry 192.168.1.1:5000/registry     
#使用docker  tag命令將要上傳的鏡像docker.io/registry改一下標記,其中的IP及端口為固定的,否則無法連接到私有倉庫
#因為在上面運行容器時,做了端口映射,將私有倉庫的端口號映射到了宿主機的5000端
口,
#所以直接訪問宿主機的5000端口,就相當于訪問了私有倉庫。
[root@test ~]# docker images | grep 5000            #找到要上傳的鏡像
192.168.1.1:5000/registry     latest              f32a97de94e1        6 months ago        25.8 MB
[root@test ~]# docker push 192.168.1.1:5000/registry            #上傳至剛剛運行的私有倉庫
The push refers to a repository [192.168.1.1:5000/registry]
73d61bf022fd: Pushed 
5bbc5831d696: Pushed 
d5974ddb5a45: Pushed 
f641ef7a37ad: Pushed 
d9ff549177a9: Pushed 
latest: digest: sha256:b1165286043f2745f45ea637873d61939bff6d9a59f76539d6228abf79f87774 size: 1363
#下面再上傳一個鏡像,進行測試。
[root@test ~]# docker images | grep mynamed            #就上傳它了
docker                        mynamed             e178f320e482        4 hours ago         323 MB
[root@test ~]# docker tag docker:mynamed 192.168.1.1:5000/named:test    
#老規矩,必須改倉庫名,注意:若標簽不是默認的latest,那么還需要在倉庫名后面接上標簽名
[root@test ~]# docker images | grep 192.168.1.1:5000/named     #確定更改成功
192.168.1.1:5000/named        test                e178f320e482        4 hours ago         323 MB
[root@test ~]# docker push 192.168.1.1:5000/named:test       #上傳至私有倉庫
The push refers to a repository [192.168.1.1:5000/named]
c756b9ec7fb0: Pushed 
7d8d01394159: Pushed 
72b7cd87d69b: Pushed 
3be48ef75683: Pushed 
9b28c58ad64b: Pushed 
75e70aa52609: Pushed 
dda151859818: Pushed 
fbd2732ad777: Pushed 
ba9de9d8475e: Pushed 
test: digest: sha256:44894a684eac72a518ae5fa66bcbe4e4a9429428ef7ac6f4761022f8ac45ac5f size: 2403

至此,測試就完畢了,但是,如何證明私有倉庫使用的是本地的/data/registry這個目錄呢?以及如何查看上傳的鏡像呢?(上傳至私有倉庫的鏡像是無法使用普通的ls命令查看的)。

[root@test ~]# df -hT /data/registry/           #先查看本地/data/registry/ 掛載的文件系統
文件系統         類型            容量  已用  可用 已用% 掛載點
node4:dis-stripe fuse.glusterfs   80G  130M   80G    1% /data/registry
[root@test ~]# docker exec -it a6bf726c612b /bin/sh 
#進入私有倉庫的容器中,該容器沒有/bin/bash,所以使用的是/bin/sh。
/ # df -hT /tmp/registry/   #查看發現,該目錄掛載的和宿主機掛載的文件系統是同一個,說明沒問題。
Filesystem           Type            Size      Used Available Use% Mounted on
node4:dis-stripe     fuse.glusterfs
                                    80.0G    129.4M     79.8G   0% /tmp/registry
                   ——————————————————————
#那么如何查看上傳至私有倉庫的鏡像呢?請看下面:
[root@test ~]# curl -XGET http://192.168.1.1:5000/v2/_catalog   
#查看已經上傳的鏡像,可以看到剛剛上傳的那兩個鏡像
{"repositories":["named","registry"]}
#只知道鏡像名還不夠,若要下載,還需要鏡像對應的標簽,那么怎么查看某個鏡像的標簽呢?
[root@test ~]# curl -XGET http://192.168.1.1:5000/v2/named/tags/list
#就這樣查看咯,上面URL路徑中的named就是鏡像名,查看的就是鏡像named對應的標簽
{"name":"named","tags":["test"]}
[root@test ~]# docker pull 192.168.1.1:5000/named:test      #將私有倉庫中的鏡像下載下來
#前面必須指定私有倉庫的訪問地址,就是上傳時的名字是什么,下載時就是什么,哪怕查詢的鏡像名中沒有IP地址。
Trying to pull repository 192.168.1.1:5000/named ... 
sha256:44894a684eac72a518ae5fa66bcbe4e4a9429428ef7ac6f4761022f8ac45ac5f: Pulling from 192.168.1.1:5000/named
Digest: sha256:44894a684eac72a518ae5fa66bcbe4e4a9429428ef7ac6f4761022f8ac45ac5f
Status: Downloaded newer image for 192.168.1.1:5000/named:test

若需要在其他服務器上下載私有倉庫的鏡像,需要在那個其他服務器上執行以下命令,以便指定私有倉庫服務器地址:

[root@node1 ~]# echo '{ "insecure-registries":["xxx.xxx.xxx.xxx:5000"] }' > /etc/docker/daemon.json
#其中xxx.xxx.xxx.xxx:5000代表訪問私有倉庫的IP地址及端口,根據自己的服務器情況來定
[root@node1 ~]#systemctl restart docker          #重啟docker服務
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

元氏县| 海阳市| 陕西省| 新闻| 大厂| 合作市| 开江县| 镇赉县| 巢湖市| 云南省| 江都市| 德江县| 盐山县| 北碚区| 黑山县| 深圳市| 盐山县| 鄂州市| 宾阳县| 三台县| 嘉义县| 长宁区| 长海县| 镶黄旗| 阳高县| 探索| 通海县| 延川县| 哈密市| 和政县| 正安县| 勃利县| 离岛区| 利川市| 本溪市| 奎屯市| 利辛县| 宝鸡市| 娱乐| 中方县| 五原县|