1. 程式人生 > >docker通過模板創建鏡像以及容器、倉庫和數據管理

docker通過模板創建鏡像以及容器、倉庫和數據管理

指定 無法 f2c fff 刪除 ado abc 用戶家目錄 att

筆記內容:docker通過模板創建鏡像以及容器、倉庫和數據管理
筆記日期:2018-02-05

  • 25.5 通過模板創建鏡像
  • 25.6 容器管理
  • 25.7 倉庫管理
  • 25.8 數據管理

25.5 通過模板創建鏡像

1.既然是通過模板創建鏡像,那麽首先肯定得先下載一個模板,地址如下:

http://openvz.org/Download/templates/precreated

打開以上網址選擇一個模板進行下載,我這裏下載的是centos-6-x86-minimal.tar.gz (signature),可以復制下載鏈接到LInux上下載,也可以直接通過windows下載,下載完之後上傳到Linux上就可以了,由於是國外的網站如果沒有加速器的話可能會下載得比較慢。

2.我是在windows上下載的,我下載完之後上傳到了Linux的用戶家目錄下,接著就是導入該鏡像,命令如下:

[root@server ~]# cat centos-6-x86-minimal.tar.gz|docker import - centos6
sha256:fbd320988956aa1d558e10966acead019d6d8df3f8118027b290d52c97b33e6e
[root@server ~]# 

3.導入完成後可以使用以下命令查看導入的鏡像:

[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos6             latest              fbd320988956        22 seconds ago      512MB
test_centos         latest              0749459e3be3        3 days ago          359MB
centos              latest              ff426288ea90        4 weeks ago         207MB
[root@server ~]# 

將該鏡像啟動為容器,並進入到容器中,查看內核信息:

[root@server ~]# docker run -itd centos6 bash  # 啟動鏡像
bd2556ce65b2b43d7901b37f3c02ee5c71334f8f960012fcc89995d59cba32ac 
[root@server ~]# docker exec -it bd2556c bash  # 進入容器
[root@bd2556ce65b2 /]# cat /etc/issue  # 查看系統版本信息
CentOS release 6.8 (Final)
Kernel \r on an \m

[root@bd2556ce65b2 /]# 
[root@bd2556ce65b2 /]# uname -a  # 在容器內查看內核信息
Linux bd2556ce65b2 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@bd2556ce65b2 /]# exit
[root@server ~]# uname -a  # 在宿主機上查看內核信息
Linux server 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@server ~]# 

如上,可以看到兩者使用的Linux內核其實是同一個,除了主機名不同之外都是一樣的,所以說docker是基於Linux內核的原因就在這。

4.既然能夠將文件導入為鏡像,那麽也就能把現有的鏡像,導出為一個文件,命令如下:

[root@server ~]# docker save -o test_centos.tar test_centos

test_centos.tar是導出來的文件名稱,test_centos則是鏡像名稱。

5.我們還可以用該文件恢復本地鏡像,可以使用以下兩個命令:

[root@server ~]# docker load --input test_centos.tar  或者  docker load < test_centos.tar

6.使用以下命令可以把自己的鏡像上傳到dockerhub官方網站上去,但前提是需要先註冊一個用戶,後續如果有需求再研究吧:

[root@server ~]# docker push image_name

25.6 容器管理

1.使用以下命令可以創建一個容器,但該容器並沒有啟動,就好比在VMware裏新建了一個虛擬機一樣:

[root@server ~]# docker create -it centos6 bash
22a470459fbe15f25377aa3f97bfbaba90b425ecba10c9a8c4e16906bce3bca7
[root@server ~]# 

2.啟動該容器:

[root@server ~]# docker start 22a47045
22a47045
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
22a470459fbe        centos6             "bash"              About a minute ago   Up 5 seconds                            romantic_golick
bd2556ce65b2        centos6             "bash"              42 minutes ago       Up 42 minutes                           affectionate_joliot
[root@server ~]# 

啟動容器後,可以使用 docker ps 查看到,有start 就有stop以及restart,之前我們使用的docker run 相當於先create再start。

3.當我們使用run時不加-d選項也可以進入一個虛擬終端裏面:

[root@server ~]# docker run -it centos bash

我們依然可以裏面運行一些命令,使用命令exit或者ctrl + d 也可以退出該bash,但是當退出後這個容器也會進入停止狀態,這就是不加-d的效果。

4.docker run -d可以讓容器在後臺運行,例如:

[root@server ~]# docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"

5.--name 選項可以給容器自定義名字,如果不指定該選項則是一個隨機字符串:

