一、初始 Docker
1. Docker 概念
- Docker 是一個開源的應用容器引擎
- 誕生於2013年初,基於
Go
語言實現,dotCloud公司出品(後改名Docker Inc) - Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出
到任何流行的Linux
機器上. - 容器是完全使用沙箱機制,相互隔離
- 容器效能開銷極低
- Docker 從 17.03版本之後分為CE(Community Edition:社群版)和EE(Enterprise Edition:企業版)
小結:Docker 是一種容器技術,主要用於解決軟體跨環境遷移部署問題
2. 安裝 Docker
說明:Docker可以執行在MAC、Windows、CentOS、UBUNTU等作業系統上,以下學習全部基於CentOS7安裝Docker.
Docker官網
# 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
3. 架構
說明:學習Docker架構能讓我們知道Docker有哪些部分組成也就知道了我們應該怎樣操作Docker
說明:上圖共分為三個部分,客戶端(Clients)、核心部分(Hosts),倉庫(Registries)
核心部分又包括(映象、容器)
- 映象(Image):Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。
- 容器(Container):映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的類和物件的關係一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
- 倉庫(Repository):倉庫可看成一個程式碼控制中心,用來儲存映象。
4. 配置Docker映象加速器
說明:預設情況下,都是從docker hub(https://hub.docker.com/) 上下載Docker映象,但是太慢,所以一般都會配置國內的映象加速器:USTC:中科大映象加速器(https://docker.mirrors.ustc.edu.cn) 、阿里雲、網易雲、騰訊雲
配置不同的加速器可能用到的方法也不盡相同,這裡我們以阿里雲加速器為例:
- 登入阿里雲官網(https://www.aliyun.com/)
- 點選-控制檯
- 搜尋“映象”
- 點選搜尋到的“容器映象服務”
- 點選“映象加速器”
- 根據操作文件進行操作,將命令貼上至命令列執行即可
- 檢視是否配置成功
命令:cat /etc/docker/daemon.json
二、Docker 命令
說明:如下圖,主要介紹三部分命令;第一部分介紹如何操作Hosts部分中Docker服務(daemon)即後臺守護程式,第二部分介紹如何操作映象(image),第三部分介紹如何操作容器(container)
1. Docker 服務相關命令
- 啟動Docker服務
systemctl start docker
- 停止Docker服務
systemctl stop docker
- 重啟Docker服務
systemctl restart docker
- 檢視Docker服務狀態
systemctl status docker
- 設定開機啟動Docker服務
systemctl enable docker
2. Docker 映象相關命令
- 檢視映象:檢視本地所有的映象
# 檢視所有映象 docker images # 檢視所有映象的id docker images -q
- 搜尋映象:從Docker Hub官網中查詢需要的映象
docker search 映象名稱
- 拉取映象:從Docker倉庫下載映象到本地,映象名稱格式為 名稱:版本號,如果不指定版本號則預設為最新版本。如果不知道映象版本,可以去Docker hub搜尋對應的映象檢視。
docker pull 映象名稱
- 刪除映象:刪除本地映象
# 根據id刪除指定本地映象 docker rmi 映象id # 刪除所有本地映象 docker rmi `docker images -q`
3. 容器相關命令
說明:前面我們說過映象與容器的關係;容器是透過執行映象檔案來建立的,容器是映象執行時的實體。
- 檢視容器
# 檢視正在執行的容器 docker ps # 檢視所有容器 docker ps -a
- 建立並啟動容器
docker run -引數 --name=容器名稱 映象名稱:映象版本 進入容器的初始化指令 # 例1:建立完成後自動進入容器,並且退出容器後容器自動關閉 docker run -it --name=c1 centos:7 /bin/bash # 例2:建立完成後不會立即進入容器,需要透過鍵入命令的方式進入容器,並且退出容器後容器不會自動關閉,它會繼續在後臺執行 docker run -id --name=c2 centos:7 # 引數說明: # -i:保持容器執行。通常與 -t 同時使用。加入it這兩個引數後,容器建立後自動進入容器中,退出容器後,容器自動關閉。 # -t:為容器重新分配一個偽輸入終端,通常與-i同時使用。 # -d:以守護(後臺)模式執行容器。建立一個容器在後臺執行,需要使用docker exec進入容器。退出後,容器不會關閉。 # -it:建立的容器一般稱為互動式容器,-id建立的容器一般稱為守護式容器。 # --name:為建立的容器命名。 # 如若不寫映象版本號則預設為最新版本
- 進入容器
docker exec 引數 容器名稱 初始化命令 例:docker exec -it c2 /bin/bash
- 退出容器
exit;
- 停止容器
docker stop 容器名稱或者容器ID
- 啟動容器
docker start 容器名稱或者容器ID
- 刪除容器
# 如果容器是執行狀態則刪除失敗,需要先停止容器執行才能刪除 docker rm 容器名稱或者容器ID
- 檢視容器資訊
docker inspect 容器名稱或者容器ID
三、Docker 容器的資料卷
1. 資料卷概念及作用
思考:
- Docker 容器刪除後,在容器中產生的資料還在嗎?
- Docker 容器和外部機器可以直接交換檔案嗎?
- 容器之間如何進行資料互動
資料卷:
- 資料卷是宿主機中的一個目錄或檔案
- 當容器目錄和資料卷目錄繫結後,雙方不管誰發生變動都會立即同步至另一方
- 一個資料卷可以繫結多個容器
- 一個容器也可以繫結多個資料卷
資料卷作用:
- 容器資料持久化
- 外部機器和容器間接通訊
- 容器之間資料交換
2. 配置資料卷
- 建立啟動容器時,使用
-v
引數設定資料卷docker run -v 宿主機目錄(檔案):容器內目錄(檔案) //例1:繫結一個資料卷 docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash //例2:繫結多個資料卷 docker run -it --name=c2 -v /root/data2:/root/data_container2 -v /root/data3:/root/data_container3 centos:7 /bin
注意:
1.目錄(檔案)必須是絕對路徑;
2.如果目錄不存在,會自動建立;
3.可以繫結多個資料卷初學時可以自己在虛擬機器內實踐一下,將虛擬機器作為宿主機,在宿主機內建立多個容器並繫結資料卷,看資料能否交換與持久化
3. 資料卷容器
描述:如上圖,容器C1、C2、C3本質並沒有不同,只是C3與宿主機中的資料卷繫結,C1、C2與C3繫結,這樣一來,C1、C2相當於與資料卷繫結。
//1.首先建立C3容器
docker run -it --name=c3 -v /root/data:/root/volume centos:7
//2.建立C1、C2容器,並使用--volumes-from引數與C3繫結
docker run -it --name=c2 --volumes-from c3 centos:7
docker run -it --name=c1 --volumes-from c3 centos:7
例項:在c2 的/root/volume中建立檔案c.txt,檔案同時會出現在c1、c3與宿主機的/root/data目錄中。可自行操作進行驗證
四、Docker 應用部署
1. MySQL 部署
部署步驟:
- 搜尋mysql映象
- 拉取mysql映象
- 建立容器
- 操作容器中的mysql
注意:因為容器內的網路服務和外部機器不能直接通訊,但是,外部機器可以與容器的宿主機通訊,所以,如果需要外部機器訪問容器內服務時,需要將容器中提供服務的埠對映到宿主機的埠上,使外部機器訪問宿主機的該埠,從而間接訪問容器的服務。這種操作成為:埠對映。
- 搜尋映象
docker search mysql
- 拉去映象
docker pull mysql:5.7
- 建立映象
# 在/root目錄下建立mysql目錄用於儲存mysql資料資訊 mkdir /root/mysql
# 建立容器的命令 docker run -id -p 3307:3306 --name=mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
- 引數說明:
- -p 3307:3306:將容器的
3306
埠對映到宿主機的3307
埠(並非必須要對映到3307埠)。 - -v /root/mysql/conf:/etc/mysql/conf.d:將宿主機的
/root/mysql/conf
目錄與容器的/etc/mysql/conf.d
進行繫結掛載,這是mysql
的配置目錄。 - -v /root/mysql/logs:/logs:將宿主機的
/root/mysql/logs
的目錄與容器的/logs
進行繫結掛在,用於存放日誌。 - -v /root/mysql/data:/var/lib/mysql:將宿主機
/root/mysql/data
目錄與容器/var/lib/mysql
進行繫結掛載,這是資料目錄。 - -e MYSQL_ROOT_PASSWORD=123456:初始化
root
使用者的密碼
- -p 3307:3306:將容器的
- 進入容器,操作MySQL
# 進入容器的命令 docker exec -it mysql /bin/bash # 進入MySQL mysql -uroot -p123456 # 列印資料表 show databases;
- 外部機器連線容器中的MySQL
2. Tomcat 部署
- 搜尋tomcat映象
docker search tomcat
- 拉取tomcat映象
docker pull tomcat
- 建立容器,設定埠對映、目錄對映
# 在/root目錄下建立tomcat目錄用於儲存tomcat資料資訊 mkdir /root/tomcat cd /root/tomcat # 建立並執行容器 docker run -id --name=tomcat -p 8080:8080 -v /root/tomcat:/usr/local/tomcat/webapps tomcat
- 引數說明:
- -p 8080:8080:將容器的8080埠對映到主機的8080埠
- -v /root/tomcat:/usr/local/tomcat/webapps:將主機中Tomcat目錄掛載到容器webapps目錄
- 使用外部機器訪問Tomcat:例
# 在宿主機的tomcat目錄下建立檔案 mkdir /root/tomcat/test # 建立index.html vim /root/tomcat/test/index.html
3. Nginx 部署
搜尋nginx映象
docker search nginx
拉取nginx映象
docker pull nginx
建立容器,設定埠對映、目錄對映
# 在/root目錄下建立nginx目錄用於儲存nginx資料資訊 mkdir /root/nginx mkdir /root/nginx/conf cd /root/nginx/conf # 在/root/nginx/conf/下建立nginx.conf檔案,貼上下面內容 vim nginx.conf
user nginx; # 設定nginx服務的系統使用使用者 worker_processes 1; # 工作程式數 error_log /var/log/nginx/error.log warn; # nginx的錯誤日誌 pid /var/run/nginx.pid; # nginx啟動時候的pid events { worker_connections 1024; # 每個程式允許的最大連線數 } http { # http請求配置,一個http可以包含多個server #定義 Content-Type include /etc/nginx/mime.types; default_type application/octet-stream; # 日誌格式 此處main與access_log中的main對應 # $remote_addr:客戶端地址 # $remote_user:http客戶端請求nginx認證的使用者名稱,預設不開啟認證模組,不會記錄 # $timelocal:nginx的時間 # $request:請求method + 路由 + http協議版本 # status:http reponse 狀態碼 # body_bytes_sent:response body的大小 # $http_referer:referer頭資訊引數,表示上級頁面 # $http_user_agent:user-agent頭資訊引數,客戶端資訊 # $http_x_forwarded_for:x-forwarded-for頭資訊引數 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #訪問日誌,後面的main表示使用log_format中的main格式記錄到access.log中 access_log /var/log/nginx/access.log main; #nginx的一大優勢,高效率檔案傳輸 sendfile on; #tcp_nopush on; #客戶端與服務端的超時時間,單位秒 keepalive_timeout 65; #gzip on; server { #http服務,一個server可以配置多個location listen 80; #服務監聽埠 server_name localhost; #主機名、域名 #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; #頁面存放目錄 index index.html index.htm; #預設頁面 } #error_page 404 /404.html; # 將500 502 503 504的錯誤頁面重定向到 /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { #匹配error_page指定的頁面路徑 root /usr/share/nginx/html; #頁面存放的目錄 } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } include /etc/nginx/conf.d/*.conf; }
# 建立並執行Nginx容器 docker run -id --name=nginx -p 80:80 -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/logs:/var/log/nginx -v /root/nginx/html:/usr/share/nginx/html nginx
- 引數說明:
- -p 80:80:將容器的
80
埠對映到宿主機的80
埠。 - -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:將主機下的
/root/nginx/conf/nginx.conf
掛載到容器的:/etc/nginx/nginx.conf
。配置目錄 - -v /root/nginx/logs:/var/log/nginx:將主機下的
/root/nginx/logs
目錄掛載到容器的/var/log/nginx
。日誌目錄
- -p 80:80:將容器的
- 使用外部機器訪問Nginx服務:例
# 在宿主機的 /root/nginx/html/ 目錄下建立index.html檔案 cd /root/nginx/html vim index.html
4. Redis 部署
- 搜尋redis映象
docker search redis
- 拉取redis映象
docker pull redis:5.0.9
- 建立容器,設定埠對映
docker run -id --name=redis -p 6379:6379 redis:5.0.9
- 使用外部機器連線redis
# 安裝redis並執行 redis-cli.exe 連線宿主機上的redis容器 redis-cli.exe -h 宿主機IP地址 -p 繫結的宿主機埠
五、Dockerfile
Docker 映象本質是一個分層檔案系統。
1. 映象製作
- 容器轉為映象
docker commit 容器ID 映象名稱:版本號
- 映象轉為壓縮檔案
# 因為映象是不可以傳輸的,所以需要將映象轉為壓縮檔案 docker save -o 壓縮檔名稱 映象名稱:版本號
- 壓縮檔案轉為映象
# 將由映象生產的壓縮檔案再轉為映象 docker load -i 壓縮檔名稱
2. Dockerfile
2.1 概述:
Dockerfile
是一個文字檔案,它裡面包含了一條條的指令,每一條指令構建一層。Dockerfile
基於基礎映象,最終構建出一個新的映象來。對於開發人員來說,可以透過Dockerfile
為開發團隊提供一個或多個完全一致的開發環境,便於專案的測試與運維。
2.2 關鍵字:
關鍵字 | 作用 | 備註 |
---|---|---|
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 |
2.3 案例1
自定義centos7映象:
要求:1. 預設登入路徑為/usr
;2. 可以使用vim
因為官方提供的centos7映象建立容器後不能在容器內使用vim
,並且進入容器預設目錄為/
實現步驟:
- 定義父映象:
FROM centos:7
- 定義作者資訊:
MAINTAINER itheima <itheima@itcast.cn>
- 執行安裝vim命令:
RUN yum install -y vim
- 定義預設的工作目錄:
WORKDIR /usr
- 定義容器啟動執行的命令:
CMD /bin/bash
- 透過dockerfile構建映象:
docker bulid –f dockerfile檔案路徑 –t 映象名稱:版本 .
# 在宿主機的/root目錄下建立dockerfile資料夾用於存放dockerfile檔案
mkdir /root/dockerfile
# 建立dockerfile
touch my_sentos7
# 將以下內容寫入 my_sentos7 檔案
FROM centos:7
MAINTAINER ws <18595476026@163.com>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
# 執行構建映象的命令
docker build -f /root/dockerfile/my_sentos7 -t myself_centos7:1.0 .
# 檢視本地映象
docker images
# 透過 myself_centos7:1.0 映象構建容器
docker run -id --name=myself_centos7 myself_centos7:1.0
# 進入容器
docker exec -it myself_centos7 /bin/bash
# 此時預設進入容器的 /usr 目錄,並且可以使用 vim 命令
3. 服務編排
概述:按照一定的業務規則批次管理容器
3.1 Docker Compose 安裝使用
Docker Compose
是一個編排多容器分散式部署的工具,提供命令集管理容器化應用的完整開發週期,包括服務構建,啟動和停止。
使用步驟:
- 利用 Dockerfile 定義執行環境映象
- 使用 docker-compose.yml 定義組成應用的各服務
- 執行 docker-compose up 啟動應用
安裝 Docker Compose
# Compose目前已經完全支援Linux、Mac OS和Windows,在安裝Compose之前,需要先安裝Docker。下面我 們以編譯好的二進位制包方式安裝在Linux系統中。 curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 設定檔案可執行許可權 chmod +x /usr/local/bin/docker-compose # 檢視版本資訊 docker-compose -version
解除安裝 Docker Compose
# 二進位制包方式安裝的,刪除二進位制檔案即可 rm /usr/local/bin/docker-compose
六、Docker 私有倉庫
1. 搭建 Docker 私有倉庫
拉取私有倉庫映象
docker pull registry
啟動私有倉庫容器
docker run -id --name=registry -p 5000:5000 registry
驗證是否搭建成功
# 開啟瀏覽器 輸入地址http://私有倉庫伺服器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有倉庫 搭建成功
修改daemon.json
# 開啟並編輯檔案 vim /etc/docker/daemon.json # 將下面內容新增至檔案中 {"insecure-registries":["私有倉庫伺服器ip:5000"]} # 例: { "registry-mirrors": ["https://r5w4t6kd.mirror.aliyuncs.com"],//原內容 "insecure-registries": ["192.168.118.130:5000"]//新增的內容 } # 作用:用於讓 docker 信任私有倉庫地址;注意將私有倉庫伺服器ip修改為自己私有倉庫伺服器真實ip
重啟 docker 服務
systemctl restart docker docker start registry
2. Docker 私有倉庫-上傳映象
1.標記映象為私有倉庫的映象
# 命令:
docker tag 映象名稱:映象版本號 私有倉庫伺服器IP:5000/映象名稱:映象版本號
# 例:
docker tag centos:7 192.168.118.130:5000/centos:7
- 上傳標記的映象
# 命令: docker push 私有倉庫伺服器IP:5000/映象名稱:映象版本號 # 例: docker push 192.168.118.130:5000/centos:7
3. Docker 私有倉庫-拉取映象
- 拉取映象
# 命令: docker pull 私有倉庫伺服器ip:5000/centos:7 # 例: docker pull 192.168.118.130:5000/myself_centos7:1.0
本作品採用《CC 協議》,轉載必須註明作者和本文連結