Docker是一個容器(Container)服務,用來管理容器。
容器就是一個運行環境,可以部署任何軟體運行環境,且環境內只包含最小的作業系統所需要的系統文件,輕量級的運行環境保證了系統的性能,乾淨的系統環境保證了系統的安全。
容器可以有自己的IP位址,可以有自己的service系統,可以有自己的hosts,可以有自己的crontab...所以,容器很像虛擬機,在容器裡面運行的軟體就像在獨立的Linux裡面運行的效果一樣。
Docker還是一個鏡像(Image)服務,可以管理鏡像。
鏡像就是從一個穩定的容器打包出來的一個靜態的包,通過鏡像可以快速地創建一個一模一樣的容器。鏡像就像是Git裡面的Tag,我們可以給調試好的容器進行導出鏡像操作,然後在需要的地方進行鏡像還原容器操作,這樣可以方便的模板化創建容器。
2. 基本信息2.1 安裝環境CentOS:CentOS Linux release 7.6.1810 (Core)
Linux:Linux version 3.10.0-1062.el7.x86_64
GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
使用yum安裝docker
3.2 驗證輸入命令
[root@tfdev ~]# docker -vDocker version 1.13.1, build 0be3e21/1.13.13.3 啟動關閉SELinux,這玩意和docker合不來
打開selinux的配置文件
vi /etc/sysconfig/selinux修改文件內容,將參數 SELINUX 修改為 disabled
重啟伺服器
重啟docker
自動啟動
4. Docker創建私有倉庫(repository)4.1 第一步拉一個registry鏡像下來
4.2 第二步運行倉庫
docker run -d -p 5000:5000 -v /opt/registry:/tmp/registry docker.io/registry4.3 第三步驗證
4.4 查看鏡像V1版本是
curl 127.0.0.1:5000/v1/searchV2版本是
curl 127.0.0.1:5000/v2/_catalog4.5 創建鏡像4.5.1 第一步先拉一個鏡像從遠程倉庫
4.5.2 第二步修改tag到本地
docker tag docker.io/centos 127.0.0.1:5000/centos:tongfu4.5.3 第三步上傳鏡像到本地倉庫
docker push 127.0.0.1:5000/centos:tongfu5. Docker容器操作(container)5.1 創建容器docker run -tid --name [容器名稱] [鏡像名稱]5.2 進入容器採用attach進入容器後,通過exit退出的話,容器會停止運行
5.3 在容器內執行命令docker exec [容器名稱] /bin/bash -c "命令"5.4 停止容器5.5 啟動容器5.6 退出容器正常進入容器後退出的話,容器會停止運行,那麼如何保證退出後容器一直運行呢?
答案是通過 exec 進入容器,命令如下:
docker exec -ti [容器名稱] /bin/bash這樣也可以進入容器,同時這樣退出不會導致容器停止運行
5.7 刪除容器要刪除一個容器之前必須要先停止這個容器
6. Docker網絡配置(network)6.1 創建網絡注意:虛擬網絡的IP網段千萬不要和本地物理網絡衝突,否則會導致容器內部網絡不通的情況!!!
docker network create --subnet=10.16.1.0/16 --gateway=10.16.1.1 --opt "com.docker.network.bridge.name"="bridge2" bridge26.2 使用新網絡創建容器docker run -tid --name=base --net=bridge2 --ip=10.16.1.100 -p 8000:80 docker.tongfu.net:5000/centos這樣新創建的容器的IP位址就是bridge2網絡的地址,通過網關IP可以與宿主機互相通訊,同時我們將容器的80埠映射給了宿主機8000埠。
容器IP位址:10.16.1.100
宿主機IP位址:10.16.1.1
容器埠:80
宿主機埠:8000
6.3 查看網絡列表[root@tongfunet]NETWORK ID NAME DRIVER SCOPE2f03bb8a8a13 bridge bridge local3919c34c3c33 bridge2 bridge local305e882739a3 host host local363c4d747119 none null local6.4 刪除網絡注意默認的幾個網絡不要動(bridge、host、none)
[root@tongfunet]# docker network rm bridge2bridge26.5 查看網絡列表[root@tongfunet]NETWORK ID NAME DRIVER SCOPE2f03bb8a8a13 bridge bridge local305e882739a3 host host local363c4d747119 none null local7. Docker導出與導入(export/import)7.1 導出將容器內容導出到一個壓縮包內
[root@tongfunet]# docker export [容器名稱] > [壓縮包名稱].tar7.2 導入從一個壓縮包內導入數據到鏡像裡
[root@tongfunet]# docker import [壓縮包名稱].tar [鏡像名稱]另一種導入命令
[root@tongfunet]# cat [壓縮包名稱].tar | docker import - [鏡像名稱]8. Docker容器生成鏡像(image)8.1 提交到倉庫我們辛辛苦苦調試好的容器,不想一個不小心就丟了,還想給其他人用,怎麼辦?
我們可以通過comment命令將自己的容器提交到倉庫
base是現有容器名稱
base-net是新的鏡像名稱
docker commit -m "m" -a "a" base docker.tongfu.net:5000/centos:base-net8.2 查看鏡像列表看我們的容器變成了鏡像,可以通過run使用了
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZEdocker.tongfu.net:5000/centos base-net e026052245dc 44 seconds ago 303.7 MB8.3 刪除鏡像刪除一個鏡像必須要刪除所有基於這個鏡像創建的容器
8.4 查看鏡像我們可以查看鏡像信息,包括創建參數,依賴鏡像等等
IMAGE CREATED CREATED BY SIZE COMMENTec7d21826858 12 months ago /usr/sbin/init 56.69 MB Web server 2.4.27 for CentOS 7b6bac0adfc18 12 months ago /usr/sbin/init 141.7 MB The pure CentOS with net-tools , crontabs , gcc , makeff426288ea90 12 months ago /bin/sh -c <missing> 12 months ago /bin/sh -c <missing> 12 months ago /bin/sh -c 9. Docker備份與還原(backup/restore)9.1 備份我們要將做好的鏡像備份起來,可以使用下面的命令
docker save docker.tongfu.net:5000/centos:base -o /tongfu.net/docker/backup/base.tgz9.2 還原我們要使用備份的文件還原,可以使用下面的命令
docker load -i /tongfu.net/docker/backup/base.tgz10. Docker數據目錄遷移(move data directory)10.1 遷移數據目錄10.1.1 停止服務10.1.2 移動數據目錄mv /var/lib/docker /data/docker10.1.3 建立符號連結ln -s /data/docker /var/lib/docker10.1.4 啟動服務11. Docker常見問題
11.1 save/load和export/import區別
12. Docker的存儲驅動(Storage Driver)12.1 介紹docker有這麼幾種存儲驅動,OverlayFS(overlay),AUFS(aufs),Btrfs(btrfs),Device Maper(devicemapper),VFS*(vfs),ZFS(zfs)
其中舊版本默認採用的驅動是devicemapper,最新版本1.13.x默認採用的驅動是overlay2
12.2 區別12.2.1 overlay這裡面根據筆者的經驗,我們只談談overlay這種驅動。
在使用最新版本1.13.x進行鏡像設計的過程中發現了一個bug,就是通過images開啟的容器內部,如果要刪除鏡像自帶目錄會被告知:Directory not emtpy。
很迷惑的一個提示。。
筆者一開始以為是被進程佔用了,各種查找,各種重啟容器,重啟docker,各種reboot,各種重建容器,依然解決不了問題。
但是映射進來的目錄就完全正常!
最後發現這是overlay的一大特性,出於對鏡像模板內容的保護,刪除操作會被禁止,用戶內容需要通過映射目錄方式實現。
好吧~~這是好事,習慣了就好~~
那個不知所謂的 Directory not empty 是迷糊「黑客」的。。
12.2.2 devicemapper這種方式下,我們操作容器內的內容沒有任何限制
網上一些文章倡導用這種驅動替代overlay驅動,解決不能rm -rf的問題
我個人的主張,沒有必要,要學會接受新鮮事物~~
當然,學習如何切換存儲驅動到是可以的!
13. 常見錯誤13.1 Pull鏡像報錯使用pull命令拉取鏡像時候報錯
Get https://registry-1.docker.io/v2/library/registry/manifests/latest: net/http: TLS handshake timeout解決方法,設置國內鏡像地址(設置後需要重啟docker服務)
[root@tfdev ~]# cat /etc/docker/daemon.json { "registry-mirrors":[ "https://registry.docker-cn.com" ]}13.2 容器無法聯網創建容器的時候,報如下警告信息
WARNING: IPv4 forwarding is disabled. Networking will not work.解決方法
echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/00-system.conf
systemctl restart networksystemctl restart docker13.3 使用yum報錯使用yum報錯rpmdb open failed信息
error: rpmdb: BDB0004 fop_read_meta: /var/lib/rpm/Packages: unexpected file type or formaterror: cannot open Packages index using db5 - Invalid argument (22)error: cannot open Packages database in /var/lib/rpmCRITICAL:yum.main:
Error: rpmdb open failed解決方法
rm -f /var/lib/rpm/*rpm --rebuilddbyum clean all【20210108】做個用戶管理系統(39)——用以處理表格或列表的顯示的jQuery控制項
【20210107】做過java框架(7)——Spring框架的註解的學習筆記
免費看文章,自己學技術
每一篇文章都是福哥一個字一個字地敲出來的,都是福哥原創的。
每一篇文章都是經過了福哥的反覆驗證的,都是可以正常使用的。