1. 初識Docker
1.1 Docker概念
- Docker是一個開源的應用容器引擎。
- Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的Linux機器上。
- 容器是完全使用沙箱機制,相互隔離的,並且其性能開銷較低。
1.2 安裝Docker
Dcoker可以運行在MAC、Windows、Linux等操作系統上,這裏演示在CentOS 7
的安裝過程。Docker官網:https://www.docker.com/,安裝過程如下:
# 1、yum 包更新到最新
yum update
# 2、安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 設置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安裝docker,出現輸入的界面都按 y (這個步驟需要一定的時間,可能會失敗,失敗後重新執行)
yum install -y docker-ce
# 5、 查看docker版本,驗證是否驗證成功
docker -v
1.3 Docker架構
- 鏡像(Images):鏡像是一個靜態的概念,它類似於面向對象程序設計中的類。
- 容器(Container):如果鏡像是一個類的話,那麼容器就是該類的一個對象。容器是鏡像運行時的實體,容器可以被創建、啓動、停止、刪除和暫停等。
- 倉庫(Registry):倉庫是用來保存鏡像的,和Maven的倉庫是一個意思。
1.4 配置Docker鏡像加速器
默認情況下,docker會從docker hub
(https://hub.docker.com/)上下載鏡像,但是docker hub
的訪問太慢。一般我們都會配置鏡像加速器。我們以配置阿里雲鏡像加速器舉例:
-
登錄阿里雲官方網站
-
登錄成功之後,找到“容器鏡像服務”功能
-
如果是第一次使用該功能,可能提示你開通服務
-
然後我們就可以看到左下角有個鏡像加速器的菜單了,點擊根據裏面的操作文檔進行配置即可。
2. Docker命令
2.1 進程相關命令
- 啓動docker服務
systemctl start docker
- 停止docker服務
systemctl stop docker
- 重啓docker服務
systemctl restart docker
- 查看docker服務狀態
systemctl status docker
- 設置開機啓動docker服務
systemctl enable docker
2.2 鏡像相關命令
- 查看鏡像、查看本地所有的鏡像
docker images
docker images -q # 查看所有鏡像
- 搜索鏡像:從網絡中查找需要的鏡像
docker search 鏡像名稱
- 拉取鏡像:從Docker倉庫下載鏡像到本地,鏡像名稱格式爲:名稱:版本號,如果版本號不指定則是最新的版本。
docker pull 鏡像名稱:版本號
- 刪除本地鏡像
docker rmi 鏡像id
docker rmi `docker images -q` #刪除所有本地鏡像
2.3 容器相關命令
- 查看容器
# 查看正在運行的容器
docker ps
# 查看所有容器
docker ps -a
- 創建並啓動容器
docker run 參數
參數說明:
-i:保持容器運行,通常與-t參數同時使用。加入it這兩個參數後,容器創建後自動進入容器中,退出容器後,容器自動關閉。
-t:爲容器重新分配一個僞輸入終端,通常與-i參數同時使用。
-d:以守護進程運行容器。創建一個容器在後臺進行,需要使用
docker exec
進入容器,退出容器後,容器不會關閉。–name:爲創建的容器命名。
- 進入容器
docker exec 參數 # 退出容器,容器不會關閉
- 停止容器
docker stop 容器名稱
- 啓動容器
docker start 容器名稱
- 刪除容器:如果容器是運行狀態則刪除失敗,需要先停止容器才能刪除
docker rm 容器名稱
- 查看容器信息
docker inspect 容器名稱
3. Docker容器數據卷
3.1 數據卷概念及作用
思考以下三個問題:
- Docker容器刪除後,在容器中產生的數據還在嗎?
- Docker容器和外部機器可以會直接交換文件嗎?
- 容器之間可以進行數據交互嗎?
上面三個問題的答案都是否定的。
針對第一個問題:容器都刪除了,那麼容器中的數據自然就不在了。
針對第二個問題:假設我們在Windows裝了個Linux虛擬機,然後在Linux虛擬機中啓動了一個docker容器,那麼此時Windows是無法和容器直接進行文件交換的。
針對第三個問題:容器是相互隔離的,彼此無法直接進行數據交互。
那麼要解決上面三個問題,就需要用到數據卷。
1)數據卷的概念
- 數據卷是宿主機中的一個目錄或文件。
- 當容器目錄和數據卷目錄綁定後,對方的修改會立即同步。
- 一個數據卷可以被多個容器同時掛載。
- 一個容器也可以掛載多個數據卷。
2)數據卷的作用
- 容器數據持久化
- 外部機器和容器間接通信
- 容器之間數據交換
3.2 配置數據卷
3.2.1 設置數據卷
在創建啓動容器時,使用-v參數設置數據卷:
docker run ... -v 宿主機目錄(文件):容器內目錄(文件)...
注意事項:
- 目錄必須是絕對路徑
- 如果目錄不存在,會自動創建
- 可以掛載多個數據卷(使用多個-v參數配置即可)
3.3 配置數據卷容器
-
創建啓動c3數據卷容器,使用-v參數設置數據卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash
-
創建啓動c1、c2容器,使用–volumes-from參數設置數據卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
4. Dockerfile
4.1 Docker鏡像原理
- Linux文件系統的組成
Linux文件系統由bootfs和rootfs兩部分組成:
(1)bootfs:包含bootloader(引導加載程序)和 kernel(內核)。
(2)rootfs: root文件系統,包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc等標準目錄和文件。
不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu,centos等。
- Docker鏡像原理
(1)Docker鏡像是由特殊的文件系統疊加而成。
(2)一個鏡像可以放在另一個鏡像的上面,位於下面的鏡像成爲父鏡像,最底部的鏡像成爲基礎鏡像。
4.1.1 鏡像製作
(1)將容器轉爲鏡像
# 將容器轉爲鏡像
docker commit 容器id 鏡像名稱:版本號
# 將鏡像保存成壓縮文件
docker save -o 壓縮文件名稱 鏡像名稱:版本號
# 從壓縮文件加載鏡像
docker load -i 壓縮文件名稱
(2)通過Dockerfile製作鏡像
4.2 Dockerfile概念及作用
Dockerfile是一個文本文件,它包含了一條條的指令。每一條指令構建一層,基於基礎鏡像,最終構建出一個新的鏡像。
對於開發人員:可以爲開發團隊提供一個完全一致的開發環境;對於測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作了;對於運維人員:在部署時,可以實現應用的無縫移植。
4.3 Dockerfile關鍵字
關鍵字 | 作用 | 備註 |
---|---|---|
FROM | 指定父鏡像 | 指定dockerfile基於那個image構建 |
MAINTAINER | 作者信息 | 用來標明這個dockerfile誰寫的 |
LABEL | 標籤 | 用來標明dockerfile的標籤 可以使用Label代替Maintainer 最終都是在docker image基本信息中可以查看 |
RUN | 執行命令 | 執行一段命令 默認是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
CMD | 容器啓動命令 | 提供啓動容器時候的默認命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在製作一些執行就關閉的容器中會使用 |
COPY | 複製文件 | build的時候複製文件到image中 |
ADD | 添加文件 | build的時候添加文件到image中 不僅僅侷限於當前build上下文 可以來源於遠程服務 |
ENV | 環境變量 | 指定build時候的環境變量 可以在啓動的容器的時候 通過-e覆蓋 格式ENV name=value |
ARG | 構建參數 | 構建參數 只在構建的時候使用的參數 如果有ENV 那麼ENV的相同名字的值始終覆蓋arg的參數 |
VOLUME | 定義外部可以掛載的數據卷 | 指定build的image那些目錄可以啓動的時候掛載到文件系統中 啓動容器的時候使用 -v 綁定 格式 VOLUME [“目錄”] |
EXPOSE | 暴露端口 | 定義容器運行的時候監聽的端口 啓動容器的使用-p來綁定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目錄 | 指定容器內部的工作目錄 如果沒有創建則自動創建 如果指定/ 使用的是絕對地址 如果不是/開頭那麼是在上一條workdir的路徑的相對路徑 |
USER | 指定執行用戶 | 指定build或者啓動的時候 用戶 在RUN CMD ENTRYPONT執行的時候的用戶 |
HEALTHCHECK | 健康檢查 | 指定監測當前容器的健康監測的命令 基本上沒用 因爲很多時候 應用本身有健康監測機制 |
ONBUILD | 觸發器 | 當存在ONBUILD關鍵字的鏡像作爲基礎鏡像的時候 當執行FROM完成之後 會執行 ONBUILD的命令 但是不影響當前鏡像 用處也不怎麼大 |
STOPSIGNAL | 發送信號量到宿主機 | 該STOPSIGNAL指令設置將發送到容器的系統調用信號以退出。 |
SHELL | 指定執行腳本的shell | 指定RUN CMD ENTRYPOINT 執行命令的時候 使用的shell |
5. Docker應用部署
5.1 部署MySQL
-
搜索mysql鏡像
docker search mysql
-
拉取mysql鏡像
docker pull mysql:5.6
-
創建並啓動容器,設置端口映射、目錄映射
docker run -id \ -p 3306:3306 \ --name=mysql \ -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \ -v /usr/local/docker/mysql/logs:/logs \ -v /usr/local/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
-
進入容器,操作mysql
docker exec -it mysql /bin/bash
-
登錄mysql,就可以操作mysql數據庫了
mysql -uroot -p123456
5.2 部署Tomcat
-
搜索tomcat鏡像
docker search tomcat
-
拉取tomcat鏡像
docker pull tomcat
-
創建並啓動容器,設置端口映射、目錄映射
docker run -id \ -p 8080:8080 \ --name tomcat \ -v /usr/local/docker/tomcat:/usr/local/tomcat/webapps \ tomcat
-
到數據卷目錄中,創建index.html
# 1.進入數據卷目錄 cd /usr/local/docker/tomcat # 2.創建test目錄 mkdir test # 3.創建index.html文件 echo "Hello, this is tomcat container from docker" > index.html
-
瀏覽器訪問tomcat
5.3 部署Nginx
-
搜索nginx鏡像
docker search nginx
-
拉取nginx鏡像
docker pull nginx
-
創建並啓動容器,設置端口映射、目錄映射
docker run -id \ --name=nginx \ -p 80:80 \ -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /usr/local/docker/nginx/logs:/var/log/nginx \ -v /usr/local/docker/nginx/html:/usr/share/nginx/html \ nginx
-
瀏覽器訪問nginx
5.4 部署Redis
-
搜索redis鏡像
docker search redis
-
拉取redis鏡像
docker pull redis:5.0
-
創建容器,設置端口映射
docker run -id --name=redis -p 6379:6379 redis:5.0
-
使用外部機器連接redis
./redis-cli.exe -h 192.168.1.17 -p 6379
6. Docker服務編排
微服務架構的應用系統中一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啓停,維護的工作量會很大。
- 要從Dockerfile build image或者去docker hub拉取image
- 要創建多個container
- 要管理這些container(啓動、停止、刪除)
而服務編排就是:按照一定的業務規則批量管理容器。
6.1 Docker Compose
Docker Compose是一個編排多容器分佈式部署的工具,提供命令集管理容器化應用的完整開發週期,包括服務構建,啓動和停止。使用步驟:
- 利用Dockerfile 定義運行環境鏡像
- 使用docker-compose.yml定義組成應用的各服務
- 運行docker-compose up 啓動應用
6.2 安裝Docker Compose
# Compose目前已經完全支持Linux、Mac OS和Windows,在我們安裝Compose之前,需要先安裝Docker。下面我 們以編譯好的二進制包方式安裝在Linux系統中。
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 設置文件可執行權限
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
6.3 卸載Docker Compose
# 二進制包方式安裝的,刪除二進制文件即可
rm /usr/local/bin/docker-compose
6.4 使用Docker Compose
我們以編排Nginx+SpringBoot項目舉例,該SpringBoot項目裏有一個HelloController
類,目標是通過Nginx代理訪問/hello
。
- 創建Spring Boot項目的Dockerfile文件
FORM java:8
MAINTAINER root <[email protected]>
ADD /usr/soft/springboot-hello-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
- 製作Spring Boot項目鏡像
docker build -f /usr/local/docker/docker-compose/Dockerfile -t app
- 編寫docker-compose.yml
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
- 創建./nginx/conf.d目錄,並別寫app.conf文件
mkdir -p ./nginx/conf.d
# app.conf
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
- 使用docker-compose 啓動容器
docker-compose up
- 測試訪問
http://192.168.1.17/hello
7. Docker私有倉庫
Docker官方的Docker hub(https://hub.docker.com)是一個用於管理公共鏡像的倉庫,我們可以從上面拉取鏡像 到本地,也可以把我們自己的鏡像推送上去。但是,有時候我們的服務器無法訪問互聯網,或者你不希望將自己的鏡像放到公網當中,那麼我們就需要搭建自己的私有倉庫來存儲和管理自己的鏡像。
7.1 私有倉庫搭建
# 1、拉取私有倉庫鏡像
docker pull registry
# 2、啓動私有倉庫容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打開瀏覽器,輸入地址http://私有倉庫服務器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有倉庫搭建成功
# 4、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一個key,保存退出。此步用於讓 docker 信任私有倉庫地址;注意將私有倉庫服務器ip修改爲自己私有倉庫服務器真實ip
{"insecure-registries":["私有倉庫服務器ip:5000"]}
# 5、重啓docker服務
systemctl restart docker
docker start registry
7.2 將鏡像上傳至私有倉庫
# 1、標記鏡像爲私有倉庫的鏡像
docker tag centos:7 私有倉庫服務器IP:5000/centos:7
# 2、上傳標記的鏡像
docker push 私有倉庫服務器IP:5000/centos:7
7.3 從私有倉庫拉取鏡像
#拉取鏡像
docker pull 私有倉庫服務器ip:5000/centos:7
8. Docker相關概念
容器就是將軟件打包成標準化單元,以用於開發、交付和部署。
- 容器鏡像是輕量的、可執行的獨立軟件包 ,包含軟件運行所需的所有內容:代碼、運行時環境、系統工具、系統庫和設置。
- 容器化軟件在任何環境中都能夠始終如一地運行。
- 容器賦予了軟件獨立性,使其免受外在環境差異的影響,從而有助於減少團隊間在相同基礎設施上運行不同軟件時的衝突。
8.1 Docker容器虛擬化與傳統虛擬機比較
相同:
- 容器和虛擬機具有相似的資源隔離和分配優勢。
不同:
- 容器虛擬化的是操作系統,虛擬機虛擬化的是硬件。
- 傳統虛擬機可以運行不同的操作系統,容器只能運行同一類型操作系統。