1. 程式人生 > >docker 基本操作Ⅱ(關於鏡像操作)

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

基本操作 docker 鏡像操作

1 通過模板創建鏡像

- 導入鏡像基本操作

https://openvz.org/Download/template/precreated 在這個網址裏面下載對應的模板
[root@chy src]# wget http://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz //下載centos7的模板
[root@chy src]# cat centos-7-x86_64-minimal.tar.gz |docker import - centos7 //導入鏡像
sha256:3e6c83d2f3749ae4cde27673354cab305bfdc360e40d10d072f6a7dfd3edcdca
[root@chy src]# docker images //查看已經導入的鏡像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             latest              3e6c83d2f374        2 minutes ago       435MB
centos_with_net     latest              87dde0ff7187        21 hours ago        277MB
centos              latest              d123f4e55e12        10 days ago         197MB
[root@chy src]# docker run -itd centos7 bash//將鏡像啟動centos7的容器
67c68340c58643e4e085dc04fe7552bad4ff6c41c612c26e9ce99e63b4872317
[root@chy src]# docker exec -it 67c68340c5 bash //進入到centos7的容器裏
[root@67c68340c586 /]# cat /etc/issue //查看版本
[root@67c68340c586 /]# uname -a //查看內核(這個內核與宿主機的內核是一致的,如果我的鏡像的模板是centos6的,我的宿主機是centos7的那我最後在docker鏡像裏查看的內核也就是centos7的。
Linux 67c68340c586 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

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

[root@chy ~]# docker save -o centos7-daochu centos7// -o 後面跟的是centos7-daochu(導出後的文件名)centos7這個是要導出的鏡像名
[root@chy ~]# docker rm -f 67c68340c586//刪除運行的容器
67c68340c586
[root@chy ~]# docker rmi 3e6c83d2f374 刪除鏡像
Untagged: centos7:latest
Deleted: sha256:3e6c83d2f3749ae4cde27673354cab305bfdc360e40d10d072f6a7dfd3edcdca
Deleted: sha256:788edba9eaa8ade63d8ba9d5747281c5da2b34b12a6c80f4dffd8ad9e05f68c1
[root@chy ~]# docker images //查看沒有鏡像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos_with_net     latest              87dde0ff7187        22 hours ago        277MB
centos              latest              d123f4e55e12        10 days ago         197MB
[root@chy ~]# docker load --input centos7-daochu //恢復鏡像(恢復鏡像還有一個命令是docker load < centos7-daochu
788edba9eaa8: Loading layer [==================================================>]  446.1MB/446.1MB
Loaded image: centos7:latest
[root@chy ~]# docker images //查看已經恢復成功
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             latest              3e6c83d2f374        38 minutes ago      435MB
centos_with_net     latest              87dde0ff7187        22 hours ago        277MB
centos              latest              d123f4e55e12        10 days ago         197MB

導入與導出鏡像還有一個命令是如下

docker export container_id > file.tar // 導出容器,可以遷移到其他機器上,需要導入
cat file.tar |docker import - aming_test  //這樣會生成aming_test的鏡像(導入鏡像)

2 容器管理

[root@chy ~]# docker create -it centos7 bash //創建容器但是容器沒有啟動
[root@chy ~]# docker start 438606c //啟動容器
438606c
[root@chy src]# docker run -itd centos7 //這個也是啟動容器之不多這個是create與start融為一體了
[root@chy ~]# docker run -itd --name centos6 centos_with_net bash // --name 給容器自定義名字
46fe5b5e5d2768727e8256e79ba6a3b3255394bda5398ec4011526fec8437dbc
[root@chy ~]# docker ps //查看定義的名稱centos6,這個在進入容器的時候就可以直接跟名字不用給它的id了
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
46fe5b5e5d27        centos_with_net     "bash"              7 seconds ago       Up 5 seconds                            centos6
[root@chy ~]# docker run --rm -it centos_with_net  bash -c "sleep 30" //--rm 可以讓容器退出後直接刪除,在這裏命令執行完容器就會退出
[root@chy ~]# docker logs 34effba //獲取到容器的運行歷史信息
111
[root@chy ~]# docker exec -it 34effba bash //可以臨時打開一個虛擬終端,並且exit後,容器依然運行著
[root@chy ~]# docker rm 34effba//刪除容器,如果要刪除的是一個運行的容器需要加-m 後面在跟container_id,(container_id是ps的時候查看到的)
34effba
[root@chy ~]# docker start $(docker ps -a | awk ‘{ print $1}‘ | tail -n +2) //啟動所有的容器命令
46fe5b5e5d27
438606c2d465
[root@chy ~]# docker rm $(docker ps -a | awk ‘{ print $1}‘ | tail -n +2) //刪除所有的容器命令
46fe5b5e5d27
438606c2d465
docker rmi $(docker images | awk ‘{print $3}‘ |tail -n +2) //刪除所有的鏡像

3 倉庫管理

- 創建私有倉庫

