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