Docker

Docker

一、Docker簡(jiǎn)介

1、什么是Docker

Docker 是一個(gè)開源的應(yīng)用容器引擎,基于 Go 語言 并遵從Apache2.0協(xié)議開源。
Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)管怠、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上缸榄,也可以實(shí)現(xiàn)虛擬化渤弛。
容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低甚带。

2她肯、為什么使用Docker

  • 簡(jiǎn)化程序:
    問題1:
    某IT部門要上線一個(gè)項(xiàng)目。常規(guī)操作欲低,直接去線上服務(wù)器辕宏,拷貝一個(gè)tomcat,然后改端口號(hào)砾莱,然后部署應(yīng)用到webapps文件夾下瑞筐,重啟就好。
    一個(gè)服務(wù)器上可能會(huì)部署多個(gè)應(yīng)用服務(wù)。如果某個(gè)應(yīng)用出現(xiàn)問題聚假,CPU100%块蚌,可能這個(gè)服務(wù)器上的其他應(yīng)用也會(huì)出現(xiàn)問題。
    對(duì)于一個(gè)大型應(yīng)用拆分為幾十個(gè)微服務(wù)膘格,分別交由不同的團(tuán)隊(duì)開發(fā)峭范,不同團(tuán)隊(duì)之間水平參差不齊。如果還采用這種部署方式瘪贱,你的應(yīng)用可能會(huì)因?yàn)榱硪粋€(gè)團(tuán)隊(duì)的應(yīng)用發(fā)生意外纱控。因部署在了同一臺(tái)服務(wù)器上,導(dǎo)致全部出現(xiàn)問題菜秦。
    問題2:
    開發(fā)和線上代碼(同一套代碼)問題甜害。開發(fā)階段部署一套軟件環(huán)境,測(cè)試人員在開發(fā)中測(cè)試沒有問題球昨,運(yùn)維進(jìn)行部署尔店。但是正式部署到服務(wù)器時(shí),發(fā)生了問題(啟動(dòng)參數(shù)主慰、環(huán)境問題嚣州、漏配了參數(shù))等意外。
    問題3:
    隨著微服務(wù)技術(shù)的興起共螺,一個(gè)大的應(yīng)用需要拆分成多個(gè)微服務(wù)该肴。多個(gè)微服務(wù)的生成,就會(huì)面臨龐大系統(tǒng)的部署效率藐不,開發(fā)協(xié)同效率問題沙庐。然后通過服務(wù)的拆分,數(shù)據(jù)的讀寫分離佳吞、分庫(kù)分表等方式重新架構(gòu),而且這種方式如果要做的徹底棉安,需要花費(fèi)大量人力物
    力底扳。可能需要部署很多個(gè)服務(wù)器贡耽。
    問題4:
    持續(xù)的軟件版本發(fā)布/測(cè)試項(xiàng)目衷模。到線上環(huán)境的集成Docker 讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上蒲赂,便可以實(shí)現(xiàn)虛擬化阱冶。Docker改變了虛擬化的方式,使開發(fā)者可以直接將自己的成果放入Docker中進(jìn)行管理滥嘴。方便快捷已經(jīng)是 Docker的最大優(yōu)勢(shì)木蹬,過去需要用數(shù)天乃至數(shù)周的 任務(wù),在Docker容器的處理下若皱,只需要數(shù)秒就能完成镊叁。
  • 避免選擇恐懼癥: 如果你有選擇恐懼癥尘颓,還是資深患者。Docker 幫你 打包你的糾結(jié)晦譬!比如 Docker 鏡像疤苹;
    Docker 鏡像中包含了運(yùn)行環(huán)境和配置,所以 Docker 可以簡(jiǎn)化部署多種應(yīng)用實(shí)例工作敛腌。比如 Web 應(yīng)用卧土、后臺(tái)應(yīng)用、數(shù)據(jù)庫(kù)應(yīng)用像樊、大數(shù)據(jù)應(yīng)用比如 Hadoop 集群尤莺、消息隊(duì)列等等都可以打包成一個(gè)鏡像部署。
  • 節(jié)省開支 一方面凶硅,云計(jì)算時(shí)代到來缝裁,使開發(fā)者不必為了追求效果而配置高額的硬件,Docker 改變了高性能必然高價(jià)格的思維定勢(shì)足绅。Docker 與云的結(jié)合捷绑,讓云空間得到更充分的利用。不僅解決了硬件管理的問題氢妈,也改變了虛擬化的方式粹污。
  • 持續(xù)交付和部署
    對(duì)開發(fā)和運(yùn)維(DevOps)人員來說,最希望的就是一次創(chuàng)建或配置首量,可以在任意地方正常運(yùn)行壮吩。使用 Docker 可以通過定制應(yīng)用鏡像來實(shí)現(xiàn)持續(xù)集成、持續(xù)交付加缘、部署鸭叙。開發(fā)人員可以通過 Dockerfile 來進(jìn)行鏡像構(gòu)建,并結(jié)合 持續(xù)集成(Continuous Integration) 系統(tǒng)進(jìn)行集成測(cè)試拣宏,而運(yùn)維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像沈贝,甚至結(jié)合 持續(xù)部署(Continuous Delivery/Deployment) 系統(tǒng)進(jìn)行自動(dòng)部署。而且使用 Dockerfile 使鏡像構(gòu)建透明化勋乾,不僅僅開發(fā)團(tuán)隊(duì)可以理解應(yīng)用運(yùn)行環(huán)境宋下,也方便運(yùn)維團(tuán)隊(duì)理解應(yīng)用運(yùn)行所需條件,幫助更好的生產(chǎn)環(huán)境中部署該鏡像
  • 更輕松的遷移
    由于 Docker 確保了執(zhí)行環(huán)境的一致性辑莫,使得應(yīng)用的遷移更加容易学歧。Docker 可以在很多平臺(tái)上運(yùn)行,無論是物理機(jī)各吨、虛擬機(jī)枝笨、公有云、私有云,甚至是筆記本伺帘,其運(yùn)行結(jié)果是一致的昭躺。因此用戶可以很輕易的將在一個(gè)平臺(tái)上運(yùn)行的應(yīng)用,遷移到另一個(gè)平臺(tái)上伪嫁,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運(yùn)行的情況

