一、Docker架構圖

1.1 倉庫
Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。
1.2 鏡像
Docker 鏡像是用于創(chuàng)建 Docker 容器的模板,類似于Java中類的概念。
1.3 容器
是獨立運行的一個或一組應用。通過鏡像創(chuàng)建生成,類似于Java中的對象概念。
二、Docker安裝
在CentOS上安裝Docker(CentOS版本必須7+)
2.1 安裝前置環(huán)境
yum install -y yum-utils device-mapper-persistent-data lvm2
2.2 設置docker-ce版安裝源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
2.3 安裝docker
yum -y install docker-ce
2.4 啟動/停止docker
systemctl start/stop docker
2.5 基于阿里云配置鏡像加速
登錄網(wǎng)址: https://dev.aliyun.com/

按照官方的操作文檔修改配置文件即可 <br />注意:如果/etc/docker/daemon.json文件不存在,創(chuàng)建一個即可

拿到加速地址后:
step1:進入docker目錄下
step2:新建一個文件daemon.json
step3:復制加速地址

step4:保存后執(zhí)行下面兩個命令
sudo systemctl daemon-reload
sudo systemctl restart docker

2.6 重啟docker服務
systemctl restart docker
2.7 測試docker服務
docker run hello-world

三、Docker的基本命令
3.1 鏡像相關的命令
3.1.1 搜索鏡像
docker search [鏡像名稱]
參數(shù)介紹:
-f, --filter 根據(jù)提供的條件過濾器輸出
--format 用Go模板打印出漂亮的搜索結果
--limit [n] 搜索結果的最大數(shù)量(默認值為25)
--no-trunc 不要截斷輸出
3.1.2 拉取鏡像(從倉庫中下載鏡像到本地)
docker pull [鏡像名稱][:標簽]
例子:docker pull tomcat:8
在https://hub.docker.com/找docker鏡像資料和版本號
注意:
拉取鏡像時如果沒有顯示的指定tag標簽,默認會拉取latest標簽的版本鏡像

3.1.3 查看本地鏡像
docker images
參數(shù)介紹:
-q 只顯示鏡像唯一的標識信息
3.1.4 刪除鏡像
docker rmi [鏡像名稱:tag]/[鏡像ID]
例子:
docker rmi tomcat:8
docker rmi f19c56ce92a8

參數(shù)介紹:
-f 強制刪除鏡像
3.1.5查看容器詳細信息
docker inspect 容器名
例子:docker inspect mysql
3.2 容器相關的命令
3.2.1 根據(jù)鏡像運行容器
docker run [鏡像名稱][:tag]
參數(shù)介紹:
-i 保持和 docker 容器內(nèi)的交互
-t 為容器的標準輸入,虛擬一個tty
-d 后臺運行容器
--rm 容器在啟動后,執(zhí)行完成命令或程序后就銷毀(不可于 -d 一起使用)
--name 給容器起一個自定義名稱
--restart docker 1.12 新增加的參數(shù),用來指定容器的重啟策略, 當前提供的策略包括:
no 默認值,如果容器掛掉不自動重啟。
on-failure,若容器的退出狀態(tài)非0,則docker自動重啟容器,還可以指定重啟次數(shù)
always,只要容器退出,則docker將自動重啟容器
例子:docker run -d --name mytomcat -p 9999:8080 --restart=always tomcat:8
-p 將宿主機中的某個端口映射到容器中的某個端口上
8888:宿主機端口 8080:容器端口

說明:由于瀏覽器訪問不了tomcat容器里的端口,所以需要宿主機的端口映射到容器中的端口上
3.2.2 查看容器
docker ps
參數(shù)介紹:
-a 查看所有容器(默認不查詢停止的容器)docker ps -a
-q 只查詢?nèi)萜鞯膇d
3.2.3 容器啟動/停止/重啟
docker start/stop/restart 容器名稱
如果重啟出現(xiàn)以下錯誤

step1:啟動一下docker
systemctl restart docker
重啟后,mytomcat并沒有啟動

step2:啟動mytomcat
docker start mytomcat

【測試】訪問

如果瀏覽器訪問不了tomcat,則修改文件
把webapps.dist里面的文件全部復制到webapps里面

退出后重啟tomcat:docker restart mytomcat