[root@chy ~]# docker pull registry //下載registry 鏡像,registy為docker官方提供的一個鏡像,我們可以用它來創建本地的docker私有倉庫
[root@chy ~]#  docker run -d -p 5000:5000 registry //以registry鏡像啟動容器,-p會把容器的端口映射到宿主機上,:左邊為宿主機監聽端口,:右邊為容器監聽端口

- 將鏡像上傳到私有倉庫

[root@chy ~]# docker tag centos7 192.168.212.10:5000/centos7 //標記一下tag,必須要帶有私有倉庫的ip:port
[root@chy ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
192.168.212.10:5000/centos7   latest              3e6c83d2f374        2 hours ago         435MB
centos7                       latest              3e6c83d2f374        2 hours ago         435MB
centos_with_net               latest              87dde0ff7187        24 hours ago        277MB
registry                      latest              a07e3f32a779        10 days ago         33.3MB
centos                        latest              d123f4e55e12        10 days ago         197MB
[root@chy ~]# docker push 192.168.212.10:5000/centos7 //上傳時報了如下的錯誤
The push refers to a repository [192.168.212.10:5000/centos7]
Get https://192.168.212.10:5000/v2/: http: server gave HTTP response to HTTPS client
解決方法如下:
[root@chy ~]# vi /etc/docker/daemon.json //更改配置文件
{ "insecure-registries":["192.168.212.10:5000"] }
如上指定一個私有倉庫的地址,這個地址是宿主機的地址
[root@chy ~]# systemctl restart docker //重啟服務
[root@chy ~]# docker start ef587be45616 //啟動私有倉庫的容器
ef587be45616
[root@chy ~]# docker push 192.168.212.10:5000/centos7 //上傳鏡像到私有倉庫
The push refers to a repository [192.168.212.10:5000/centos7]
788edba9eaa8: Pushed 
latest: digest: sha256:d57bd79f46a10c520a62814d33a13c7c4c2b10ac143650effc9c8e35b2094565 size: 529
[root@chy ~]# curl 127.0.0.1:5000/v2/_catalog //查看到推送上來的鏡像
{"repositories":["centos7"]}

- 怎麽下載私有倉庫的鏡像

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

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

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

4 數據管理

- 容器是由鏡像啟動的,這時如果將容器關閉或者是刪除那容器裏面的數據去哪了呢?這時數據也會一並的消除,這樣肯定是不符合我們的要求的,所以呢想到了一個方法就是將宿主機的一個目錄掛載到容器中,這時容器裏產生的數據都會在宿主機的目錄中顯示。下面就是如何將容器中的數據搞到容器中

- 掛載本地的目錄到容器裏

[root@chy ~]# docker run -tid -v /data/:/data centos7 bash ////-v 用來指定掛載目錄,:前面的/data/為宿主機本地目錄,:後面的/data/為容器裏的目錄,會在容器中自動創建
bc7f95597ceb71a3ebfcb5f4955d171b69f740c9598396eae1234966d68d1f81
[root@chy ~]# ls -l /data/ 查看宿主機/data目錄
總用量 16
drwxr-xr-x 3 root   root   4096 9月   2 18:38 backup
drwxr-xr-x 3 root   root   4096 10月 27 06:15 gitroot
drwxr-xr-x 9 mysql1 mysql1 4096 11月 14 22:47 mariadb
drwxr-xr-x 5 root   root   4096 8月   5 04:40 wwwroot
[root@chy ~]# docker exec -it bc7f9559 bash
[root@bc7f95597ceb /]# mkdir /data/123 之後在容器中創建一個目錄
[root@bc7f95597ceb /]# exit
[root@chy ~]# ls /data/ 在宿主機可以查看到在容器中創建的目錄
123/       backup/    gitroot/   .htpasswd  mariadb/   wwwroot/

- 掛載數據卷

[root@chy ~]# docker ps //這裏需要先查看容器的名字centos7的為sharp_kepler
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
bc7f95597ceb        centos7             "bash"                   8 minutes ago       Up 8 minutes                                 sharp_kepler
ef587be45616        registry            "/entrypoint.sh /e..."   About an hour ago   Up About an hour    0.0.0.0:5000->5000/tcp   elastic_varahamihira
[root@chy ~]# docker run -itd --volumes-from sharp_kepler  centos7  bash //--volumes-from後面跟容器的名字,之後在跟新的容器名
12204913c07468253f58a52c52e328ff5cdb1d01866ae55e86d7c9f088a0bf2f

- 定義數據卷容器

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

[root@chy ~]# docker run -itd -v /data/ --name testvol centos bash 
這裏的-v是有兩層含義的第一層含義是: 冒號是用來交互宿主機與容器的目錄的映射,第二層含義是作為數據卷容器就是不加冒號的寫法,第二層的含義是用來共享一個目錄,所以-v /data的目錄為共享目錄
然後讓其他容器掛載該數據卷
 docker run -itd --volumes-from testvol aming123 bash

希望看過的童鞋多多指教,謝謝!技術分享技術分享


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