天天看點

docker 基本操作Ⅱ(關于鏡像操作)

1 通過模闆建立鏡像

- 導入鏡像基本操作

<code>https:</code><code>//openvz</code><code>.org</code><code>/Download/template/precreated</code> <code>在這個網址裡面下載下傳對應的模闆</code>

<code>[root@chy src]</code><code># wget http://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz //下載下傳centos7的模闆</code>

<code>[root@chy src]</code><code># cat centos-7-x86_64-minimal.tar.gz |docker import - centos7 //導入鏡像</code>

<code>sha256:3e6c83d2f3749ae4cde27673354cab305bfdc360e40d10d072f6a7dfd3edcdca</code>

<code>[root@chy src]</code><code># docker images //檢視已經導入的鏡像</code>

<code>REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</code>

<code>centos7             latest              3e6c83d2f374        2 minutes ago       435MB</code>

<code>centos_with_net     latest              87dde0ff7187        21 hours ago        277MB</code>

<code>centos              latest              d123f4e55e12        10 days ago         197MB</code>

<code>[root@chy src]</code><code># docker run -itd centos7 bash//将鏡像啟動centos7的容器</code>

<code>67c68340c58643e4e085dc04fe7552bad4ff6c41c612c26e9ce99e63b4872317</code>

<code>[root@chy src]</code><code># docker exec -it 67c68340c5 bash //進入到centos7的容器裡</code>

<code>[root@67c68340c586 /]</code><code># cat /etc/issue //檢視版本</code>

<code>[root@67c68340c586 /]</code><code># uname -a //檢視核心(這個核心與主控端的核心是一緻的,如果我的鏡像的模闆是centos6的,我的主控端是centos7的那我最後在docker鏡像裡檢視的核心也就是centos7的。</code>

<code>Linux 67c68340c586 3.10.0-514.el7.x86_64 </code><code>#1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux</code>

- 導出/恢複鏡像基本操作

<code>[root@chy ~]</code><code># docker save -o centos7-daochu.tar centos7// -o 後面跟的是centos7-daochu(導出後的檔案名)centos7這個是要導出的鏡像名</code>

<code>[root@chy ~]</code><code># docker rm -f 67c68340c586//删除運作的容器</code>

<code>67c68340c586</code>

<code>[root@chy ~]</code><code># docker rmi 3e6c83d2f374 删除鏡像</code>

<code>Untagged: centos7:latest</code>

<code>Deleted: sha256:3e6c83d2f3749ae4cde27673354cab305bfdc360e40d10d072f6a7dfd3edcdca</code>

<code>Deleted: sha256:788edba9eaa8ade63d8ba9d5747281c5da2b34b12a6c80f4dffd8ad9e05f68c1</code>

<code>[root@chy ~]</code><code># docker images //檢視沒有鏡像</code>

<code>centos_with_net     latest              87dde0ff7187        22 hours ago        277MB</code>

<code>[root@chy ~]</code><code># docker load --input centos7-daochu.tar //恢複鏡像(恢複鏡像還有一個指令是docker load &lt; centos7-daochu</code>

<code>788edba9eaa8: Loading layer [==================================================&gt;]  446.1MB</code><code>/446</code><code>.1MB</code>

<code>Loaded image: centos7:latest</code>

<code>[root@chy ~]</code><code># docker images //檢視已經恢複成功</code>

<code>centos7             latest              3e6c83d2f374        38 minutes ago      435MB</code>

導出鏡像還有一個指令是如下

<code>docker </code><code>export</code> <code>container_id &gt; </code><code>file</code><code>.</code><code>tar</code> <code>//</code> <code>導出容器,可以遷移到其他機器上,需要導入</code>

<code>cat</code> <code>file</code><code>.</code><code>tar</code> <code>|docker </code><code>import</code> <code>- aming_test  </code><code>//</code><code>這樣會生成aming_test的鏡像(導入鏡像)</code>

2 容器管理

<code>[root@chy ~]</code><code># docker create -it centos7 bash //建立容器但是容器沒有啟動</code>

<code>[root@chy ~]</code><code># docker start 438606c //啟動容器</code>

<code>438606c</code>

<code>[root@chy src]</code><code># docker run -itd centos7 //這個也是啟動容器之不多這個是create與start融為一體了</code>

<code>[root@chy ~]</code><code># docker run -itd --name centos6 centos_with_net bash // --name 給容器自定義名字</code>