3.2.4 查看容器的元數(shù)據(jù)
docker inspect 容器名稱
3.2.5 刪除容器
docker rm 容器名稱
參數(shù)介紹:
-f 表示強制刪除一個容器(默認不能刪除一個運行中的容器)
3.2.6 進入容器中
docker exec [option] 容器名稱 [args]
例子:docker exec -it mytomcat bash
退出容器:exit
參數(shù)介紹:
-i 保持和 docker 容器內(nèi)的交互
-t 為容器的標準輸入,虛擬一個tty
-w 指定進入容器后的工作路徑
args:表示進入容器后執(zhí)行的命令,如果需要和容器進行交互式訪問,需要配置參數(shù)為-it,并且命令設置為bash(表示通過命令行的方式交互訪問容器)
注意:
該命令只能進入到運行中的容器
3.2.7 查看容器運行日志
docker logs 容器名稱
參數(shù)介紹:
--tail n 選項可以指定查看最后n條日志
-t 選項則可以對日志條目附加時間戳。
--until 顯示在某個時間戳(例如:2018-05-25T 13:23:37)之前的日志,還可以相對時間(例如:42m 42 minutes)
-f 實時打印日志內(nèi)容
3.2.7 宿主機和容器間的數(shù)據(jù)拷貝
docker cp [OPTIONS] 容器名稱:容器內(nèi)路徑 宿主機路徑
docker cp [OPTIONS] 宿主機路徑 容器名稱:容器內(nèi)路徑
例子:
docker cp test.txt mytomcat:/usr/local/tomcat
docker cp mytomcat:/usr/local/tomcat/webapp ./
注意:
1、復制文件夾不需要添加任何參數(shù)(和Linux的命令有區(qū)別)
2、無論從哪里復制,命令都是在宿主機執(zhí)行
3.2.8、查看容器日志
docker logs -f elasticsearch
四、容器數(shù)據(jù)卷
4.1 什么是容器數(shù)據(jù)卷?
數(shù)據(jù)卷存在于宿主機中,獨立于容器,和容器的生命周期是分離的
數(shù)據(jù)卷可以目錄也可以是文件
容器可以利用數(shù)據(jù)卷與宿主機進行數(shù)據(jù)共享,實現(xiàn)了容器間的數(shù)據(jù)共享和交換

4.2 容器數(shù)據(jù)卷的特點
1、容器啟動時初始化數(shù)據(jù)卷,如果容器使用的鏡像包含了數(shù)據(jù),這些數(shù)據(jù)也會拷貝到數(shù)據(jù)卷中
2、對 數(shù)據(jù)卷 的修改會立馬生效
3、數(shù)據(jù)卷的變化不會影響鏡像的更新
4、數(shù)據(jù)卷是宿主機中的一個目錄
4.3 數(shù)據(jù)卷的運用場景
1、在多個運行容器之間共享數(shù)據(jù)。如果您沒有明確創(chuàng)建它,則會在第一次將其裝入容器時創(chuàng)建卷。當該容器停止或被移除時,該卷仍然存在。多個容器可以同時安裝相同的卷,無論是讀寫還是只讀。僅當您明確刪除卷時才會刪除卷
2、當您想要將容器的數(shù)據(jù)存儲在遠程主機或云提供商上而不是本地時
3、當您需要備份,還原或將數(shù)據(jù)從一臺Docker主機遷移到另一臺時,卷是更好的選擇。您可以停止容器,然后備份卷的目錄
4.4 數(shù)據(jù)卷的相關命令
4.4.1 創(chuàng)建容器數(shù)據(jù)卷
docker volume create 數(shù)據(jù)卷名稱
例子:docker volume create myvolume