3领炫、與虛擬機(jī)的對(duì)比

  1. 實(shí)現(xiàn)原理技術(shù)不同 虛擬機(jī)是?來進(jìn)?硬件資源劃分的完美解決?案,利?的是硬件虛擬化技術(shù)张咳,如此VT-x 帝洪、
    AMD-V會(huì)通 過?個(gè) hypervisor 層來實(shí)現(xiàn)對(duì)資源的徹底隔離。 而容器則是操作系統(tǒng)級(jí)別的虛擬化脚猾,利?的是內(nèi)核的 Cgroup 和 Namespace 特性葱峡,此功能通過軟件 來實(shí)現(xiàn),僅僅是進(jìn)程本身就可以實(shí)現(xiàn)互相隔離龙助,不需要任何輔
    助砰奕。

  2. 使?資源??不同 Docker 容器與主機(jī)共享操作系統(tǒng)內(nèi)核,不同的容器之間可以共享部分系統(tǒng)資源提鸟,因此更加
    輕量級(jí)军援, 消耗的資源更少。 虛擬機(jī)會(huì)獨(dú)占分配給??的資源称勋,不存在資源共享胸哥,各個(gè)虛擬機(jī)之間近乎完全隔
    離,更加重量級(jí)赡鲜,也 會(huì)消耗更多的資源空厌。

  3. 應(yīng)?場(chǎng)景不同 若需要資源的完全隔離并且不考慮資源的消耗,可以使用虛擬機(jī)银酬。 若是想隔離進(jìn)程并且需要運(yùn)
    行大量進(jìn)程實(shí)例嘲更,應(yīng)該選擇 Docker 容器。

4揩瞪、Docker中三個(gè)重要概念

  • 倉(cāng)庫(kù):Docker 倉(cāng)庫(kù)用來保存鏡像哮内,可以理解為代碼控制中的代碼倉(cāng)庫(kù)。
  • 鏡像:Docker 鏡像是用于創(chuàng)建 Docker 容器的模板壮韭,類似于Java中的概念。
  • 容器:是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用纹因。通過鏡像創(chuàng)建生成喷屋,類似于Java中的對(duì)象概念。

二瞭恰、安裝Docker

docker安裝的官方文檔是:https://docs.docker.com/engine/install/屯曹。docker現(xiàn)在支持Linux、Windows與Mac。由于我們使用的是CentOS恶耽,所以這里只講在CentOS下安裝docker的方式

1密任、系統(tǒng)需求

CentOS版本必須7+

2、安裝前置環(huán)境

