二、Docker使用模板創建鏡像、容器管理、倉庫管理、數據管理

一、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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章