Docker 是 dotCloud 公司開源的一個基於 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離的高級容器引擎, 其將 Linux 的容器技術發揮極致。Docker 源代碼使用 Go 語言開發,並使用 Apache2.0 協議進行開源,代碼託管在 Github 上。java
Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上。mysql
容器是徹底使用沙箱機制,相互隔離,容器性能開銷極低。linux
Docker 從 17.03 版本以後分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)nginx
官網地址:https://www.Docker.comweb
Docker通俗的講,是服務器中高性能的虛擬機,能夠將一臺物理機虛擬N多臺虛擬機的機器,互相之間隔離,互不影響。redis
那麼爲何咱們須要使用容器技術?作過開發的同窗確定清楚,咱們在本身電腦開發了一套系統,在本身電腦的環境下是能夠運行的很好,可是一旦這個系統拷貝到其餘系統就能夠出現各類環境問題。正以下圖左邊那樣,咱們在主機上,安裝了各類 App,而這些 App 又依賴各類類庫,有些主機自帶了一些類庫,有些沒有,因此咱們在部署 App 的時候不得不作這些繁雜事情,並且不一樣 App 之間還可能互相影響,這些複雜的環境致使咱們部署 App 會遇到各類各樣莫名其妙的問題,使得咱們開發部署效率極爲低下。spring
而有了容器以後,咱們把各類不一樣的 App 運行在不一樣的容器中,這些容器彼此隔離,它們有本身的文件系統,也不能訪問對方的程序,他們的運算和資源都是隔離的。並且咱們能夠把 App 依賴的各類類庫和 App 一同打包到容器中,這樣就使得咱們能夠一次編寫部署處處運行,從而極大提高了開發效率。sql
傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬,所以容器要比傳統虛擬機更爲輕便。docker
相同:容器和虛擬機都是虛擬化技術,具有資源隔離和分配優點shell
不一樣:
容器虛擬化的是操做系統,虛擬機虛擬化的是硬件
傳統虛擬機能夠運行不一樣的操做系統,容器主要運行同一類操做系統(Linux)
宿主機:安裝Docker守護進程的Linux服務器,稱之爲宿主機;
鏡像(Image):Docker 鏡像,就至關因而一個 root 文件系統。好比官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
容器(Container):鏡像運行以後的實體,鏡像和容器的關係,就像是面向對象程序設計中的類和對象同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。
倉庫(Repository):倉庫可當作一個代碼控制中心,用來保存鏡像。
安裝以前保證能夠連外網
Docker官方建議在Ubuntu中安裝,由於Docker是基於Ubuntu發佈的,並且通常Docker出現的問題Ubuntu是最早更新或者打補丁的。在不少版本的CentOS中是不支持更新最新的一些補丁包的。
因爲咱們學習的環境都使用的是CentOS,所以這裏咱們將Docker安裝到CentOS上。注意:這裏建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中有Bug!
(1)yum 包更新到最新
sudo yum update
(2)安裝須要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3)設置yum源爲阿里雲
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)安裝docker
sudo yum install docker-ce
(5)安裝後查看docker版本
docker -v
啓動docker:
systemctl start docker
中止docker:
systemctl stop docker
重啓docker:
systemctl restart docker
查看docker狀態:
systemctl status docker
設置開機啓動:
systemctl enable docker
查看docker概要信息
docker info
查看docker幫助文檔
docker --help
默認狀況,將從docker hub(https://hub.docker.com/)下載docker鏡像太慢,通常都會配置鏡像加速器;
中國科學技術大學(ustc)是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker鏡像加速器速度很快。ustc docker mirror的優點之一就是不須要註冊,是真正的公共服務。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
編輯該文件:
vim /etc/docker/daemon.json
在該文件中輸入以下內容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
若是中科大鏡像加載速度很慢,建議配置阿里雲鏡像加速,這個鏡像倉庫若是很差使,能夠本身從阿里雲上申請!
{
"registry-mirrors": ["https://3ad96kxd.mirror.aliyuncs.com"]
}
必需要註冊,每一個人分配一個免費的docker鏡像加速地址,速度極快
配置完成記得刷新配置
sudo systemctl daemon-reload
sudo systemctl restart docker
查看本地全部鏡像
docker images
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下
若是你須要從網絡中查找須要的鏡像,能夠經過如下命令搜索;==注意,必須確保當前系統能聯網==
docker search 鏡像名稱
拉取鏡像:從Docker倉庫下載鏡像到本地,鏡像名稱格式爲 名稱:版本號,若是版本號不指定則是最新的版本。若是不知道鏡像版本,能夠去docker hub 搜索對應鏡像查看。
docker pull 鏡像名稱
例如,我要下載centos7鏡像
docker pull centos:7
按鏡像ID刪除鏡像
docker rmi 鏡像ID
刪除全部鏡像
docker rmi `docker images -q`
查看正在運行的容器
docker ps
查看全部容器
docker ps –a
查看最後一次運行的容器
docker ps –l
查看中止的容器
docker ps -f status=exited
建立容器命令:
docker run 參數 鏡像名稱:鏡像標籤 /bin/bash
建立容器經常使用的參數說明:
## 命令參數詳解
-i:表示運行容器
-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器建立就能登陸進去。即分配一個僞終端(若是隻加it兩個參數,建立後就會自動進去容器)。
-d:在run後面加上-d參數,則會建立一個守護式容器在後臺運行(這樣建立容器後不會自動登陸容器)。
--name :爲建立的容器命名。
-v:表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄),可使用多個-v作多個目錄或文件映射。注意:最好作目錄映射,在宿主機上作修改,而後共享到容器上。
-p:表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可使用多個-p作多個端口映射
進入容器以後,初始化執行的命令:/bin/bash;可寫可不寫
docker run -it --name=容器名稱 鏡像名稱:標籤 /bin/bash
這時咱們經過ps命令查看,發現能夠看到啓動的容器,狀態爲啓動狀態
退出當前容器
exit
docker run -di --name=容器名稱 鏡像名稱:標籤 /bin/bash
docker exec -it 容器名稱 (或者容器ID) /bin/bash
注意:這裏的登錄容器以後執行的腳本/bin/bash必須寫
中止容器:
docker stop 容器名稱(或者容器ID)
啓動容器:
docker start 容器名稱(或者容器ID)
若是咱們須要將文件拷貝到容器內可使用cp命令
docker cp 須要拷貝的文件或目錄 容器名稱:容器目錄
也能夠將文件從容器內拷貝出來
docker cp 容器名稱:容器目錄 須要拷貝的文件或目錄
咱們能夠經過如下命令查看容器運行的各類數據
docker inspect 容器名稱(容器ID)
也能夠直接執行下面的命令直接輸出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)
刪除指定的容器,正在運行的容器沒法刪除
docker rm 容器名稱(容器ID)
解決的問題:
考慮到容器的隔離性:
Docker 容器刪除以後,在容器中產生的數據還在嗎?
Docker 容器和外部機器能夠直接交換文件嗎?
容器之間的數據交互?
數據卷是宿主機中的一個目錄或文件,當容器目錄和數據卷目錄綁定後,對方的修改會當即同步;一個數據卷能夠被多個容器同時掛載,一個容器也能夠被掛載多個數據卷
數據卷做用
容器數據持久化
外部機器和容器間接通訊
容器之間數據交換
建立啓動容器時,使用 –v 參數 設置數據卷
docker run ... –v 宿主機目錄(文件):容器內目錄(文件) ...
注意事項:
目錄必須是絕對路徑
若是宿主機目錄不存在,會自動建立
能夠掛載多個數據卷
案例:
docker run -di --name=c1 -v /root/host_data1:/root/c1_data centos:7 /bin/bash
咱們能夠經過如下命令,查看容器中掛載的數據卷
docker inspect 容器名稱(容器ID)
咱們能夠經過如下命令,掛載多個數據卷
docker run -di --name=c1 -v /root/host_data1:/root/c1_data1 -v /root/host_data2:/root/c1_data2 centos:7 /bin/bash
多個容器掛載1個數據卷,實現數據共享
docker run -di --name=c2 -v /root/host_data_common:/root/c2_data centos:7
docker run -di --name=c3 -v /root/host_data_common:/root/c3_data centos:7
多個容器掛載1個容器(這個容器掛載1個數據卷)
##建立啓動c3數據卷容器,使用 –v 參數 設置數據卷
docker run -it --name=c3 -v /root/host_data_common:/root/c3_data 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
搜索MySQL鏡像
拉取MySQL鏡像
建立容器、設置端口映射、設置數據卷
進入容器操做mysql
使用Navicat鏈接MySQL
搜索mysql鏡像
docker search mysql
拉取mysql鏡像
docker pull mysql:5.6
建立容器,設置端口映射、目錄映射
docker run -di --name=c_mysql -p 3307:3306 -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
參數說明:
-p 3307:3306:將容器的 3306 端口映射到宿主機的 3307 端口。
-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 用戶的密碼。
進入容器,操做mysql
docker exec –it c_mysql /bin/bash
使用Navicat鏈接容器中的mysql
搜索Tomcat鏡像
拉取Tomcat鏡像
建立容器、設置端口映射、設置數據卷
向Tomcat中部署服務
使用外部機器訪問Tomcat,測試部署服務
搜索tomcat鏡像
docker search tomcat
拉取tomcat鏡像
docker pull tomcat:8-jdk8
建立容器,設置端口映射、目錄映射
docker run -id --name=c_tomcat -p 8080:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8-jdk8
參數說明:
-p 8080:8080:將容器的8080端口映射到主機的8080端口
-v /root/tomcat/webapps:/usr/local/tomcat/webapps:將主機目錄(/root/tomcat/webapps)掛載到容器的webapps
向Tomcat中部署服務,使用FinalShell文件上傳
使用外部機器訪問Tomcat,測試部署服務
搜索Redis鏡像
拉取Redis鏡像
建立容器、設置端口映射
使用外部機器鏈接Redis,測試
搜索redis鏡像
docker search redis
拉取redis鏡像
docker pull redis:5.0
建立容器,設置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
使用外部機器鏈接redis,測試
Docker 鏡像本質是什麼?
分層的統一文件系統(union file system)
Docker 中一個centos鏡像爲何只有200MB,而一個centos操做系統的iso文件要幾個個G?
Docker 中一個tomcat鏡像爲何有500MB,而一個tomcat安裝包只有70多MB?
咱們能夠經過如下命令將容器保存爲鏡像
docker commit {正在運行容器名稱} {鏡像名稱}
# 舉例
docker commit c_tomcat mywar_tomcat
咱們能夠經過如下命令將鏡像保存爲tar 文件
docker save -o {鏡像的備份文件} {鏡像名稱}
# 舉例
docker save -o mywar_tomcat.tar mywar_tomcat
# -o :輸出到的文件
首先咱們先刪除掉mynginx_img鏡像 而後執行此命令進行恢復
docker load -i {備份的鏡像文件}
# 舉例
docker load -i mywar_tomcat.tar
# -i :指定導入的文件
執行後再次查看鏡像,能夠看到鏡像已經恢復,能夠再次運行測試
docker run -di --name=mytomcat -p 8081:8080 -v /root/tomcat/webapps/:/usr/local/tomcat/webapps mywar_tomcat:latest
Dockerfile 是一個文本文件,包含了構建鏡像文件的指令,每一條指令構建一層,基於基礎鏡像,最終構建出一個新的鏡像;
對於開發人員:能夠爲開發團隊提供一個徹底一致的開發環境
對於測試人員:能夠直接拿開發時所構建的鏡像或者經過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 |
目標:發佈springboot項目到docker容器中
注意:構建docker鏡像的是Dockerfile文件,Dockerfile文件與SpringBoot文件必須存放在同一個目錄;
實現步驟:
在IDEA中編輯Dockerfile文件
定義基礎鏡像
定義做者信息
向鏡像中添加jar包文件
定義當前鏡像啓動容器時,執行命令
在宿主機中,構建鏡像,用到docker命令
基於鏡像,啓動容器
測試
實現過程:
在IDEA中編輯Dockerfile文件
# 定義基礎鏡像
FROM java:8
# 定義做者信息
MAINTAINER jack <jack@163.com>
# 添加jar包文件到鏡像中
ADD springboot.jar app.jar
# 定義當前鏡像啓動容器時,執行命令
CMD java –jar app.jar
在宿主機中,構建鏡像
docker bulid –f {dockerfile的文件路徑} –t {鏡像名稱:版本} {構建文件所在路徑}
# 舉例
docker build -f Dockerfile -t myspringboot:1.0 /home/etluser/kong/
# -f:指定要使用的Dockerfile路徑;
# -t:鏡像的名字及標籤,一般 name:tag 或者 name 格式,不設置爲latest
docker run -di --name=myspringboot -p 9000:8080 myspringboot:1.0