<code>46fe5b5e5d2768727e8256e79ba6a3b3255394bda5398ec4011526fec8437dbc</code>

<code>[root@chy ~]</code><code># docker ps //檢視定義的名稱centos6,這個在進入容器的時候就可以直接跟名字不用給它的id了</code>

<code>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES</code>

<code>46fe5b5e5d27        centos_with_net     </code><code>"bash"</code>              <code>7 seconds ago       Up 5 seconds                            centos6</code>

<code>[root@chy ~]</code><code># docker run --rm -it centos_with_net  bash -c "sleep 30" //--rm 可以讓容器退出後直接删除,在這裡指令執行完容器就會退出</code>

<code>[root@chy ~]</code><code># docker logs 34effba //擷取到容器的運作曆史資訊</code>

<code>111</code>

<code>[root@chy ~]</code><code># docker exec -it 34effba bash //可以臨時打開一個虛拟終端,并且exit後,容器依然運作着</code>

<code>[root@chy ~]</code><code># docker rm 34effba//删除容器,如果要删除的是一個運作的容器需要加-m 後面在跟container_id,(container_id是ps的時候檢視到的)</code>

<code>34effba</code>

<code>[root@chy ~]</code><code># docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) //啟動所有的容器指令</code>

<code>46fe5b5e5d27</code>

<code>438606c2d465</code>

<code>[root@chy ~]</code><code># docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2) //删除所有的容器指令</code>

<code>docker rmi $(docker images | </code><code>awk</code> <code>'{print $3}'</code> <code>|</code><code>tail</code> <code>-n +2) </code><code>//</code><code>删除所有的鏡像</code>

3 倉庫管理

- 建立私有倉庫

<code>[root@chy ~]</code><code># docker pull registry //下載下傳registry 鏡像,registy為docker官方提供的一個鏡像,我們可以用它來建立本地的docker私有倉庫</code>

<code>[root@chy ~]</code><code>#  docker run -d -p 5000:5000 registry //以registry鏡像啟動容器,-p會把容器的端口映射到主控端上,:左邊為主控端監聽端口,:右邊為容器監聽端口</code>

- 将鏡像上傳到私有倉庫

<code>[root@chy ~]</code><code># docker tag centos7 192.168.212.10:5000/centos7 //标記一下tag,必須要帶有私有倉庫的ip:port</code>

<code>[root@chy ~]</code><code># docker images</code>

<code>REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE</code>

<code>192.168.212.10:5000</code><code>/centos7</code>   <code>latest              3e6c83d2f374        2 hours ago         435MB</code>

<code>centos7                       latest              3e6c83d2f374        2 hours ago         435MB</code>

<code>centos_with_net               latest              87dde0ff7187        24 hours ago        277MB</code>

<code>registry                      latest              a07e3f32a779        10 days ago         33.3MB</code>

<code>centos                        latest              d123f4e55e12        10 days ago         197MB</code>

<code>[root@chy ~]</code><code># docker push 192.168.212.10:5000/centos7 //上傳時報了如下的錯誤</code>

<code>The push refers to a repository [192.168.212.10:5000</code><code>/centos7</code><code>]</code>

<code>Get https:</code><code>//192</code><code>.168.212.10:5000</code><code>/v2/</code><code>: http: server gave HTTP response to HTTPS client</code>

<code>解決方法如下:</code>

<code>[root@chy ~]</code><code># vi /etc/docker/daemon.json //更改配置檔案</code>

<code>{ </code><code>"insecure-registries"</code><code>:[</code><code>"192.168.212.10:5000"</code><code>] }</code>

<code>如上指定一個私有倉庫的位址,這個位址是主控端的位址</code>

<code>[root@chy ~]</code><code># systemctl restart docker //重新開機服務</code>

<code>[root@chy ~]</code><code># docker start ef587be45616 //啟動私有倉庫的容器</code>

<code>ef587be45616</code>

<code>[root@chy ~]</code><code># docker push 192.168.212.10:5000/centos7 //上傳鏡像到私有倉庫</code>

<code>788edba9eaa8: Pushed </code>

<code>latest: digest: sha256:d57bd79f46a10c520a62814d33a13c7c4c2b10ac143650effc9c8e35b2094565 size: 529</code>

<code>[root@chy ~]</code><code># curl 127.0.0.1:5000/v2/_catalog //檢視到推送上來的鏡像</code>