注意
容器卷默認保存在宿主機的/var/lib/docker/volumes路徑下
4.4.2 創(chuàng)建容器時指定數(shù)據(jù)卷
docker run -it
--mount source=數(shù)據(jù)卷名稱,target=容器中的掛載路徑,type=volume
--name 容器別名 鏡像名稱
參數(shù)介紹:
source 指定宿主機中數(shù)據(jù)卷的名稱
target 指定容器中對應的掛載路徑
type 指定為數(shù)據(jù)卷的方式掛載,還可以選擇bind、tmpfs,默認為volume
注意:
1、如果掛載一個空的數(shù)據(jù)卷到容器中的一個非空目錄中,那么這個目錄下的文件會被復制到數(shù)據(jù)卷中
2、如果掛載一個非空的數(shù)據(jù)卷到容器中的一個目錄中,那么容器中的目錄中會顯示數(shù)據(jù)卷中的數(shù)據(jù)。如果原來容器中的目錄中有數(shù)據(jù),那么這些原始數(shù)據(jù)會被隱藏掉
4.4.3 直接在創(chuàng)建容器時指定數(shù)據(jù)卷
docker run ... [-v 宿主機數(shù)據(jù)卷:docker容器路徑:ro] []...
注意:
1、通過這種方式可以任意指定宿主機的數(shù)據(jù)卷位置
2、如果隨意指定數(shù)據(jù)卷的位置,容器中對應路徑的文件就不會復制到宿主機的數(shù)據(jù)卷中,而是全部被清空
3、:ro表示以只讀的方式掛載容器卷,不寫再表示以讀寫的方式掛載
4、可以通過-v連續(xù)設置多個容器卷路徑
總結:
數(shù)據(jù)卷未顯示聲明路徑(默認在/var/lib/docker/volumes下)
1、數(shù)據(jù)卷為空,對應的容器路徑有數(shù)據(jù),則容器中的數(shù)據(jù)直接同步到數(shù)據(jù)卷中
2、數(shù)據(jù)卷有數(shù)據(jù),對應的容器路徑不存在,則啟動容器時,自動創(chuàng)建該容器路徑,并且將數(shù)據(jù)卷的數(shù)據(jù)同步到該路徑下
3、數(shù)據(jù)卷有數(shù)據(jù),對應的容器路徑也有數(shù)據(jù)(數(shù)據(jù)不同),會把數(shù)據(jù)卷中的數(shù)據(jù)同步到容器路徑中,容器路徑中的文件會被隱藏(宿主機 覆蓋 容器)
例子:
docker run -d --name mytomcat2 -p 9999:8080 -v myvolume:/usr/local/tomcat/webapps.dist tomcat:8
(會把myvolume的數(shù)據(jù)同步到webapps.dist中,而webapps.dist本來的文件會被隱藏)
如果宿主機的數(shù)據(jù)卷為空,容器覆蓋宿主機,如果數(shù)據(jù)卷不為空,則宿主機覆蓋容器
數(shù)據(jù)卷聲明指定路徑
例子:docker run -d --name mytomcat2 -p 9999:8080 -v /usr/local/abc:/usr/local/tomcat/webapps.dist tomcat:8
1、數(shù)據(jù)卷為空,對應的容器路徑有數(shù)據(jù),則直接將容器路徑中的數(shù)據(jù)隱藏
2、數(shù)據(jù)卷有數(shù)據(jù),對應的容器路徑不存在,則啟動容器時,自動創(chuàng)建該容器路徑,并且將數(shù)據(jù)卷的數(shù)據(jù)同步到該路徑下
3、數(shù)據(jù)卷有數(shù)據(jù),對應的容器路徑也有數(shù)據(jù)(數(shù)據(jù)不同),會把數(shù)據(jù)卷中的數(shù)據(jù)同步到容器路徑中,容器路徑中的文件會被隱藏(宿主機 覆蓋 容器)
無論情況如何,永遠是宿主機 覆蓋 容器路徑
數(shù)據(jù)卷是文件的情況
注意:在執(zhí)行docker run..命令前,myconfig文件夾必須存在,如果不存在,則會把application.yml文件里面的內(nèi)容復制到myconfig中,此時myconfig是一個文件,不是文件夾

例子:
docker run -d --name mytomcat2 -v /usr/local/myvolume/application.yml:/usr/local/tomcat/webapps/application.yml tomcat:8
1、數(shù)據(jù)卷指定一個文件,對應的容器文件不存在,直接將數(shù)據(jù)卷文件覆蓋到容器中
2、數(shù)據(jù)卷指定的文件不存在,容器的文件存在,啟動容器會報錯
如果需要綁定文件,則必須保證宿主機的數(shù)據(jù)卷中文件必須存在
注意:在數(shù)據(jù)卷修改文件后,需要重啟容器 docker restart mytomcat2
五、Docker的應用
5.1 使用docker安裝MySQL
5.1.1 拉取mysql的鏡像
docker pull mysql:5.7
5.1.2 根據(jù)鏡像創(chuàng)建容器
docker run -d
-v ~/mysql/conf:/etc/mysql/conf.d //2
-v ~/mysql/logs:/logs //3
-v ~/mysql/data:/var/lib/mysql //4
-p 3306:3306 //5
-e MYSQL_ROOT_PASSWORD='root' //6
--name mysql
mysql:5.7
代碼解釋
第二行:掛載mysql配置文件到宿主機
第三行:掛載mysql日志文件到宿主機
第四行:掛載mysql的數(shù)據(jù)路徑到宿主機
第五行:將容器中3306端口映射到宿主機的3306端口上
第六方:設置MySQL的root賬號密碼為root
5.1.3、例子:
step1:在安裝mysql前需要在/usr/local/目錄下先新建一個文件夾mysql_docker
mkdir mysql_docker
step2:安裝MySQL
docker run -d -v /usr/local/mysql_docker/conf:/etc/mysql/conf.d -v /usr/local/mysql_docker/logs:/logs -v /usr/local/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='root' --name mysql -p 3306:3306 mysql:5.7
step3:測試是否連接上

step4:修改數(shù)據(jù)庫編碼格式
在docker安裝的mysql的默認編碼是latinl( 拉丁文),如果插入數(shù)據(jù)會亂碼,需要修改編碼格式

在conf文件夾下新建my.conf文件
[mysqld]
character-set-server=utf8