[root@server ~]# docker run --name centos6_01_ -itd centos6 bash
a0944f7e4682edfbb39577e4b23729d18f649461767a3a372c05b745d301105a
[root@server ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a0944f7e4682        centos6             "bash"              31 seconds ago      Up 30 seconds                           centos6_01_
22a470459fbe        centos6             "bash"              10 minutes ago      Up 8 minutes                            romantic_golick
bd2556ce65b2        centos6             "bash"              About an hour ago   Up About an hour                        affectionate_joliot
[root@server ~]# docker exec -it centos6_01_ bash  # 使用名稱也可以進入到容器的終端
[root@a0944f7e4682 /]# 

6.--rm 選項可以讓容器退出後直接刪除,在這裏命令執行完容器就會退出:

[root@server ~]# docker run --rm -it centos bash -c "sleep 30"

7.docker logs 可以獲取到容器的運行歷史信息,用法如下:

[root@server ~]# docker run -d centos bash -c "echo 123"  # 在容器裏運行一條命令
1203ade543e3afcb9bae9f021dc7327018181915236f170acabc9f4be1c1cc34
[root@server ~]# docker logs 1203ade  # 使用docker logs 就可以獲取到這個輸出信息
123
[root@server ~]# 

8.docker attach 可以進入一個後臺運行的容器,命令格式如下:

[root@server ~]# docker exec -it container_id  bash

9.但是attach命令不算好用,比如我們想要退出終端,就得exit了,這樣容器也就退出了,還有一種方法,命令格式如下:

[root@server ~]# docker exec -it container_id  bash

以上命令可以臨時打開一個虛擬終端,並且exit後,容器依然運行著,這個命令之前我們已經使用過多次了。

10.刪除容器命令:

[root@server ~]# docker rm container_id

container_id是ps的時候查看到的,這樣就可以把container刪除,如果是運行的容器,可以加-f,例如:

[root@server ~]# docker rm -f a0944f7e4682
a0944f7e4682
[root@server ~]# 

11.我們可以導出某個容器,然後將該容器遷移到其他機器上,命令格式如下:

[root@server ~]# docker  export  container_id  > filename.tar

12.導入命令如下,其實就是將文件導入為鏡像,一開始我們就使用過了:

[root@server ~]# cat filename.tar |docker import - centos_test

25.7 倉庫管理

我們pull鏡像時都是從docker的公共上pull的,push也是如此。但是企業中不可能都將自己的鏡像都放到公共倉庫上,所以我們需要建立一個自己的私有倉庫。

1.下載registry 鏡像,registy是docker官方提供的一個鏡像,我們可以用它來創建本地的docker私有倉庫:

[root@server ~]# docker pull registry

2.然後將 registry 鏡像啟動為容器:

[root@server ~]# docker run -d -p 5000:5000 registry
a79fd8992501e74d53fc06e9ddd29b171ba4015078f50b7c65ee8362f5b4a986
[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a79fd8992501        registry            "/entrypoint.sh /etc…"   5 seconds ago       Up 4 seconds        0.0.0.0:5000->5000/tcp   fervent_volhard
22a470459fbe        centos6             "bash"                   41 minutes ago      Up 40 minutes                                romantic_golick
bd2556ce65b2        centos6             "bash"                   About an hour ago   Up About an hour                             affectionate_joliot
[root@server ~]# 

命令說明:將registry鏡像啟動容器,-p會把容器的端口映射到宿主機上,如果不映射到宿主機上的話,外部是無法直接訪問容器的端口的,: 左邊為宿主機監聽端口,: 右邊為容器監聽端口,這個端口可以自定義。

3.使用telnet可以訪問該端口:

[root@server ~]# telnet 127.0.0.1 5000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
^]
telnet> quit
Connection closed.
[root@server ~]# 

4.使用curl也可以訪問該端口:

[root@server ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}
[root@server ~]# 

由於我們還沒有上傳鏡像,所以返回的數據是空的。

5.下面我們來把其中一個鏡像上傳到這個私有倉庫:

[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos6             latest              fbd320988956        2 hours ago         512MB
test_centos         latest              0749459e3be3        3 days ago          359MB
registry            latest              d1fd7d86a825        3 weeks ago         33.3MB
centos              latest              ff426288ea90        4 weeks ago         207MB
[root@server ~]# docker tag centos6 192.168.77.130:5000/centos6  # 標記一下tag,必須要帶有私有倉庫的ip:port
[root@server ~]# docker push 192.168.77.130:5000/centos6  # 沒有成功,提示需要https協議
The push refers to repository [192.168.77.130:5000/centos6]
Get https://192.168.77.130:5000/v2/: http: server gave HTTP response to HTTPS client
[root@server ~]# 

沒有使用https的協議下,只能修改docker的配置文件:

[root@server ~]# vim /etc/docker/daemon.json # 增加內容如下
{
  "insecure-registries":["192.168.77.130:5000"]
}
[root@server ~]# systemctl restart docker.service 
[root@server ~]# 註意,docker啟動之後記得把容器也一並啟動,不然會push失敗

修改完成後繼續push:

[root@server ~]# docker push 192.168.77.130:5000/centos6
The push refers to repository [192.168.77.130:5000/centos6]
0a2f11f7b1ef: Pushed 
latest: digest: sha256:ec672fbc4e4eb0976c0082c7de09bad65c883890fe3ad21bdafc1f7108d9013d size: 529
[root@server ~]# 

輸出結果如上,push成功。

6.使用curl命令可以查看私有倉庫裏的鏡像:

[root@server ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos6"]}
[root@server ~]# 

然後我又上傳了一個鏡像,這時候私有倉庫裏就有兩個鏡像了:

[root@server ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos","centos6"]}
[root@server ~]# 

7.如果要拉取鏡像則使用以下命令:

[root@server ~]# docker pull 192.168.77.130:5000/centos6

也就是把push換成pull就可以了,所以打標簽那一步很關鍵,如果你ip或端口寫錯了的話,是無法進行pull的。


25.8 數據管理

容器是由鏡像啟動的,那容器裏面產生的數據存儲在了哪裏?容器關閉、刪除時數據都會被如何處理?容器裏面產生的數據都存儲在docker的數據目錄下,我這裏的數據目錄路徑為:/var/lib/docker/containers/,containers下的目錄都以容器ID命名,其中包含這個容器的所有配置文件。 config.json文件中最後幾個Volumes屬性即為容器數據文件的存儲目錄。而當容器關閉、刪除時,容器的數據都會一並的刪除掉。這就意味著數據不具有持久性,如果一些重要的數據也被刪除則會帶來一定的損失,要解決這個問題就是把容器的數據寫入到宿主機的磁盤上,這樣不管是容器被停止或刪除,數據都不會丟失。

1.掛載本地宿主機的目錄到容器裏,這將會讓這個容器成為一個數據卷容器:

[root@server ~]# docker run -tid -v /data/:/data centos bash
f7774d6447ca550335e225faddc02c0677b095273dd0055e48559834cfda8c0b
[root@server ~]# 

命令說明:-v 用來指定掛載目錄,: 前面的/data/為宿主機本地目錄,: 後面的/data/為容器裏的目錄,如果容器裏沒有data目錄,會在容器中自動創建。

然後來測試一下是否能夠正常寫入到宿主機的磁盤上:

[root@server ~]# docker exec -it f7774d6447 bash
[root@f7774d6447ca /]# ls /data/  # data目錄下是沒有東西的
[root@f7774d6447ca /]# mkdir /data/test  # 在data目錄下創建一個test目錄
[root@f7774d6447ca /]# ls /data/
test
[root@f7774d6447ca /]# exit
[root@server ~]# ls /data/  # 在宿主機上看看data下是否也有這個test目錄,有的話則代表掛載成功
test
[root@server ~]# 

2.掛載數據卷:

其實我們掛載目錄的時候,可以指定容器name,如果不指定就隨機定義了。比如上面我們沒有指定,它就生成了一個名字為lucid_kilby,這個名字可以使用命令 docker ps 命令看 NAMES 那一列:
技術分享圖片

掛載數據卷:

[root@server ~]# docker run -itd --volumes-from lucid_kilby centos6 bash
9aee52df082a8ca7110965e5dc8e7a6eddce4c1f2cb7c76a168c188ddb1ede04
[root@server ~]# 

這樣,我們使用centos6鏡像創建了新的容器,並且使用了 lucid_kilby 容器的數據卷

我們可以進入這個新容器裏查看data目錄:

[root@server ~]# docker exec -it 9aee52df bash
[root@9aee52df082a /]# ls /data/
test
[root@9aee52df082a /]#

如上,可以看到,這個新容器的data目錄裏也有我們之前創建的test目錄,這是因為我們創建這個容器時掛載了數據卷,所以現在 lucid_kilby 就是作為一個數據卷容器存在。

3.另一種定義數據卷容器的方式,這種方式不會掛載本地宿主機的目錄,而是讓多個容器之間相互共享數據:

有時候,我們需要多個容器之間相互共享數據,類似於linux裏面的NFS,所以我們就可以搭建一個專門的數據卷容器,然後其他容器直接掛載該數據卷。

首先建立一個數據卷容器:

[root@9aee52df082a /]# docker run -itd -v /data/ --name testvol centos  bash 

註意:這裏的/data/是容器的data目錄,並非本地宿主機的data目錄。

然後讓其他容器掛載該數據卷:

[root@9aee52df082a /]# docker run -itd  --volumes-from testvol test_centos  bash

如果數據卷容器共享的是data目錄,而普通容器想要共享的是home目錄或其他目錄,可以把原本的目錄更名,然後軟鏈接data目錄即可,例如:

[root@9aee52df082a /]# mv /home/ /home-bak/  # 把原本的目錄更名
[root@9aee52df082a /]# ln -s /data/ /home  # 然後軟鏈接data目錄

docker通過模板創建鏡像以及容器、倉庫和數據管理