一、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