step5:重啟mysql容器 :docker restart mysql

5.2 使用docker安裝tomcat
5.2.1 拉取tomcat的鏡像
docker pull tomcat:8
5.2.2 運行tomcat容器
docker run -d
--name tomcat
-p 8080:8080
-v ~/tomcat/webapps:/usr/local/tomcat/webapps
tomcat:8
5.2.3 進入容器中進行相關拷貝
docker exec -it tomcat bash
cp -r webapps.dist/* webapps
注意:
docker鏡像tomcat8之后容器中webapps中沒有任何內(nèi)容,需要將歡迎頁導入
5.2.4 將自定義工程部署到tomcat中
1、使用maven命令或者工具將自定義工程打包
2、到工程的target目錄下找到打的war包
3、將war包拷貝到宿主機的tomcat數(shù)據(jù)卷中
4、重啟tomcat容器 docker restart tomcat
六、Docker鏡像的制作與管理
6.1 什么是Dockerfile?
Docker簡單來說就是docker鏡像的描述文件,最基礎原始的鏡像文件都是通過dockerfile文件構建而來
6.2 Dockerfile模板指令介紹
FROM:指定基礎鏡像,必備的指令,并且必須是第一條指令。
MAINTAINER:指明該鏡像的維護者和點子郵件。
比如:MAINTAINER xxxx "xxxxx@qq.com"
ENV:設置環(huán)境變量。
比如:EVN key1=value1 key2=value2...
RUN:在新鏡像內(nèi)部執(zhí)行的命令,比如安裝一些軟件、配置一些基礎環(huán)境,可使用\來換行。
比如:RUN yum install -y mysql-server
COPY:將主機的文件復制到鏡像文件中,如果目標位置不存在會自動創(chuàng)建。
比如:COPY application.yml /etc/resources
ADD:和COPY一樣,但是ADD會加上解壓操作
EXPOSE:暴露鏡像的端口供主機做映射,可以暴露多個端口。
比如:EXPOSE 8080
WORKDIR:在構建鏡像時,指定鏡像的工作目錄,之后的命令都是基于此工作目錄,如果不存在,則會創(chuàng)建目錄,而且在進入容器時,會默認定位到該路徑下。
比如:WORKDIR /usr/local
VOLUME:用來向基礎鏡像中添加數(shù)據(jù)卷
比如 VOLUME /root/mydata /root/condata
CMD:容器啟動時需要執(zhí)行的命令。
比如 CMD /bin/bash

6.3 案例:使用Dockerfile構建自定義工程的運行鏡像
6.3.1 準備好Dockerfile文件以及需要部署的工程war包

6.3.2 Dockerfile文件內(nèi)容
FROM tomcat:8
WORKDIR /usr/local/tomcat
COPY test.war ./webapps
EXPOSE 8080
RUN ./bin/startup.sh
解釋:
第一行:該鏡像時基于tomcat:8鏡像構建
第二行:設置當前基礎路徑,也是后續(xù)命令的相對路徑
第三行:將工程war包復制到tomcat的webapps路徑下
第四方:對外暴露8080端口,也就是tomcat訪問路徑
第五行:設置容器啟動時命令,即啟動tomcat
6.3.3 通過Dockerfile構建鏡像
執(zhí)行命令
docker build -f ./Dockerfile -t mytest:v1 .
解釋:
-f 用來指定Dockerfile模板文件
-t 用來指定自定義鏡像的名稱以及tag
最后的.表示當前路徑
6.4 將自定義鏡像推送至鏡像中心(私服、阿里云等,這里以阿里云舉例)
登錄阿里云,并且選擇容器鏡像服務
創(chuàng)建容器倉庫
登錄阿里云的倉庫并且通過命令推送鏡像到阿里云
docker login --username=賬號 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[鏡像版本號]
docker push registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[鏡像版本號]
6.5、打war包案例:
step1:新建一個springboot項目,并打war包

step2:制作鏡像
FROM tomcat:8
WORKDIR /usr/local/tomcat
COPY duckerdemo.war ./webapps
EXPOSE 8080
CMD ["catalina.sh","run"]

step3:生成容器
docker build -f ./DockerFile -t myapp:v1 .

注意war包名一定要一致,否則創(chuàng)建鏡像失敗

step4:生成容器并測試

6.6、打jar包案例:
step1:工程打包
注意:如果是打jar包,必須有下面的插件,不然編譯沒問題,運行有問題

step2:新建文件夾并把jar包拉取到文件夾下

step3:制作鏡像
vim DockerFile
FROM openjdk:8
WORKDIR /usr/local
COPY duckerdem.jar ./
EXPOSE 8080
CMD ["java"."-jar","duckerdem.jar"]
step4:與war包步驟相同