yum install -y yum-utils device-mapper-persistent-data lvm2

3偷俭、設(shè)置docker-ce版安裝源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

4浪讳、安裝docker

yum -y install docker-ce

5、啟動(dòng)/停止docker

systemctl start/stop docker

6涌萤、基于阿里云配置鏡像加速

去阿里云注冊(cè)一個(gè)賬號(hào)然后登錄淹遵,選擇容器鏡像服務(wù)->鏡像加速器,按照官方文檔修改配置文件即可 负溪。就是給/etc/docker/daemon.json這個(gè)文件增加源透揣。

操作完成之后,重啟docker

三川抡、Docker的基本命令

1辐真、鏡像相關(guān)的命令

1.1 搜索鏡像

docker search [鏡像名稱]

參數(shù)介紹:

-f, --filter 根據(jù)提供的條件過濾器輸出
--format 用Go模板打印出漂亮的搜索結(jié)果
--limit [n] 搜索結(jié)果的最大數(shù)量(默認(rèn)值為25)
--no-trunc 不要截?cái)噍敵?/p>

不過更加常用的是去https://hub.docker.com/這個(gè)網(wǎng)站搜索。

1.2 拉取鏡像

拉取鏡像類似從maven倉(cāng)庫(kù)中下載jar包崖堤。

docker pull [鏡像名稱][:標(biāo)簽]

注意:

拉取鏡像時(shí)如果沒有顯示的指定tag標(biāo)簽侍咱,默認(rèn)會(huì)拉取latest標(biāo)簽的版本鏡像

1.3 查看本地鏡像

docker images

參數(shù)介紹:

-q 只顯示鏡像唯一的標(biāo)識(shí)信息

1.4 刪除鏡像
docker rmi [鏡像名稱:tag]/[鏡像ID]

參數(shù)介紹:

-f 強(qiáng)制刪除鏡像

后面所有用到名稱:tag的地方都可以用id代替,反過來也一樣

2倘感、容器相關(guān)的命令

2.1 根據(jù)鏡像運(yùn)行容器
docker run [鏡像名稱][:tag]

參數(shù)介紹:

-i 保持和 docker 容器內(nèi)的交互
-t 為容器的標(biāo)準(zhǔn)輸入放坏,虛擬一個(gè)tty
-d 后臺(tái)運(yùn)行容器
--rm 容器在啟動(dòng)后,執(zhí)行完成命令或程序后就銷毀(不可于 -d 一起使用)
--name 給容器起一個(gè)自定義名稱
--restart docker 1.12 新增加的參數(shù)老玛,用來指定容器的重啟策略淤年, 當(dāng)前提供的策略包括:
no 默認(rèn)值,如果容器掛掉不自動(dòng)重啟蜡豹。
on-failure麸粮,若容器的退出狀態(tài)非0,則docker自動(dòng)重啟容器,還可以指定重啟次數(shù)
always镜廉,只要容器退出弄诲,則docker將自動(dòng)重啟容器
-p 將宿主機(jī)中的某個(gè)端口映射到容器中的某個(gè)端口上
-e 動(dòng)態(tài)設(shè)置容器的運(yùn)行環(huán)境變量

注意:如果run的鏡像在本地不存在,就會(huì)自動(dòng)的進(jìn)行拉取

比較常用的參數(shù)是-d --name -p

2.2 查看容器
docker ps

參數(shù)介紹:

-a 查看所有容器(默認(rèn)不查詢停止的容器)
-q 只查詢?nèi)萜鞯膇d

2.3 容器啟動(dòng)/停止/重啟
docker start/stop/restart 容器名稱
2.4 查看容器的元數(shù)據(jù)(容器的詳細(xì)信息)
docker inspect 容器名稱
2.5 刪除容器
docker rm 容器名稱

參數(shù)介紹:

-f 表示強(qiáng)制刪除一個(gè)容器(默認(rèn)不能刪除一個(gè)運(yùn)行中的容器)

2.6 進(jìn)入容器中
docker exec [option] 容器名稱 [args]

參數(shù)介紹:

-i 保持和 docker 容器內(nèi)的交互
-t 為容器的標(biāo)準(zhǔn)輸入娇唯,虛擬一個(gè)tty
-w 指定進(jìn)入容器后的工作路徑

args:表示進(jìn)入容器后執(zhí)行的命令齐遵,如果需要和容器進(jìn)行交互式訪問,需要配置參數(shù)為-it塔插,并且命令設(shè)置為bash(表示通過命令行的方式交互訪問容器)

