docker 基础
概述
起源
2013 年由 DotCloud 公司開源出來的容器管理工具
DotCloud 公司是一家 PAAS 服務提供商,從 docker 的出身也可以看出它的主要功能和方向
技術原理
開始時是基于 LXC 容器技術
- cgroup: 將任意進程進行分組化管理,同時還可以控制進程的資源占用(CPU, 內存等等)情況
- namespace: 讓每個進程組有獨立的 PID, IPC 和網絡空間
詳細信息可以參照:http://www.cnblogs.com/wang_yb/p/3923040.html
解決的痛點
- 打包部署
- 運行環境標準化
- 更加高效的利用物理機
docker 基本命令
容器的一個標準的生命周期包括: 創建,啟動,停止,終止和移除
- docker pull busybox # 遠程下載 images
- docker run -it –rm –name busybox busybox # 創建容器,名稱為 busybox
- docker stop/kill busybox # 停止/強行停止 容器
- docker start/restart busybox # 啟動/重新啟動 容器
- docker rm busybox # 移除容器
常用命令
- docker exec 可以運行 容器中的命令
- docker cp 可以在主機和容器之間復制文件
- docker inspect 查看容器的詳細信息,也可以查看鏡像詳細信息
- docker stats 容器的資源占用信息
- docker events 返回 docker 主機上發生的所有 docker 事件流
- docker logs 監控容器的日志
- docker top 查看容器內運行的進程
docker 使用示例(busybox)
docker 容器是完全隔離的運行環境,但實際使用中,難免需要和外部或者 docker 容器進行交互。
比較常用的交互主要有 環境變量,磁盤,網絡
環境變量
docker run -it --rm -e MY_NAME=wangyubin busybox env外部的環境變量可以在容器啟動的時候注入到容器中
磁盤
容器會共享鏡像中的內容,容器自己的狀態才會保存在磁盤上。
docker volume ls # 查看所有容器占用的磁盤名稱 docker volume inspect VOL_NAME # 查看具體的磁盤信息容器中的文件,不會改變 image
在一個容器中創建文件(test.txt)
$ docker run -it --rm busybox / # touch test.txt / # ls bin etc proc sys tmp var dev home root test.txt usr重新啟動的容器中是不包含這個文件的
$ docker run -it --rm busybox / # ls bin dev etc home proc root sys tmp usr var容器掛載外部的文件系統
如果希望容器之間共享文件,或者將文件放在容器之外來管理,可采用如下方式 容器啟動時掛載外部文件夾
docker run -it --rm -v /home/wangyubin/tmp/volume:/share-dir busybox cd share-dir touch test.txt另一個容器也掛載這個文件夾
docker run -it --rm -v /home/wangyubin/tmp/volume:/share-dir busybox / # ls share-dir test.txt網絡
容器中的服務默認只有當前容器可以訪問,容器的宿主和其他容器都是無法訪問的。
通過暴露端口,讓宿主可以訪問容器內服務
通過 nc 命令模擬一個服務
$ docker run -it -p 1234:1234 --rm busybox / # nc -l -p 1234在宿主機上可以通過 docker ps 命令看到暴露的端口
docker psnc localhost 1234 # 連接上本地的 1234 端口,就可以和 docker 容器互發消息容器創建在同一網絡上
創建容器運行的網絡,然后將 2 個容器啟動到同一個網絡上
$ docker network create test a85b5589234b701b1237a364f7796b47e2d1ba4506740767c581a3d62d9e8f48$ docker network ls NETWORK ID NAME DRIVER SCOPE a85b5589234b test bridge local ... ...啟動第一個 docker,name 為 test01,并在容器中用 nc 命令模擬一個服務
$ docker run -it --rm --name test01 --network test busybox / # nc -l -p 1234啟動第二個 docker,name 為 test02,和 test01 在同一個網絡上
$ docker run -it --rm --name test02 --network test busybox / # nc test01 1234 hello由于在同一個網絡上,可以通過 test01 這個名稱直接連接另一個容器
啟動第三個 docker,name 為 test03,使用默認的網絡
$ docker run -it --rm --name test03 busybox / # nc test01 1234 nc: bad address 'test01'由于 test03 和 test01 不在一個網絡上,所以無法互通
轉載于:https://www.cnblogs.com/wang_yb/p/8625003.html
總結
- 上一篇: [译] TypeScript:拥有超能力
- 下一篇: 安卓应用安全指南 4.4.3 创建/使用