目錄
1. docker前言
- 開發和運維之間的矛盾,環境統一性問題
- 開發人員利用 docker 可以消除協作編碼時“在我的機器上可正常工作”的問題
- vm是一個運行在宿主機之上的完整的操作系統,vm運行自身操作系統(guest os)會佔用較多的CPU、內存、硬盤資源
- docker不同於vm,只包含應用程序以及依賴庫,基本不消耗額外的系統資源,系統的開銷儘量小,不需要額外的 hypervisor 支持,內核級的虛擬化,實現更高的性能和效率
- docker 是一種容器技術的實現,在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的創建和維護,使得容器技術比虛擬機技術更爲輕便、快捷
- 理念:一次封裝,到處運行
2. docker三要素
- 鏡像 image
docker 鏡像是一個只讀的模板
鏡像可以用來創建 docker 實例
一個鏡像可以創建多個容器
- 容器 container
容器是用鏡像創建的實例
容器的定義和鏡像幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的
- 倉庫 repository
3. docker安裝
在centos上使用yum安裝
- 訪問官網手冊
https://docs.docker.com/engine/install/centos/ - 安裝依賴和添加源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 安裝docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
- 啓動docker
sudo systemctl start docker
docker version
- 測試hello world
sudo docker run hello-world
注:
Docker守護程序綁定到Unix套接字而不是TCP端口。默認情況下,Unix套接字由用戶擁有root,其他用戶只能使用來訪問它sudo。Docker守護程序始終以root用戶身份運行
如果你不想在前言docker與命令sudo,創建一個名爲UNIX組docker和用戶添加到它。Docker守護程序啓動時,它會創建一個可由該docker組成員訪問的Unix套接字
docker machine 安裝 docker
可以在虛擬主機上安裝docker的工具,並可以使用 docker-machine 命令來管理主機
類似vagrant
- 命令
docker-machine ls
docker-machine create --driver virtualbox name
//--driver:指定用來創建機器的驅動類型,這裏是 virtualbox
//在本地虛機安裝,會去下載boot2docker.iso文件(已安裝了docker的系統鏡像文件),然後安裝創建
docker-machine ip name
docker-machine stop name
docker-machine start name
docker-machine ssh name
- 映射到本地
- docker machine 安裝 docker 到阿里雲上
非官方支持的第三方驅動
https://github.com/docker/docker.github.io/blob/master/machine/AVAILABLE_DRIVER_PLUGINS.md
阿里雲驅動使用
https://github.com/AliyunContainerService/docker-machine-driver-aliyunecs
參考
阿里雲docker ce安裝手冊
https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.1ed51991BdQ9Ml
4. 鏡像加速
- 阿里雲
- 網易雲(查看官網)
5. docker 命令
- 幫助命令
docker version
docker info
docker --help
- 鏡像命令
docker images
docker search
docker pull
docker rmi
- 容器命令
新建並啓動容器
列出當前所有正在運行的容器
退出容器
刪除已停止的容器
啓動守護式容器
進入正在運行的容器並以命令行交互
exec是在外面讓容器執行命令
從容器內拷貝文件到主機上
提交容器成鏡像
總結:
attach Attach to a running container # 當前 shell 下 attach 連接指定運行鏡像
build Build an image from a Dockerfile # 通過 Dockerfile 定製鏡像
commit Create a new image from a container changes # 提交當前容器爲新的鏡像
cp Copy files/folders from the containers filesystem to the host path #從容器中拷貝指定文件或者目錄到宿主機中
create Create a new container # 創建一個新的容器,同 run,但不啓動容器
diff Inspect changes on a container's filesystem # 查看 docker 容器變化
events Get real time events from the server # 從 docker 服務獲取容器實時事件
exec Run a command in an existing container # 在已存在的容器上運行命令
export Stream the contents of a container as a tar archive # 導出容器的內容流作爲一個 tar 歸檔文件[對應 import ]
history Show the history of an image # 展示一個鏡像形成歷史
images List images # 列出系統當前鏡像
import Create a new filesystem image from the contents of a tarball # 從tar包中的內容創建一個新的文件系統映像[對應export]
info Display system-wide information # 顯示系統相關信息
inspect Return low-level information on a container # 查看容器詳細信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 從一個 tar 包中加載一個鏡像[對應 save]
login Register or Login to the docker registry server # 註冊或者登陸一個 docker 源服務器
logout Log out from a Docker registry server # 從當前 Docker registry 退出
logs Fetch the logs of a container # 輸出當前容器日誌信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口對應的容器內部源端口
pause Pause all processes within a container # 暫停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 從docker鏡像源服務器拉取指定鏡像或者庫鏡像
push Push an image or a repository to the docker registry server # 推送指定鏡像或者庫鏡像至docker源服務器
restart Restart a running container # 重啓運行的容器
rm Remove one or more containers # 移除一個或者多個容器
rmi Remove one or more images # 移除一個或多個鏡像[無容器使用該鏡像纔可刪除,否則需刪除相關容器纔可繼續或 -f 強制刪除]
run Run a command in a new container # 創建一個新的容器並運行一個命令
save Save an image to a tar archive # 保存一個鏡像爲一個 tar 包[對應 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索鏡像
start Start a stopped containers # 啓動容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 給源中鏡像打標籤
top Lookup the running processes of a container # 查看容器中運行的進程信息
unpause Unpause a paused container # 取消暫停容器
version Show the docker version information # 查看 docker 版本號
wait Block until a container stops, then print its exit code # 截取容器停止時的退出狀態值
6. docker 鏡像
鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時、庫、環境變量和配置文件
特點:
Docker鏡像都是隻讀的
當容器啓動時,一個新的可寫層被加載到鏡像的頂部。
這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
UnionFS(聯合文件系統)
docker鏡像加載原理
爲什麼 Docker 鏡像要採用這種分層結構
7. 數據卷
卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,因此能夠繞過Union File System提供一些用於持續存儲或共享數據的特性
卷的設計目的就是數據的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的數據卷
特點:
1:數據卷可在容器之間共享或重用數據
2:卷中的更改可以直接生效
3:數據卷中的更改不會包含在鏡像的更新中
4:數據卷的生命週期一直持續到沒有容器使用它爲止
直接命令添加
dockerfile添加
容器內的卷目錄對應的主機目錄地址哪?
備註:
docker掛載主機目錄,docker訪問出現cannot open directory : Permission denied
解決辦法:在掛載目錄的命令後多加一個 --privileged=true 參數即可
數據卷容器
命名的容器掛載數據卷,其它容器通過掛載這個容器(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器
容器間傳遞共享(–volumes-from)
容器之間配置信息的傳遞,數據卷的生命週期一直持續到沒有容器使用它爲止
8. dockerfile
dockerfile是用來構建docker鏡像的構建文件,是由一系列命令和參數構成的腳本
dockerfile 基礎知識
Docker執行Dockerfile的大致流程
dockerfile 指令