注意:

該命令只能進(jìn)入到運(yùn)行中的容器

一般使用的方式是:docker exec -it 容器名稱 bash

2.7 查看容器運(yùn)行日志
docker logs 容器名稱

參數(shù)介紹:

--tail n 選項(xiàng)可以指定查看最后n條日志
-t 選項(xiàng)則可以對(duì)日志條目附加時(shí)間戳梗摇。
--until 顯示在某個(gè)時(shí)間戳(例如:2018-05-25T 13:23:37)之前的日志,還可以相對(duì)時(shí)間(例如:42m 42 minutes)
-f 實(shí)時(shí)打印日志內(nèi)容

2.8 宿主機(jī)和容器間的數(shù)據(jù)拷貝
docker cp [OPTIONS] 容器名稱:容器內(nèi)路徑 宿主機(jī)路徑 
docker cp [OPTIONS] 宿主機(jī)路徑 容器名稱:容器內(nèi)路徑

注意:
1想许、復(fù)制文件夾不需要添加任何參數(shù)(和Linux的命令有區(qū)別)
2伶授、無論需要從哪兒拷貝到哪里断序,命令都是在宿主機(jī)執(zhí)行

四、容器數(shù)據(jù)卷

1糜烹、 什么是容器數(shù)據(jù)卷违诗?

數(shù)據(jù)卷存在于宿主機(jī)中,獨(dú)立于容器疮蹦,和容器的生命周期是分離的
數(shù)據(jù)卷可以目錄也可以是文件
容器可以利用數(shù)據(jù)卷與宿主機(jī)進(jìn)行數(shù)據(jù)共享诸迟,實(shí)現(xiàn)了容器間的數(shù)據(jù)共享和交換

2、 容器數(shù)據(jù)卷的特點(diǎn)

1挚币、容器啟動(dòng)時(shí)初始化數(shù)據(jù)卷亮蒋,如果容器使用的鏡像包含了數(shù)據(jù),這些數(shù)據(jù)也會(huì)拷貝到數(shù)據(jù)卷中
2妆毕、對(duì) 數(shù)據(jù)卷 的修改會(huì)立馬生效
3慎玖、數(shù)據(jù)卷的變化不會(huì)影響鏡像的更新
4、數(shù)據(jù)卷是宿主機(jī)中的一個(gè)目錄

3笛粘、 數(shù)據(jù)卷的運(yùn)用場(chǎng)景

1趁怔、在多個(gè)運(yùn)行容器之間共享數(shù)據(jù)。如果您沒有明確創(chuàng)建它薪前,則會(huì)在第一次將其裝入容器時(shí)創(chuàng)建卷润努。當(dāng)該容器停止或被移除時(shí),該卷仍然存在示括。多個(gè)容器可以同時(shí)安裝相同的卷铺浇,無論是讀寫還是只讀。僅當(dāng)您明確刪除卷時(shí)才會(huì)刪除卷

2垛膝、當(dāng)您想要將容器的數(shù)據(jù)存儲(chǔ)在遠(yuǎn)程主機(jī)或云提供商上而不是本地時(shí)

3鳍侣、當(dāng)您需要備份,還原或?qū)?shù)據(jù)從一臺(tái)Docker主機(jī)遷移到另一臺(tái)時(shí)吼拥,卷是更好的選擇倚聚。您可以停止容器,然后備份卷的目錄

4凿可、數(shù)據(jù)卷的相關(guān)命令

4.1 創(chuàng)建容器數(shù)據(jù)卷
docker volume create 數(shù)據(jù)卷名稱

注意

容器卷默認(rèn)保存在宿主機(jī)的/var/lib/docker/volumes路徑下

4.2 創(chuàng)建容器時(shí)指定數(shù)據(jù)卷
docker run -it 
    --mount source=數(shù)據(jù)卷名稱,target=容器中的掛載路徑,type=volume 
    --name 容器別名 鏡像名稱

參數(shù)介紹:

source 指定宿主機(jī)中數(shù)據(jù)卷的名稱
target 指定容器中對(duì)應(yīng)的掛載路徑
type 指定為數(shù)據(jù)卷的方式掛載惑折,還可以選擇bind、tmpfs枯跑,默認(rèn)為volume

注意:

