您好,登錄后才能下訂單哦!
一、Docker使用模板創建鏡像
首先下載一個模板
http://download.openvz.org/template/precreated/
//下載速度不快,下載了一個centos6的模板centos-6-x86-minimal.tar.gz
[root@fuxi01?~]#?wget?http://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
導入該鏡像的命令為:
#?cat?centos-6-x86-minimal.tar.gz|docker?import?-?centos6 sha256:cdce38ce7fb223b243043be905be88f24635036cf850ceae013007f60a2dda51 #?docker?images??//查看導入的鏡像 #?docker?run?-itd?centos6?bash 79ce4ee106cb84aadbc411489dafadd37d06a92e81b1682199b9e573c224ea6d [root@fuxi01?~]#?docker?exec?-it?79ce4ee1?bash [root@79ce4ee106cb?/]#?cat?/etc/issue??//查看它的版本 CentOS?release?6.8?(Final) Kernel?\r?on?an?\m [root@79ce4ee106cb?/]#?uname?-a Linux?79ce4ee106cb?3.10.0-693.el7.x86_64?#1?SMP?Tue?Aug?22?21:09:27?UTC?2017?x86_64?x86_64?x86_64?GNU/Linux [root@79ce4ee106cb?/]#?exit [root@fuxi01?~]#?uname?-a Linux?fuxi01?3.10.0-693.el7.x86_64?#1?SMP?Tue?Aug?22?21:09:27?UTC?2017?x86_64?x86_64?x86_64?GNU/Linux
由此可見,docker容器的內核和Linux機器的內核是同一個3.10.0的內核,所以說docker容器是基于Linux內核的。
把現有鏡像,導出為一個文件:
#?docker?save?-o?centos7_with_nettool.tar?centos_with_net
//save -o后先跟文件名,再跟鏡像名。save和load是一對。
[root@fuxi01?~]#?docker?ps? CONTAINER?ID????????IMAGE???????????????COMMAND?????????????CREATED?????????????STATUS??????????????PORTS???????????????NAMES 79ce4ee106cb????????centos6?????????????"bash"??????????????4?days?ago??????????Up?4?days???????????????????????????????kind_pasteur b15b83c7c7a2????????centos_with_net?????"/bin/bash"?????????5?days?ago??????????Up?5?days???????????????????????????????infallible_lalande 7ae3b5eb6e41????????ubuntu??????????????"/bin/bash"?????????12?days?ago?????????Up?12?days??????????????????????????????admiring_diffie 43aae89a76ae????????centos??????????????"/bin/bash"?????????13?days?ago?????????Up?13?days??????????????????????????????serene_kare [root@fuxi01?~]#?docker?images REPOSITORY??????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE centos6?????????????latest??????????????cdce38ce7fb2????????4?days?ago??????????512MB centos_with_net?????latest??????????????2803335f23a6????????5?days?ago??????????261MB ubuntu??????????????latest??????????????549b9b86cb8d????????3?weeks?ago?????????64.2MB centos??????????????latest??????????????0f3e07c0138f????????3?months?ago????????220MB yw_centos???????????latest??????????????0f3e07c0138f????????3?months?ago????????220MB [root@fuxi01?~]#?docker?rm?-f?b15b83c7c7a2 b15b83c7c7a2 [root@fuxi01?~]#?docker?rmi?2803335f23a6 Untagged:?centos_with_net:latest Deleted:?sha256:2803335f23a68731a68ffbc860d6e72c15feb2e922cc8aefb1e013fd174b604e Deleted:?sha256:c7d34cfde22ae64c7556234eed73668e4a7b4b2803e51bde4cbbdbd25bb5a2cb
還可以用該文件恢復本地鏡像:
#?docker?load?--input?centos7_with_nettool.tar??或者 #?docker?load?<?centos7_with_nettool.tar #?docker?push?image_name
docker push ?//可以把自己的鏡像傳到dockerhub官方網站上去,但前提是需要先注冊一個用戶,后續如果有需求再研究吧。
二、容器管理
#?docker?create?-it?centos6?bash
//這樣可以創建一個容器,但該容器并沒有啟動,docker create就像創建虛擬機一樣。和docker run基本一樣的用法。創建后,需要用docker ps -a才能看到,狀態是Created。
#?docker?start?container_id
//啟動容器后,可以使用 docker ps?查看到,有start 就有stop,和restart。
之前我們使用的docker run 相當于先create再start
#?docker?run?-it?centos?bash
這樣進入了一個虛擬終端里面,我們可以運行一些命令,使用命令exit或者ctrl d 退出該bash,當退出后這個容器也會停止。執行docker ps -a可以看到它的狀態是Exited的狀態了。
# docker run -d ?可以讓容器在后臺運行
比如:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"
#?docker?run?--name?centos6_1?-itd?centos6?bash??//?--name?給容器自定義名字,如果不定義,docker?ps時最右側的NAMES就是隨機字符串。 #?docker?exec?-it?centos6_1?bash??//進入容器就可以直接寫定義的名字了,不用去寫它的ID了。 #?docker?run?--rm?-it?centos?bash?-c?"sleep?30"?//--rm?可以讓容器退出后直接刪除,在這里命令執行完容器就會退出。-c,在容器里執行命令。
docker logs 可以獲取到容器的運行歷史信息,用法如下:
docker logs ?container_id ?
[root@fuxi01?~]#?docker?run?-itd?centos?bash?-c?"echo?12345" 7c2e09481628fa13df86bdc858d2641ea094a88ee4fbdc0feeda6f3efa059048 [root@fuxi01?~]#?docker?logs?7c2e09 12345
docker attach 可以進入一個后臺運行的容器,比如
#?docker?attach??container_id???? //但是attach命令不好用,比如我們想要退出終端,就得exit了,這樣容器也就退出stop了,還有一種方法: #?docker?exec?-it?container_id??bash?? //可以臨時打開一個虛擬終端,并且exit后,容器依然運行著。 #?docker?rm?container_id?? //container_id是docker?ps?-a的時候查看到的,這樣就可以把container刪除,如果是運行的容器,需要用rm?-f。 #?docker??export?container_id??>?file.tar?? //?導出容器,可以遷移到其他機器上,需要導入,導入是docker?load?--input。 #?cat?file.tar?|docker?import?-?aming_test??? //這樣會生成aming_test的鏡像
三、倉庫管理
#?docker?pull?registry
//下載registry 鏡像,registy為docker官方提供的一個鏡像,我們可以用它來創建本地的docker私有倉庫。拉取registry時如果沒有加速器會很慢。加速器:/etc/docker/daemon.json
重啟docker之后所有容器都會停止,要想批量自動啟動所有容器,
執行:systemctl restart docker && ?docker start ?$(docker ps -a -q)
docker中 啟動所有的容器命令
#?docker?start?$(docker?ps?-a?|?awk?'{?print?$1}'?|?tail?-n?+2)
docker中 關閉所有的容器命令
#?docker?stop?$(docker?ps?-a?|?awk?'{?print?$1}'?|?tail?-n?+2)
#?docker?run?-d?-p?5000:5000?registry
//以registry鏡像啟動容器,-p會把容器的端口映射到宿主機上,:左邊為宿主機監聽端口,:右邊為容器監聽端口。也可以寫其他端口,自定義。
//要想訪問容器里的80 端口,就需要做一個端口映射。 ? 比如centos容器里的ip為172.17.0.2,這個IP是對內的,但是宿主機的192.168.255.128是對外的,而宿主機到容器的80端口是可以ping通的。
#?curl?127.0.0.1:5000/v2/_catalog???//可以訪問它 {"repositories":[]}
什么內容也沒有,我們需要把鏡像傳到倉庫里去,傳到倉庫里才能看到。
下面來把其中一個鏡像上傳到私有倉庫
#?docker?tag?centos?192.168.255.128:5000/centos???//標記一下tag,首先是宿主機的IP,必須要帶有私有倉庫的ip:port #?docker?push?192.168.255.128:5000/centos???//把標記的鏡像給推送到私有倉庫
此時并不會成功,Get https://192.168.255.128:5000/v2/: http: server gave HTTP response to HTTPS client ?報錯,這里用的是https。
解決方法:
更改配置文件:
#?vi?/etc/docker/daemon.json???//更改為這一條內容,之前的加速器需要刪掉,不然push不成功。不使用HTTPS,使用HTTP。 ?{?"insecure-registries":["192.168.255.128:5000"]?} #?systemctl?restart?docker? #?docker?ps?-a?//查看容器已經關閉,還需要啟動 #?docker?start??id?//這里的id為registry容器id
再次push
#?docker?push?192.168.255.128:5000/centos #?curl?127.0.0.1:5000/v2/_catalog?//可以查看到推送上來的鏡像 {"repositories":["centos"]} //這里的centos,就是在push的時候,最后面的字符串。 #?docker?tag?ubuntu?192.168.255.128:5000/ubuntu???//打標簽,推送,就能在私有倉庫查看到了。 #?docker?push?192.168.255.128:5000/ubuntu #?curl?127.0.0.1:5000/v2/_catalog {"repositories":["centos","ubuntu"]} 新機器從私有倉庫拉鏡像: 先安裝docker,然后定義倉庫地址vi?/etc/docker/daemon.json,啟動docker,然后pull就可以了: #?docker?pull?192.168.255.128:5000/ubuntu //加上IP:port就是在私有倉庫下載,不加就是在官方下載。
四、數據管理
容器是由鏡像啟動的,容器里產生的新數據,在容器停止或刪除時,數據會一并消除,這樣就意味數據有一定風險。所以想到一個辦法,把宿主機的目錄掛載到容器里去,這樣即使容器被停止或刪除,數據還是依然在宿主機的目錄里。
1. 掛載本地的目錄到容器里
#?docker?run?-tid?-v?/data/:/data?centos?bash 266bc8cd6fe8fe57c919acddbd958a756bbbdeeb1d6cecf9a49938ee0cd746ab [root@fuxi01?~]#?ls?/data change.log??ftp??gitroot??mariadb??mysql??tomcat-instance??user_passwd??wwwroot [root@fuxi01?~]#?docker?exec?-it?266bc8c?bash [root@266bc8cd6fe8?/]#?ls?/data change.log??ftp??gitroot??mariadb??mysql??tomcat-instance??user_passwd wwwroot [root@266bc8cd6fe8?/]#? //這樣,容器里的data目錄和宿主機的data目錄就是數據同步的了,更改也會同步。
//-v 用來指定掛載目錄,:前面的/data/為宿主機本地目錄,:后面的/data/為容器里的目錄,會在容器中自動創建。
2. 掛載數據卷(--volumes-from)
其實我們掛載目錄的時候,可以使用--name指定容器name,如果不指定就隨機定義了。比如上面沒有指定,它就生成了一個名字為heuristic_almeida,這個名字可以使用命令 docker ps ?看最右側一列。
#?docker?ps CONTAINER?ID????????IMAGE???????????????COMMAND??????????????????CREATED?????????????STATUS??????????????PORTS????????????????????NAMES 266bc8cd6fe8????????centos??????????????"bash"???????????????????23?hours?ago????????Up?23?hours??????????????????????????????????heuristic_almeida #?docker?run?-itd?--volumes-from?heuristic_almeida?centos6?bash 53ad0ecc0ea797915dd62ce03e886c05f86171136404b35a1f8049542cf57358
這樣,我們使用centos6鏡像創建了新的容器,并且把 heuristic_almeida 容器作為了數據卷,進入這個centos6的容器可以ls /data看到內容和centos的是一樣的,centos容器的data目錄是什么樣的,它centos6這里就是什么樣的,是關聯在一起的。
3. 定義數據卷容器
有時候,我們需要多個容器之間相互共享數據,類似于linux里面的NFS,所以就可以搭建一個專門的數據卷容器,然后其他容器直接掛載該數據卷。
首先建立數據卷容器
#?docker?run?-itd?-v?/data/?--name?testvol?centos??bash
//注意這里的/data/是容器的/data目錄,并非本地的/data/目錄。?就是不需要宿主機的目錄做映射。把這個目錄共享出來,作為公共的目錄。
然后讓其他容器掛載該數據卷
#?docker?run?-itd??--volumes-from?testvol?centos6?bash
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。