有收穫的話請加顆小星星,沒有收穫的話可以 反對 沒有幫助 舉報三連
一、什麼是docker
Docker是一個開放原始碼軟體專案,讓應用程式佈署在軟體貨櫃下的工作可以自動化進行,藉此在Linux作業系統上,提供一個額外的軟體抽象層,以及作業系統層虛擬化的自動管理機制。
Docker利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心名字空間(namespaces),來建立獨立的容器(containers)。這可以在單一Linux實體下運作,避免啟動一個虛擬機器造成的額外負擔。Linux核心對名字空間的支援完全隔離了工作環境中應用程式的視野,包括程式樹、網路、使用者ID與掛載檔案系統,而核心的cgroup提供資源隔離,包括CPU、儲存器、block I/O與網路。從0.9版本起,Dockers在使用抽象虛擬是經由libvirt的LXC與systemd - nspawn提供介面的基礎上,開始包括libcontainer庫做為以自己的方式開始直接使用由Linux核心提供的虛擬化的設施,
上面都是廢話,簡言之Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裡封裝的好好的,那我就可以用一艘大船把他們都運走。
二、docker與虛擬機器比較
特性 | 容器 | 虛擬機器 |
---|---|---|
啟動 | 秒級 | 分鐘級 |
硬碟使用 | 一般為 MB | 一般為 GB |
效能 | 接近原生【在原生 Linux 核心下】 | 弱於 |
系統支援量 | 單機支援上千個容器 | 一般幾十個 |
三、安裝docker
我自己用的是Docker for Mac
其它系統可以參考http://docker_practice.gitee.io/install/
四、基本概念
- 映象(Image)
Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。
- 容器(Container)
映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的 類 和 例項 一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
- 倉庫(Repository)
映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務,Docker Registry 就是這樣的服務。
一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個映象。
通常,一個倉庫會包含同一個軟體不同版本的映象,而標籤就常用於對應該軟體的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟體哪個版本的映象。如果不給出標籤,將以 latest 作為預設標籤。
1、映象
# 獲取映象
docker pull ubuntu:14.04
# 以ubuntu:14.04映象為基礎啟動並執行一個容器
docker run -it --rm \
ubuntu:14.04 \
bash
-it:這是兩個引數,一個是 -i:互動式操作,一個是 -t 終端。我們這裡打算進入 bash 執行一些命令並檢視返回結果,因此我們需要互動式終端。
--rm:這個引數是說容器退出後隨之將其刪除。預設情況下,為了排障需求,退出的容器並不會立即刪除,除非手動 docker rm。我們這裡只是隨便執行個命令,看看結果,不需要排障和保留結果,因此使用 --rm 可以避免浪費空間。
ubuntu:14.04:這是指用 ubuntu:14.04 映象為基礎來啟動容器。
bash:放在映象名後的是命令,這裡我們希望有個互動式 Shell,因此用的是 bash。
# 列出映象
docker image ls
docker images
# 映象佔用
docker system df
# 清除懸掛映象
docker image prune
# 刪除映象
docker image rm
docker rmi
2、容器
# 啟動以守護模式建立的名字為demo-u的容器,並以互動模式進入容器
docker run --name demo-u -t -i -d ubuntu:14.04 bash
# 執行後就可以通過ID或名字進入容器,並輸出hello world
docker exec -it demo-u /bin/sh -c "echo hello world"
# 檢視執行中的容器
docker container ls
docker ps
# 所有容器
docker container ls -a
docker ps -a
# 檢視容器日誌
docker container logs demo-u
docker logs demo-u
# 終止容器
docker container stop demo-u
docker stop demo-u
# 啟動容器
docker container start demo-u
docker start demo-u
# 重啟容器
docker container restart demo-u
docker restart demo-u
# 進入容器,退出後容器也停止
docker attach demo-u
# 匯出容器
docker export
# 匯入容器
docker import
# 刪除容器
docker container rm
docker rm
# 清除停止的容器
docker container prune
3、資料卷
# 建立資料卷
docker volume create
# 列出資料卷
docker volume ls
# 刪除資料卷
docker volume rm
# 清除沒用的資料卷
docker volume prune
4、掛載
也就是目錄共享,兩種方式:
- -v
- --mount 推薦
# 使用php本地伺服器檢視php環境,載入主機的 ~/web 目錄到容器的 /var/www/web目錄
mkdir -p ~/web && cd ~/web && echo "<?php phpinfo();" > index.php
docker run -d \
--name web \
-p 8080:8080 \
--mount type=bind,source=`pwd`,target=/var/www/web \
php:7.2-fpm \
/bin/sh -c "cd /var/www/web && php -S 0.0.0.0:8080"
或者
docker run -d \
--name web \
-p 8080:8080 \
-v `pwd`:/var/www/web \
php:7.2-fpm \
/bin/sh -c "cd /var/www/web && php -S 0.0.0.0:8080"
開啟瀏覽器 0.0.0.0:8080
# 檢視資料卷
docker volume inspect web
五、參考資料
本作品採用《CC 協議》,轉載必須註明作者和本文連結