1惨驶、如果掛載一個(gè)空的數(shù)據(jù)卷到容器中的一個(gè)非空目錄中,那么這個(gè)目錄下的文件會(huì)被復(fù)制到數(shù)據(jù)卷中
2敛助、如果掛載一個(gè)非空的數(shù)據(jù)卷到容器中的一個(gè)目錄中敞咧,那么容器中的目錄中會(huì)顯示數(shù)據(jù)卷中的數(shù)據(jù)。如果原來容器中的目錄中有數(shù)據(jù)辜腺,那么這些原始數(shù)據(jù)會(huì)被隱藏掉

此外還有一種簡(jiǎn)寫方式:

docker run  ... [-v 宿主機(jī)數(shù)據(jù)卷:docker容器路徑:ro] []...

注意:

1休建、通過這種方式可以任意指定宿主機(jī)的數(shù)據(jù)卷位置
2、如果隨意指定數(shù)據(jù)卷的位置评疗,容器中對(duì)應(yīng)路徑的文件就不會(huì)復(fù)制到宿主機(jī)的數(shù)據(jù)卷中测砂,而是全部被清空
3、:ro表示以只讀的方式掛載容器卷百匆,不寫再表示以讀寫的方式掛載
4砌些、可以通過-v連續(xù)設(shè)置多個(gè)容器卷路徑

總結(jié):

數(shù)據(jù)卷未顯示聲明路徑(默認(rèn)在/var/lib/docker/volumes下)

1、數(shù)據(jù)卷為空加匈,對(duì)應(yīng)的容器路徑有數(shù)據(jù)存璃,則容器中的數(shù)據(jù)直接同步到數(shù)據(jù)卷中
2、數(shù)據(jù)卷有數(shù)據(jù)雕拼,對(duì)應(yīng)的容器路徑不存在纵东,則啟動(dòng)容器時(shí),自動(dòng)創(chuàng)建該容器路徑啥寇,并且將數(shù)據(jù)卷的數(shù)據(jù)同步到該路徑下
3偎球、數(shù)據(jù)卷有數(shù)據(jù),對(duì)應(yīng)的容器路徑也有數(shù)據(jù)(數(shù)據(jù)不同)辑甜,會(huì)把數(shù)據(jù)卷中的數(shù)據(jù)同步到容器路徑中衰絮,容器路徑中的文件會(huì)被隱藏(宿主機(jī) 覆蓋 容器)

如果宿主機(jī)的數(shù)據(jù)卷為空,容器覆蓋宿主機(jī)磷醋,如果數(shù)據(jù)卷不為空猫牡,則宿主機(jī)覆蓋容器

數(shù)據(jù)卷聲明指定路徑

1、數(shù)據(jù)卷為空邓线,對(duì)應(yīng)的容器路徑有數(shù)據(jù)淌友,則直接將容器路徑中的數(shù)據(jù)隱藏
2诱建、數(shù)據(jù)卷有數(shù)據(jù)环形,對(duì)應(yīng)的容器路徑不存在,則啟動(dòng)容器時(shí)膨俐,自動(dòng)創(chuàng)建該容器路徑缩歪,并且將數(shù)據(jù)卷的數(shù)據(jù)同步到該路徑下
3归薛、數(shù)據(jù)卷有數(shù)據(jù),對(duì)應(yīng)的容器路徑也有數(shù)據(jù)(數(shù)據(jù)不同)匪蝙,會(huì)把數(shù)據(jù)卷中的數(shù)據(jù)同步到容器路徑中主籍,容器路徑中的文件會(huì)被隱藏(宿主機(jī) 覆蓋 容器)

無論情況如何,永遠(yuǎn)是宿主機(jī) 覆蓋 容器路徑

數(shù)據(jù)卷是文件的情況

1逛球、數(shù)據(jù)卷指定一個(gè)文件千元,對(duì)應(yīng)的容器文件不存在,直接將數(shù)據(jù)卷文件覆蓋到容器中
2颤绕、數(shù)據(jù)卷指定的文件不存在幸海,容器的文件存在祟身,啟動(dòng)容器會(huì)報(bào)錯(cuò)

如果需要綁定文件,則必須保證宿主機(jī)的數(shù)據(jù)卷中文件必須存在

五物独、Docker的應(yīng)用

1袜硫、使用docker安裝MySQL

1.1 拉取mysql的鏡像
docker pull mysql:5.7
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配置文件到宿主機(jī)

第三行:掛載mysql日志文件到宿主機(jī)

