一文帶你快速了解和使用Docker
Docker 的作用
這里以容器化發(fā)展歷程加上應(yīng)用部署為例子,對 Docker 的作用進(jìn)行說明。
在只有物理機(jī)的時候,大多數(shù)開發(fā)者或運(yùn)維人員在部署一個應(yīng)用時要做以下操作(以 java 應(yīng)用為例):搭建 java 環(huán)境、maven 環(huán)境、配置環(huán)境變量、打包、運(yùn)行。這樣有幾個問題:
- 部署慢:以上的過程都是需要手動操作,中間但凡那個環(huán)節(jié)出問題都需要花費(fèi)時間排查,而且每次部署都需要重復(fù)做同樣的操作。
- 成本高:一個外網(wǎng)的服務(wù)器費(fèi)用最起碼以萬為單位進(jìn)行采購,成本相對高。
- 資源浪費(fèi):如果應(yīng)用是計(jì)算密集型,那么對 cpu 要求會很高,對內(nèi)存、磁盤要求就不高,這樣一來,閑置的資源就會浪費(fèi)掉。
- 難于擴(kuò)展遷移:如果要將 windows 服務(wù)器的應(yīng)用遷移到 linux 服務(wù)器,一定會出現(xiàn)各種問題。
在虛擬化技術(shù)出現(xiàn)后,可以在物理機(jī)上開辟多個虛擬機(jī),對物理機(jī)的資源進(jìn)行了充分的使用,且虛擬機(jī)之間的資源是隔離的,可以部署多個應(yīng)用,也降低了成本。 但是虛擬機(jī)需要安裝操作系統(tǒng),同樣會造成資源浪費(fèi)。
為了解決虛擬機(jī)安裝操作系統(tǒng)帶來的資源浪費(fèi),容器化技術(shù)就誕生了,容器化可以理解成不用安裝操作系統(tǒng)的虛擬機(jī),如下圖,
這里的 Docker 就是容器化技術(shù)最典型的代表,其通過沙箱機(jī)制依賴主操作系統(tǒng),大大的節(jié)省了資源、降低成本。除此之外,在應(yīng)用部署上,Docker 容器本質(zhì)是包含了部署應(yīng)用所需的一切資源,包括操作系統(tǒng)依賴的其他組件或應(yīng)用、數(shù)據(jù)庫、配置等,這樣在任何的環(huán)境下進(jìn)行部署時將容器里的資源展開即可部署成功。
比如:我們現(xiàn)在使用 redis 服務(wù),我們不需要去下載redis安裝包、gcc等依賴組件等操作,只需要拉取 redis 鏡像運(yùn)行即可。
所以 Docker 的作用不僅僅是節(jié)省資源、降低成本,在應(yīng)用方面也做到了自動部署、應(yīng)用監(jiān)控的作用,更簡化了開發(fā)與運(yùn)維的溝通,讓軟件協(xié)作方式發(fā)生巨大變化。
Docker 安裝
這里基于 CentOS 7 進(jìn)行 Docker 安裝,Windows 和 MAC 安裝參考Docker 官網(wǎng)。
執(zhí)行以下命令進(jìn)行安裝
yum install -y yum-utils #設(shè)置倉庫地址 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin systemctl start docker
Docker 常用命令
拉取鏡像:docker pull 鏡像名:<tag>
。 可以通過配置鏡像加速器加快拉取鏡像的速度。
- 查看鏡像:docker images
- 啟動容器:docker run 鏡像名:<tag>
- 查看容器:docker ps
- 刪除容器:docker rm <-f> 容器id
- 刪除鏡像:docker rmi 鏡像名:<tag>
- 與容器交互:docker exec <-it> 容器id /bin/bash
容期間通信
一個宿主機(jī)上的容器默認(rèn)是可以互相通信的,但是每次啟動容器后ip會修改,避免因ip變動而修改配置,啟動容器時可以給容器命名,通過容器名稱通信。命令如下
docker run --name 容器名稱 鏡像名稱 --link 要通信的容器名稱 要通信的鏡像名稱
如果多個容器都需要互相通信,這種方式就會比較繁瑣了,此時可以通過創(chuàng)建一個網(wǎng)橋,需要通信的容器都綁定這個網(wǎng)橋即可。命令如下:
#創(chuàng)建網(wǎng)橋 docker network create -d bridge 網(wǎng)橋名稱 #綁定網(wǎng)橋 docker network connect 網(wǎng)橋名稱 容器名稱
Docker 數(shù)據(jù)卷
為避免容器中產(chǎn)生的數(shù)據(jù)丟失或者多個容器共享一份數(shù)據(jù),Docker 提供了2種數(shù)據(jù)掛載的方式:
掛載到宿主機(jī):宿主機(jī)開辟空間,容器內(nèi)部文件存儲在宿主機(jī)上,并訪問同一份文件。命令如下:
docker run --name 容器名稱 -v 宿主機(jī)目錄:容器目錄 鏡像名稱
掛載到共享容器:新建一個容器專門提供其他容器來存儲或共享數(shù)據(jù),命令如下:
#創(chuàng)建共享容器 docker create --name 容器名稱 -v 宿主機(jī)目錄:容器目錄 鏡像名稱 /bin/true #掛載到共享容器 docker run --name 容器名稱 --volumes-from 共享容器名稱 鏡像名稱
Dockerfile 構(gòu)建鏡像
當(dāng)需要自己創(chuàng)建一個鏡像時可以通過 Dockerfile 來構(gòu)建鏡像,然后上傳到鏡像倉庫(可以自建 Harbor 或者使用公網(wǎng)的),需要使用的直接拉取下來即可。構(gòu)建命令如下
docker build -t 機(jī)構(gòu)/鏡像名:<tag> dockerfile目錄
docker 會基于 Dockerfile 文件中的指令來構(gòu)建,具體指令如下:
FROM 鏡像名 #基準(zhǔn)鏡像,基于該鏡像構(gòu)建 MAINTAINER xxxxx #用來描述的 WORKDIR 工作目錄 #進(jìn)入容后設(shè)置工作目錄,相當(dāng)于cd /xxx/ ADD ooo /xxx #復(fù)制本地文件ooo到容器中的工作目錄 /xxx ADD ooo.tar.gz /xxx # 復(fù)制并解壓 ooo.tar.gz 到容器中的工作目錄 /xxx ENV XXX #設(shè)置環(huán)境常量,文件中可以以${XXX}方式進(jìn)行使用
運(yùn)行指令有 RUN、CMD、ENTRYPOINT,其區(qū)別為:
- RUN:Build 構(gòu)建容器時執(zhí)行
- CMD:容器啟動時執(zhí)行的默認(rèn)命令和參數(shù),如果容器啟動時有其他命令,則CMD不生效
- ENTRYPOINT:容器啟動時執(zhí)行的命令,只有最后一個ENTRYPOINT執(zhí)行
運(yùn)行指令有兩種聲明方式:
- Shell腳本方式:
RUN yum install xxx
- Exec函數(shù)方式(推薦此方式):
["yum","install","xxx"]
兩者的區(qū)別在于一個會創(chuàng)建子進(jìn)程執(zhí)行,一個會用新的進(jìn)程替換主進(jìn)程執(zhí)行。
Docker Compose 容器編排
在多個容器存在依賴,比如運(yùn)行應(yīng)用的容器依賴數(shù)據(jù)庫、Redis等多個容器都需要部署的情況下,為了減少部署時間,可以通過 Docker Compose 將這個應(yīng)用及其依賴的容器統(tǒng)一定義,達(dá)到一鍵部署效果,這個我們叫做容器編排。
在進(jìn)行容器編排時需要聲明 docker-compose.yml
文件定義各個容器以及依賴關(guān)系,然后執(zhí)行 docker-compose up -d
命令進(jìn)行容器啟動。下面提供一個 docker-compose.yml
示例:
version: '1.0' services: service1: # 容器名、可通過此進(jìn)行通信 build: service1 dockerfile目錄 restart: always # 容錯機(jī)制,當(dāng)容器宕機(jī)后自動重啟 environment: # 啟動容器時添加環(huán)境變量 環(huán)境變量: xxxx service1: build: service2 dockerfile目錄 depends_on: # 依賴某個容器,并可進(jìn)行通信 - service1 ports: # 端口映射 - '宿主機(jī)端口:容器端口' restart: always # 容錯機(jī)制,當(dāng)容器宕機(jī)后自動重啟
需要注意的是 Docker Compose只能單機(jī),能力有限。集群或者其他復(fù)雜場景k8s可以更好的滿足。
以上就是一文帶你快速了解和使用Docker的詳細(xì)內(nèi)容,更多關(guān)于了解和使用Docker的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker中Redis數(shù)據(jù)遷移到本地的實(shí)現(xiàn)
Redis數(shù)據(jù)庫之間的遷移是指將數(shù)據(jù)從一個Redis實(shí)例復(fù)制到另一個Redis實(shí)例的過程,本文主要介紹了Docker中Redis數(shù)據(jù)遷移到本地的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2025-04-04阿里云docker容器固定應(yīng)用到到某一個節(jié)點(diǎn)記錄
這篇文章主要介紹了阿里云docker容器固定應(yīng)用到到某一個節(jié)點(diǎn)記錄,需要的朋友可以參考下2018-05-05.Net8項(xiàng)目使用docker、docker-compose部署的圖文步驟
本文主要介紹了.Net8項(xiàng)目使用docker、docker-compose部署的圖文步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04docker可視化管理工具portainer忘記密碼重置教程的實(shí)現(xiàn)
本文主要介紹了docker可視化管理工具portainer忘記密碼重置教程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08Docker連接mongodb實(shí)現(xiàn)過程及代碼案例
這篇文章主要介紹了Docker連接mongodb實(shí)現(xiàn)過程及代碼案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09docker容器中布置靜態(tài)網(wǎng)站的實(shí)現(xiàn)
這篇文章主要介紹了docker容器中布置靜態(tài)網(wǎng)站的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Docker images導(dǎo)出和導(dǎo)入操作
這篇文章主要介紹了Docker images導(dǎo)出和導(dǎo)入操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03