一、Docker 簡介、應用場景和優點
1.1 簡介
白話文,簡介就是:
Docker 支持將軟件編譯成一個鏡像,然後在鏡像中各種軟件做好配置,將鏡像發佈出去,其他使用者可以直接使用這個鏡像。 運行中的這個鏡像稱為容器,容器啟動是非常快速的。類似 windows 裡面的 ghost 操 作系統,安裝好後什麼都有了。1.2 Docker 應用場景
Web 應用的自動化打包和發佈。自動化測試和持續集成、發佈。在服務型環境中部署和調整數據庫或其他的後臺應用。從頭編譯或者擴展現有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環境。1.3 Docker 優點
簡化程序: Docker 讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,便可以實現虛擬化。Docker 改變了虛擬化的方式,使開發者可以直接將自己的成果放入Docker 中進行管理。方便快捷已經是 Docker 的最大優勢,過去需要用數天乃至數週的任務,在 Docker 容器的處理下,只需要數秒就能完成。避免選擇恐懼症: 如果你有選擇恐懼症,還是資深患者。Docker 幫你打包你的糾結!比如 Docker 鏡像;Docker 鏡像中包含了運行環境和配置,所以 Docker 可以簡化部署多種應用實例工作。比如 Web 應用、後臺應用、數據庫應用、大數據應用比如 Hadoop 集群、消息隊列等等都可以打包成一個鏡像部署。節省開支: 一方面,雲計算時代到來,使開發者不必為了追求效果而配置高額的硬件,Docker 改變了高性能必然高價格的思維定勢。Docker 與雲的結合,讓雲空間得到更充分的利用。不僅解決了硬件管理的問題,也改變了虛擬化的方式。三、Docker 核心概念
3.1 docker 鏡像(Images)
一個只讀模板,可以用來創建容器,一個鏡像可以創建多個容器Docker 提供了一個很簡單的機制來創建和更新現有的鏡像,甚至可以直接從其他人那裡獲取做好的鏡像直接使用可以理解為 Java 中的類3.2 docker 容器(Container)
容器是從鏡像創建的運行實例,也就是鏡像啟動後的一個實例稱為容器,是獨立運行的一個或一組應用。docker 利用容器來運行應用,他可以被啟動、開始、停止、刪除,每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的 Linux(包括 root 用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。可以理解為 Java 中通過類創建的實例。3.3 docker 倉庫(Resoisitory)
倉庫是集中存放鏡像文件的場所,類似 git 代碼倉庫等。倉庫(Respository)和倉庫註冊服務器(Registry)是有區別的。倉庫註冊服務器一般存放多個倉庫,每個倉庫又有多個鏡像,每個鏡像又有不同的標籤(tag)。倉庫分為公開倉庫(public)和私有倉庫(private)兩種形式。最大的公開倉庫是 Docker Hub,國內的公開倉庫有阿里雲等。可以在本地網絡創建一個私有倉庫。當創建好自己的鏡像後,可以通過 push 命令把它上傳到公開或私有倉庫。倉庫的概念類似 Git,倉庫註冊服務器可以理解為 GitHub 這種託管服務。3.4 docker 主機(Host)
一個物理或虛擬的機器用來執行 Docker 守護進程和容器。3.5 docker客戶端(Client)
客戶端通過命令行或其他工具使用 Docker。API 與 Docker 的守護進程進行通信
四、Docker 安裝及啟停
4.1 查看 centos 版本(以 centos7.4 為例)
Docker 要求 CentOS 系統的內核版本高於 3.10。通過命令:
uname -r
查看當前 centos 版本,如版本不符,需升級系統版本。
4.2 升級軟件包及內核(可選)
yum update
4.3 安裝 docker
yum install docker
4.4 啟動 docker
systemctl start docker
4.5 將 docker 服務設為開機啟動
systemtctl enable docker
4.6 停止 docker
systemtctl stop docker
五、Docker 鏡像常用操作命令
5.1 鏡像檢索
除了可以在 Docker Hub 上搜索鏡像外,還可以通過命令 docker search xxx 進行搜索,下面以 mysql 為例:
docker search mysql
結果如下:
另,docker search -參數 含義:
-s 30:列出收藏數不小於指定值(此處為 30)的鏡像;--no-trunc:顯示鏡像完整描述信息(eg. DESCRIPTION 字段完整展示);--automated:只列出 automated build 類型的鏡像(利用 dockerhub 提供的自動化構建技術在服務端直接構建鏡像會被標記為 AUTOMATED);5.2 鏡像下載
下載命名為:docker pull 鏡像名:tag;
其中,
tag 多為系統的版本,可選的,默認為 least;eg.
docker pull mysql
5.3 鏡像列表
獲取已下載鏡像列表命令:docker images
其中,
RESPOSITORY 為鏡像名;TAG 為鏡像版本;least 代表最新版;IMAGE_ID 為該鏡像唯一 ID;CREATED 為該鏡像創建時間;SIZE 為該鏡像大小。docker images -參數 含義:
-a:列出本地所有鏡像,含中間鏡像層;-q:只顯示鏡像 ID;--digests:顯示鏡像摘要信息;--no-trunc:顯示完整的鏡像信息(eg. 顯示完整的IMAGE_ID信息)。5.4 鏡像刪除
刪除指定鏡像:
docker rmi image-id
刪除多個鏡像:
docker rmi mysql tomcat
刪除所有鏡像:
docker rmi $(docker images -q)
強制刪除鏡像:
docker rmi -f image-id:強制刪除(當前鏡像啟動的容器正在運行中,是無法正常刪除的,可以通過 -f 強制刪除)
如果刪除時不指定 TAG,默認為最新版 Least。
六、Docker 容器常用操作命令
6.1 搜索鏡像
docker search tomcat
6.2 下載鏡像
docker pull tomcat
6.3 根據鏡像新建並啟動容器
最簡單的根據鏡像新建並啟動容器的命令如下:
docker run --name container-name -d image-name
運行一個容器,使用 docker run 命令即可。 另,docker run -參數 含義:
-- name:為容器起一個名稱;-d:detached,執行完這句命令後,控制檯將不會阻塞,可以繼續輸入命令操作,不會阻塞,也就是啟動守護式容器,如果執行 docker run --name mycentos -it centos會進入啟動容器的命令控制檯,也就是啟動交互式容器;-i:以交互方式運行容器,通常與 -t 搭配使用;-t:為容器重新分配一個偽輸入終端,通常與 -i 搭配使用;-P:隨機端口映射;-p:指定端口映射,後面會有端口映射詳細講解;image-name:要運行的鏡像名稱;如果以守護式方式啟動 centos 容器,執行如下命令:docker run --name mycentos -d centos,會正常返回 container-id,但是通過 docker ps 查看,卻發現沒有在運行,通過 docker ps -a 發現,原來已經停止了,這是為什麼呢?
原因及解決方案詳見:點我直達
6.4 查看容器
可通過如下命令,查看運行中的容器列表:
docker ps
另,docker ps -參數含義:
-a:查看所有容器,包括已停止運行的; -q:靜默模式,只顯示容器編號; -l:顯示最近創建的容器; -n 3:顯示最近創建的 num(此處為 3)個容器; --no-trunc:不截斷輸出,顯示完整信息。
6.5 停止容器
通過以下命令來停止運行中的容器:
docker stop container-name/container-id
強制停止容器(類似強制關機):
docker kill container-name/container-id
6.6 啟動容器
通過以下命令啟動容器:
docker start container-name/container-id
6.7 重啟容器
通過以下命令啟動容器:
docker restart container-name/container-id
6.8 刪除容器
刪除單個容器:
docker rm container-id
刪除多個容器:
docker rm container-id container-id
刪除所有容器:
docker rm $(docker ps -a -q )
另,docker rm -參數含義:
-f:強制刪除,如果在運行中,先停止,再刪除
6.8 查看容器日誌
查看當前容器日誌,可通過如下命令:
docker logs container-id/container-name
另,docker logs -參數含義:
-t:加入時間戳;-f:跟隨最新的日誌打印;--tail:顯示最後多少條。6.9 連接到正在運行容器
docker attach container-id:連接到正在運行的容器;
要attach上去的容器必須正在運行,可以同時連接上同一個container來共享屏幕(與screen命令的attach類似)。
官方文檔中說 attach 後可以通過 CTRL-C 來 detach,但實際上經過我的測試,如果 container 當前在運行 bash,CTRL-C 自然是當前行的輸入,沒有退出;如果 container 當前正在前臺運行進程,如輸出 nginx 的 access.log 日誌,CTRL-C 不僅會導致退出容器,而且還 stop 了。
這不是我們想要的,detach 的意思按理應該是脫離容器終端,但容器依然運行。好在 attach 是可以帶上 --sig-proxy=false 來確保 CTRL-D 或 CTRL-C 不會關閉容器。
eg.
docker attach --sig-proxy=false 7f237caad43b
6.10 在運行的容器中執行命令
運行中的容器其實是一個功能完備的簡易版 Linux 操作系統,所以我們可以像常規系統一樣進行登陸及退出操作。
命令為:
docker exec -it container-id/container-name bash
退出命令為:
exit
exec 和 attach 區別:
attach:直接進入容器啟動命令的終端,不會啟動新的進程;exec:在容器中打開新的終端,並且可以啟動新的進程,可在宿主機中直接執行操作容器的命令,eg. docker exec -it 7f237caad43b ls /tmp。6.11 查看容器中正在運行進程
可用通過如下命令查看容器中正在運行進程:
docker top container-id/container-top
6.12 查看容器內部細節
可用通過如下命令查看容器內部細節,返回為 json:
docker insepct container-id
6.13 容器和宿主機互相拷貝文件
宿主機拷貝文件到容器:
docker cp 文件 container-id:目標文件/文件夾
eg.
docker cp /tmp/suzhuji.txt 7f237caad43b:/tmp
將宿主機tem文件夾下suzhujia.txt文件拷貝到容器7f237caad43b中tmp目錄中
從容器拷貝文件到宿主機:
docker cp container-id:目標文件/文件夾 宿主機目標文件/文件夾
eg.
docker cp 7f237caad43b:/tmp/yum.log /tmp
將容器7f237caad43b中tmp目錄下yum.log拷貝到宿主機/tmp目錄下
6.14 更多操作命令
更多命令可以參考:
https://docs.docker.com/engine/reference/commandline/docker/
七、Docker 端口映射
7.1 啟動做端口映射的容器
容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 -P(大寫) 或 -p (小寫) 參數來指定端口映射。啟動容器的時候如果不指定對應參數,在容器外部是無法通過網絡來訪問容器內的網絡應用和服務的。
Docker 的端口映射通過 -p 或 -P 參數實現,命令如下:
docker run --name tomcat1 -d tomcat
docker run --name tomcat2 -d -p 8888:8080 tomcat
如上,就把主機端口 8888 請求映射到 Docker 容器內部端口 8080 了。
-p 和 -P 區別為:
-P : 隨機映射一個49000~49900的端口到內部容器開放的網絡端口
-p : 可以指定要映射的IP和端口,但是在一個指定端口上只可以綁定一個容器
執行完這兩條命令後,通過 docker ps 查看:
通過 PORTS 可以看出,tomcat2 是做了端口映射的,tomcat1 是沒進行映射過的。
分別通過瀏覽器訪問:
http://*.*.*.*:8080/ // tomcat1默認端口; http://*.*.*.*:8888/ // 做過端口映射的 Tomcat2,8888 會轉發請求到 tomcat2 的 8080。
結果如下:
第一個請求是無法請求到的,原因開篇處說過了。
第二個請求是可以正常進行請求的,會由 tomcat2 容器進行處理
7.2 端口映射格式
ip:hostport:containerport #指定ip、指定主機port、指定容器port
eg. docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
指定映射使用一個特定地址,比如 localhost地址 127.0.0.1
ip::containerport #指定ip、未指定主機port、指定容器port
eg. docker run -d -p 127.0.0.1::5000 training/webapp python app.py
綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口
還可以使用 udp 標記來指定 udp 端口
eg. docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
hostport:container #未指定ip port、指定主機port、指定容器port
eg. docker run -d -p 5000:5000 training/webapp python app.py
將本地的 5000 端口映射到容器的 5000 端口,默認會綁定本地所有接口上的所有地址
7.3 查看端口映射
可以通過如下命令查看容器映射了哪些端口及協議:
docker port container-id
示例:
[root@docker ~]#docker port 46114af6b44e
8080/tcp -> 0.0.0.0:8888
[root@docker ~]#docker port cea668ee4db0
如果返回空,則代表沒進行端口映射。
7.4 小結
容器有自己的內部網絡和 ip 地址,可以使用 docker inspect container-id 可以獲取所有的變量Docker 還可以有一個可變的網絡配置-p 標記可以多次使用來綁定多個端口 eg. docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py八、總結與瞻望
8.1 總結
通過本篇,希望你可以清楚的瞭解
Docker 是什麼,具有什麼樣的優勢和應用場景;Docker 的安裝及核心概念;Docker 容器及鏡像常用命令;Docker 端口映射的原因及操作。在準備好這些枯燥的理論基礎和基本命令後,就可以進行對 Docker 的進階與實戰篇了。
8.2 瞻望
在進階與實戰篇,預計內容規劃如下(可能會不斷調整及優化):
1. Docker 鏡像原理及 commit
1.1 再看鏡像及基礎鏡像
1.1 UnionFS 聯合文件系統
1.2 鏡像分層原理及好處
1.4 特點 Copy-on-Write
2. Docker 容器數據卷
2.1 介紹
2.2 用 V 命令添加
2.3 用 DockerFile 添加
2.4 volumes-from
3. Dockerfile 介紹及實戰
3.1 概念
3.2 構建過程解析
3.3 保留字指令
3.4 自定義鏡像
3.5 發佈鏡像
4. Docker 實戰
4.1 安裝 MySQL
4.2 安裝 Redis
4.3 本地鏡像推送到阿里雲
有問題請大家不吝留言!咱們下期再見!