<code>{</code><code>"repositories"</code><code>:[</code><code>"centos7"</code><code>]}</code>

- 怎麼下載下傳私有倉庫的鏡像

<code>[root@chy ~]</code><code># docker pull 192.168.212.10:5000/centos7 //直接docker pull即可,這裡的ip一定要是私有倉庫的位址</code>

如果在其它機器下載下傳私有倉庫切記不要忘記指定私有倉庫位址的ip。([root@chy ~]# vi /etc/docker/daemon.json //更改配置檔案

{ "insecure-registries":["192.168.212.10:5000"] })

 4 資料管理

- 容器是由鏡像啟動的,這時如果将容器關閉或者是删除那容器裡面的資料去哪了呢?這時資料也會一并的消除,這樣肯定是不符合我們的要求的,是以呢想到了一個方法就是将主控端的一個目錄挂載到容器中,這時容器裡産生的資料都會在主控端的目錄中顯示。下面就是如何将容器中的資料搞到容器中

- 挂載本地的目錄到容器裡

<code>[root@chy ~]</code><code># docker run -tid -v /data/:/data centos7 bash ////-v 用來指定挂載目錄,:前面的/data/為主控端本地目錄,:後面的/data/為容器裡的目錄,會在容器中自動建立</code>

<code>bc7f95597ceb71a3ebfcb5f4955d171b69f740c9598396eae1234966d68d1f81</code>

<code>[root@chy ~]</code><code># ls -l /data/ 檢視主控端/data目錄</code>

<code>總用量 16</code>

<code>drwxr-xr-x 3 root   root   4096 9月   2 18:38 backup</code>

<code>drwxr-xr-x 3 root   root   4096 10月 27 06:15 gitroot</code>

<code>drwxr-xr-x 9 mysql1 mysql1 4096 11月 14 22:47 mariadb</code>

<code>drwxr-xr-x 5 root   root   4096 8月   5 04:40 wwwroot</code>

<code>[root@chy ~]</code><code># docker exec -it bc7f9559 bash</code>

<code>[root@bc7f95597ceb /]</code><code># mkdir /data/123 之後在容器中建立一個目錄</code>

<code>[root@bc7f95597ceb /]</code><code># exit</code>

<code>[root@chy ~]</code><code># ls /data/ 在主控端可以檢視到在容器中建立的目錄</code>

<code>123/       backup/    gitroot/   .htpasswd  mariadb/   wwwroot/</code>

- 挂載資料卷

<code>[root@chy ~]</code><code># docker ps //這裡需要先檢視容器的名字centos7的為sharp_kepler(檢視names下面的名字)</code>

<code>CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES</code>

<code>bc7f95597ceb        centos7             </code><code>"bash"</code>                   <code>8 minutes ago       Up 8 minutes                                 sharp_kepler</code>

<code>ef587be45616        registry            </code><code>"/entrypoint.sh /e..."</code>   <code>About an hour ago   Up About an hour    0.0.0.0:5000-&gt;5000</code><code>/tcp</code>   <code>elastic_varahamihira</code>

<code>[root@chy ~]</code><code># docker run -itd --volumes-from sharp_kepler  centos7  bash //--volumes-from後面跟容器的names的名字,之後在跟一個鏡像名</code>

<code>12204913c07468253f58a52c52e328ff5cdb1d01866ae55e86d7c9f088a0bf2f</code>

- 定義資料卷容器

有時候,我們需要多個容器之間互相共享資料,類似于linux裡面的NFS,是以就可以搭建一個專門的資料卷容器,然後其他容器直接挂載該資料卷。

<code>[root@chy ~]</code><code># docker run -itd -v /data/ --name testvol centos bash </code>

<code>這裡的-</code><code>v</code><code>是有兩層含義的第一層含義是: 冒号是用來互動主控端與容器的目錄的映射,第二層含義是作為資料卷容器就是不加冒号的寫法,第二層的含義是用來共享一個目錄,是以-</code><code>v</code> <code>/data</code><code>的目錄為共享目錄</code>

<code>然後讓其他容器挂載該資料卷</code>

<code> </code><code>docker run -itd --volumes-from testvol aming123 </code><code>bash</code>

docker 基本操作Ⅱ(關于鏡像操作)

     本文轉自我不是瘦子51CTO部落格,原文連結:http://blog.51cto.com/chy940405/1981804,如需轉載請自行聯系原作者