Docker概念
Docker
是一個開源的應用容器引擎,它是基於Go
語言並遵從Apache2.0
協議開源。Docker
可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的linux
機器上,也可以實現虛擬化。通過容器可以實現方便快速並且與平臺解耦的自動化部署方式,無論你部署時的環境如何,容器中的應用程序都會運行在同一種環境下。並且它是完全使用沙箱機制,相互之間是隔離的,更重要的是容器性能開銷極低。
Docker 作爲輕量級虛擬化技術,擁有持續集成、版本控制、可移植性、隔離性和安全性等優勢。
Docker
從17.03
版本之後分爲CE(Community Edition:社區版)和EE(Enterprise Edition:企業版)
docker是一種容器技術,它主要是用來解決軟件跨環境遷移的問題
安裝Docker
Docker
可以運行在Mac
, Windows
, linux
等操作系統上
以Mac
爲例
使用Homebrew安裝
brew install --cask docker
桌面版安裝
除了使用終端外,它還可以使用桌面版,操作更方便
如果需要手動下載,請點擊以下 鏈接 下載 Docker Desktop for Mac。
檢測是否安裝成功
docker -v
嘗試運行一個Nginx服務器
docker run -d -p 80:80 --name webserver nginx
當本地沒找到nginx鏡像時,它會去遠程倉庫中拉取,服務運行後,就可以通過localhost
來訪問了
鏡像加速
如果在使用過程中發現拉取鏡像十分緩慢,那是因爲docker
服務器是在國外的,但我們可以通過配置docker
國內鏡像來進行加速
鏡像加速器 | 鏡像加速器地址 |
---|---|
Docker 中國官方鏡像 | https://registry.docker-cn.com |
DaoCloud 鏡像站 | http://f1361db2.m.daocloud.io |
Azure 中國鏡像 | https://dockerhub.azk8s.cn |
科大鏡像站 | https://docker.mirrors.ustc.edu.cn |
阿里雲 | https://ud6340vz.mirror.aliyuncs.com |
七牛雲 | https://reg-mirror.qiniu.com |
網易雲 | https://hub-mirror.c.163.com |
騰訊雲 | https://mirror.ccs.tencentyun.com |
在任務欄點擊 Docker Desktop
應用圖標 -> Settings...
,在左側導航菜單選擇 Docker Engine
,在右側像下邊一樣編輯 json 文件。
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com"
]
}
修改完成之後,點擊 Apply & restart
按鈕,Docker 就會重啓並應用配置的鏡像地址了。
配置完可以執行docker info
檢查加速器是否生效
docker info
Docker三要素
鏡像(image)
Docker 鏡像 是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像 不包含 任何動態數據,其內容在構建之後也不會被改變。
容器(container)
鏡像(Image
)和容器(Container
)的關係,就像是面向對象程序設計中的 類
和 實例
一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啓動、停止、刪除、暫停等。
簡單理解就是容器是鏡像的一個運行實例。當我們運行一個鏡像,就創建了一個容器。
倉庫(repository)
鏡像構建完成後,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry
就是這樣的服務。
使用鏡像
拉取鏡像
在Docker Hub 上有大量的高質量的鏡像可以用,我們可以使用docker pull
從鏡像倉庫中拉取對應的鏡像。
格式爲:
docker pull [選項] [docker Registry 地址[:端口號]/]倉庫名[:標籤]
具體的選項可以通過 docker pull --help
命令看到,這裏我們說一下鏡像名稱的格式。
- Docker 鏡像倉庫地址:地址的格式一般是
<域名/IP>[:端口號]
。默認地址是 Docker Hub(docker.io
)。 - 倉庫名:這裏的倉庫名是兩段式名稱,即
<用戶名>/<軟件名>
。對於 Docker Hub,如果不給出用戶名,則默認爲library
,也就是官方鏡像。
比如拉取一個node鏡像:
docker pull node:18-alpine
這裏我們拉取鏡像的時候只是給出了鏡像名稱(倉庫名+標籤)也就是node:18-alpine
,並沒有給出Docker
鏡像的倉庫地址,所以它會從默認地址docker.io
拉取鏡像
從上圖我們可以看到docker pull
命令的輸出結果給出了鏡像的完整名稱,即: docker.io/library/node:18-alpine
。
查看鏡像
如果想要查看本地已經下載的鏡像,可以使用docker image ls
命令
列表包含了 倉庫名
、標籤
、鏡像 ID
、創建時間
以及 所佔用的空間
。
當然也可以在docker
桌面端中直接查看:
刪除鏡像
如果想要刪除本地鏡像,可以使用docker image rm
命令
格式爲:
docker image rm [選項] <鏡像1> [<鏡像2>...]
其中,<鏡像>
可以是 鏡像短 ID
、鏡像長 ID
、鏡像名
或者 鏡像摘要
。
比如刪除我們剛拉取的node鏡像
docker image rm node:18-alpine
如果想批量刪除鏡像可以使用docker image ls -q
來配合使用docker image rm
比如,我們需要刪除所有倉庫名爲 redis
的鏡像:
docker image rm $(docker image ls -q redis)
或者刪除所有在 mongo:3.2
之前的鏡像:
docker image rm $(docker image ls -q -f before=mongo:3.2)
更多指令可通過docker image --help
查看
操作容器
查看容器
查看正在運行的容器:
docker ps
查看所有容器
docker ps -a
啓動容器
啓動容器一般有兩種情況:
- 基於鏡像新建一個容器並啓動
- 將已有的終止狀態(exited)的容器重新啓動
新建並啓動
使用的命令是docker run
docker run -it node
參數說明:
-i
:交互式操作-t
:終端node
:node鏡像
啓動終止狀態的容器
首先查看所有的容器
docker ps -a
然後可以使用docker start
啓動一個停止的容器
docker start 7e7ff4af478f
重啓容器
docker restart a03b0445b82d
後臺運行
大部分情況下,我們都希望docker
是在後臺運行的,這裏可以通過-d
指定容器的運行模式
docker run -d node:latest
停止容器
停止容器命令如下
docker stop <容器 id>
先查看所有容器
再停止容器
docker stop 3c275da2f36d
進入容器
當我們使用-d
參數時,容器啓動會進入後臺,此時想要進入容器可以通過以下指令:
exec(推薦使用)
docker exec -it a03b0445b82d /bin/bash
注意: 如果從這個容器退出,容器不會停止,這就是爲什麼推薦大家使用 docker exec 的原因。
attach(不推薦使用)
docker attach a03b0445b82d
注意: 如果從這個容器退出,會導致容器的停止。
刪除容器
刪除容器可以使用docker rm
命令
docker rm a03b0445b82d
如果想要刪除所有終止狀態的容器可以使用以下指令:
docker container prune
小試牛刀(部署一個前端項目)
首先準備一個vue項目,在項目根路徑下添加Dockerfile
文件
編寫Dockerfile
# 指定node鏡像
FROM node:16-alpine as builder
# 指定工作目錄
WORKDIR /code
# 代碼複製到容器中
ADD . /code
# 安裝依賴
RUN npm install --registry=https://registry.npm.taobao.org
# 打包
RUN npm run build
# RUN ls
# 指定nginx鏡像
FROM nginx:latest
# 複製打包後的代碼到nginx容器中
COPY --from=builder /code/dist /usr/share/nginx/html
# 暴露端口
EXPOSE 80
打包鏡像
docker build -t web-nanjiu .
啓動容器
在鏡像打包完成之後,我們可以使用該鏡像來啓動一個容器
docker run -itd -p 0.0.0.0:9090:80 web-nanjiu
這裏的-p
表示將容器的端口映射到宿主機的端口,這裏的宿主機也就是我們本地了
前面的0.0.0.0:9090
表示宿主機端口
後面的80
表示容器的端口
啓動完我們直接使用http://localhost:9090/
進行訪問
當看到這個頁面時就代表docker
部署成功了
當然你也可以使用docker ps
查看此時正在運行的容器