第四行:掛載mysql的數(shù)據(jù)路徑到宿主機(jī)

第五行:將容器中3306端口映射到宿主機(jī)的3306端口上

第六方:設(shè)置MySQL的root賬號(hào)密碼為root

設(shè)置數(shù)據(jù)庫(kù)編碼

進(jìn)入~/mysql/conf中,創(chuàng)建一個(gè)文件my.cnf挡篓,填寫如下內(nèi)容:

[mysqld]
character-set-server=utf8

重啟mysql容器

2婉陷、 使用docker安裝tomcat

2.1 拉取tomcat的鏡像
docker pull tomcat:8
2.2 運(yùn)行tomcat容器
docker run -d 
    --name tomcat 
    -p 8080:8080 
    -v ~/tomcat/webapps:/usr/local/tomcat/webapps  
    tomcat:8
2.3 進(jìn)入容器中進(jìn)行相關(guān)拷貝
docker exec -it tomcat bash

cp -r webapps.dist/* webapps

注意:

docker鏡像tomcat8之后容器中webapps中沒有任何內(nèi)容,需要將歡迎頁(yè)導(dǎo)入

2.4 將自定義工程部署到tomcat中

1官研、使用maven命令或者工具將自定義工程打包
2秽澳、到工程的target目錄下找到打的war包
3、將war包拷貝到宿主機(jī)的tomcat數(shù)據(jù)卷中
4戏羽、重啟tomcat容器 docker restart tomcat

六担神、Docker鏡像的制作與管理

1、 什么是Dockerfile蛛壳?

Dockerfile簡(jiǎn)單來說就是docker鏡像的描述文件杏瞻,最基礎(chǔ)原始的鏡像文件都是通過dockerfile文件構(gòu)建而來

2、 Dockerfile模板指令介紹

FROM:指定基礎(chǔ)鏡像衙荐,必備的指令捞挥,并且必須是第一條指令。

MAINTAINER:指明該鏡像的維護(hù)者和點(diǎn)子郵件忧吟。
比如:MAINTAINER xxxx "xxxxx@qq.com"

ENV:設(shè)置環(huán)境變量砌函。
比如:EVN key1=value1 key2=value2...

RUN:在新鏡像內(nèi)部執(zhí)行的命令,比如安裝一些軟件溜族、配置一些基礎(chǔ)環(huán)境讹俊,可使用\來?yè)Q行。
比如:RUN yum install -y mysql-server

COPY:將主機(jī)的文件復(fù)制到鏡像文件中煌抒,如果目標(biāo)位置不存在會(huì)自動(dòng)創(chuàng)建仍劈。
比如:COPY application.yml /etc/resources

ADD:和COPY一樣,但是ADD會(huì)加上解壓操作

EXPOSE:暴露鏡像的端口供主機(jī)做映射寡壮,可以暴露多個(gè)端口贩疙。
比如:EXPOSE 8080

WORKDIR:在構(gòu)建鏡像時(shí),指定鏡像的工作目錄况既,之后的命令都是基于此工作目錄这溅,如果不存在,則會(huì)創(chuàng)建目錄棒仍,而且在進(jìn)入容器時(shí)悲靴,會(huì)默認(rèn)定位到該路徑下。
比如:WORKDIR /usr/local

VOLUME:用來向基礎(chǔ)鏡像中添加數(shù)據(jù)卷
比如 VOLUME /root/mydata /root/condata

CMD:容器啟動(dòng)時(shí)需要執(zhí)行的命令莫其。
比如 CMD /bin/bash

3癞尚、 案例:使用Dockerfile構(gòu)建自定義工程的運(yùn)行鏡像

3.1 準(zhǔn)備好Dockerfile文件以及需要部署的工程war包
3.2 Dockerfile文件內(nèi)容
FROM tomcat:8 
WORKDIR /usr/local/tomcat
COPY test.war ./webapps
EXPOSE 8080 
CMD ["catalina.sh", "run"]

解釋:

第一行:該鏡像時(shí)基于tomcat:8鏡像構(gòu)建

第二行:設(shè)置當(dāng)前基礎(chǔ)路徑耸三,也是后續(xù)命令的相對(duì)路徑

第三行:將工程war包復(fù)制到tomcat的webapps路徑下

第四方:對(duì)外暴露8080端口,也就是tomcat訪問路徑

第五行:設(shè)置容器啟動(dòng)時(shí)命令浇揩,即啟動(dòng)tomcat

3.3 通過Dockerfile構(gòu)建鏡像

執(zhí)行命令

docker build -f ./Dockerfile -t mytest:v1 .

解釋:

-f 用來指定Dockerfile模板文件
-t 用來指定自定義鏡像的名稱以及tag
最后的.表示當(dāng)前路徑

4吕晌、 將自定義鏡像推送至鏡像中心(私服、阿里云等临燃,這里以阿里云舉例)

登錄阿里云,并且選擇容器鏡像服務(wù)

創(chuàng)建容器倉(cāng)庫(kù)

登錄阿里云的倉(cāng)庫(kù)并且通過命令推送鏡像到阿里云

docker login --username=賬號(hào) registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[鏡像版本號(hào)]
docker push registry.cn-hangzhou.aliyuncs.com/ken-hub/myhub:[鏡像版本號(hào)]

七烙心、Docker -Compose

1膜廊、 什么是Docker-compose

Compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。通過 Compose可以使用 YML 文件來配置應(yīng)用程序需要的所有服務(wù)淫茵。然后爪瓜,使用一個(gè)命令,就可以從 YML 文件配置中創(chuàng)建并啟動(dòng)所有服務(wù)

2匙瘪、 Docker-Compose安裝

前置條件:安裝好Docker

下載docker-compose二進(jìn)制文件到服務(wù)器指定目錄

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

執(zhí)行授權(quán)操作

sudo chmod +x /usr/local/bin/docker-compose

測(cè)試

docker-compose --version

3铆铆、 Docker-Compose模板文件

3.1 什么是模板文件?

模板文件是使用 Compose 的核心丹喻,涉及到的指令關(guān)鍵字也比較多薄货。但是這里面大部分指令跟 docker run 相關(guān)參數(shù)的含義都是類似的。

默認(rèn)的模板文件名稱為 docker-compose.yml 碍论,格式為 YAML 格式谅猾。

3.2 docker-compose模板基本格式案例
version: "3.1" 
services: 
    webapp:
        image: examples/web
        ports:
            - 80:80
        volumes:
            - /data
3.3 docker-compose模板文件常用指令

image:指定為鏡像名稱或鏡像 ID
ports:設(shè)置暴露端口,容器端口 (HOST:CONTAINER) 格式
volumes:數(shù)據(jù)卷所掛載路徑設(shè)置
command:覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令
container_name:指定容器名稱
environment:設(shè)置環(huán)境變量
build:指定 Dockerfile 所在文件夾的路徑

3.4 docker-compose基本命令

創(chuàng)建并運(yùn)行容器

docker-compose up -d

參數(shù):

-d 表示后臺(tái)運(yùn)行

啟動(dòng)容器

 docker-compose start

停止容器

docker-compose stop

停止并移除容器

docker-compose down

注意:命令必須在docker-compose.yml文件所在位置執(zhí)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳍悠,一起剝皮案震驚了整個(gè)濱河市税娜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌藏研,老刑警劉巖敬矩,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蠢挡,居然都是意外死亡弧岳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門袒哥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缩筛,“玉大人,你說我怎么就攤上這事堡称∠古祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵却紧,是天一觀的道長(zhǎng)桐臊。 經(jīng)常有香客問我胎撤,道長(zhǎng),這世上最難降的妖魔是什么断凶? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任伤提,我火速辦了婚禮,結(jié)果婚禮上认烁,老公的妹妹穿的比我還像新娘肿男。我一直安慰自己,他們只是感情好却嗡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布舶沛。 她就那樣靜靜地躺著,像睡著了一般窗价。 火紅的嫁衣襯著肌膚如雪如庭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天撼港,我揣著相機(jī)與錄音坪它,去河邊找鬼。 笑死帝牡,一個(gè)胖子當(dāng)著我的面吹牛往毡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播否灾,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼卖擅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了墨技?” 一聲冷哼從身側(cè)響起惩阶,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扣汪,沒想到半個(gè)月后断楷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崭别,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年冬筒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茅主。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舞痰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诀姚,到底是詐尸還是另有隱情响牛,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站呀打,受9級(jí)特大地震影響矢赁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贬丛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一撩银、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豺憔,春花似錦额获、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至暮屡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毅桃,已是汗流浹背褒纲。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钥飞,地道東北人莺掠。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像读宙,于是被迫代替她去往敵國(guó)和親彻秆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355