docker 基本操作Ⅱ(關於鏡像操作)
阿新 • • 發佈:2017-11-14
基本操作 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 基本操作Ⅱ(關於鏡像操作)