本文檔通過(guò)對(duì)該官方案例進(jìn)行實(shí)踐,并對(duì)內(nèi)容總結(jié)。
01 Docker運(yùn)行
運(yùn)行容器的命令
docker run -d -p 80:80 docker/getting-started
參數(shù)介紹
-
-d(detached mode)容器在后臺(tái)運(yùn)行 -
-p 80:80(port)映射本機(jī)端口到容器的端口 -
docker/getting-started需要運(yùn)行的鏡像
上面的命令可以進(jìn)行縮寫
docker run -dp 80:80 docker/getting-started
Docker控制面板
安裝了Docker軟件后可以看到此頁(yè)面,該面板管理所有的容器,也可以使用命令行查看 docker ps
什么是容器
容器是一個(gè)獨(dú)立的進(jìn)程。
什么是鏡像
鏡像為容器提供運(yùn)行環(huán)境。
02 第一個(gè)應(yīng)用程序
Dockerfile
Dockerfile是一個(gè)腳本,用來(lái)創(chuàng)建一個(gè)容器鏡像。
Dockerfile應(yīng)用
創(chuàng)建一個(gè)dockerfile在項(xiàng)目的根目錄下。本項(xiàng)目運(yùn)行在node.js下,因此在package.json的同級(jí)目錄下創(chuàng)建Dockerfile(注意,此文件沒(méi)有后綴)
FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
在項(xiàng)目的根目錄下,使用下面命令創(chuàng)建一個(gè)Docker鏡像
docker build -t getting-started .
該命令會(huì)使用Dockerfile來(lái)創(chuàng)建鏡像。
接下來(lái)來(lái)分析Dockerfile文件的步驟
-
From從node鏡像開(kāi)始構(gòu)建項(xiàng)目,若沒(méi)有下載node鏡像,則自動(dòng)下載 - 鏡像下載完成后,復(fù)制項(xiàng)目到鏡像中
WORKDIR是指鏡像中的位置,COPY . .將當(dāng)前項(xiàng)目的文件,復(fù)制到鏡像中的WORKDIR下。并且安裝依賴. -
CMD命令則是第一次運(yùn)行容器的時(shí)候,默認(rèn)運(yùn)行的命令. - 最后,
-t對(duì)我們對(duì)鏡像進(jìn)行命名,命令最后一個(gè).是指在當(dāng)前目錄下尋找Dockerfile文件
FROM node:12-alpine // 從node鏡像中構(gòu)建我們的項(xiàng)目,如果沒(méi)有node鏡像,則系統(tǒng)會(huì)自動(dòng)下載node鏡像
WORKDIR /app // 鏡像中的目錄
COPY . . // 將當(dāng)前位置下的文件復(fù)制到 WORKDIR目錄下去
RUN yarn install --production // 安裝依賴
CMD ["node", "src/index.js"] // 初次運(yùn)行Docker默認(rèn)運(yùn)行的命令
03 更新項(xiàng)目
更新項(xiàng)目需要
- 重新build項(xiàng)目
- 使用run運(yùn)行項(xiàng)目
更新項(xiàng)目之前,需要先暫停之前運(yùn)行的項(xiàng)目(使用命令行或者Docker客戶端,這里使用命令行)
- 獲取id鏡像
docker ps
- 暫停鏡像
docker stop <the-container-id>
- 刪除鏡像
docker rm <the-container-id>
可以使用一個(gè)命令實(shí)現(xiàn) 暫停和刪除鏡像
docker rm -f <the-container-id>
04 分享你的鏡像
分享你的鏡像,首先需要在DockerHub創(chuàng)建一個(gè)倉(cāng)庫(kù)。
發(fā)布你的鏡像
- 在發(fā)布鏡像之前,需要在你的主機(jī)上登陸DockerHub賬號(hào)。
docker login -u Your-User-Name
- 然后使用
-t給你的鏡像一個(gè)新的名字
使用方法
docker tag old-container-name new-container-name
案例
docker tag getting-started YOUR-USER-NAME/getting-started
- 最后使用下面命令推送
docker push YOUR-USER-NAME/getting-started
05 數(shù)據(jù)持久化
不同容器之前的數(shù)據(jù)不互通,即使在同一個(gè)鏡像里面。
練習(xí)
docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
使用exec執(zhí)行容器里面命令
docker exec <container-id> cat /data.txt
在同一個(gè)鏡像中啟動(dòng)另一個(gè)容器
docker run -it ubuntu ls
-
-i暫時(shí)不知道作用 -
-t(terminal)分配終端 -
-it容器可以在終端運(yùn)行,不會(huì)立即停止。即我們可以在終端中訪問(wèn)容器環(huán)境。
Container Volumes
Volumes提供了將容器的特定文件系統(tǒng)路徑連接回主機(jī)的能力.如果容器中掛載了該目錄,容器中進(jìn)行修改,主機(jī)中也會(huì)進(jìn)行修改。
有兩種類型的Volumes。
- Bind mounts
- named volumes
named volumes
首先是命名一個(gè)Volume。命名Volume相當(dāng)于創(chuàng)建一桶數(shù)據(jù)。Docker保存到物理位置,我們只需要知道該Volume的名字即可。
創(chuàng)建一個(gè)Volume
docker volume create todo-db
使用-v將Volume綁定并掛載到App中
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
這里將todo-db掛載到/etc/todos中。
查看Volume存儲(chǔ)在本地的位置,使用下面命令
docker volume --help
? app docker volume inspect todo-db
[
{
"CreatedAt": "2020-09-18T09:10:57Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": {},
"Scope": "local"
}
]
? app
06 實(shí)時(shí)在容器里面更新項(xiàng)目
volumes有兩種類型
- Bind mounts
- named volumes
這兩種方式比較

開(kāi)始開(kāi)發(fā)者模式容器
開(kāi)發(fā)流程
- 掛載我們的源代碼到容器中
- 安裝所有依賴,包括開(kāi)發(fā)依賴
- 使用nodemon模式觀察文件變化
進(jìn)行開(kāi)發(fā)
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
node:12-alpine \
sh -c "yarn install && yarn run dev"
-
-dp 3000:3000在后臺(tái)運(yùn)行并且創(chuàng)建映射 -
-w /app設(shè)置工作目錄,容器一啟動(dòng)就自動(dòng)進(jìn)入到該目錄 -
-v "$(pwd):/app"(==bind mode==)掛載當(dāng)前代碼到容器的/app目錄下 -
node:12-alpine使用的鏡像。 -
sh -c "yarn install && yarn run dev"啟動(dòng)shell使用命令安裝依賴然后運(yùn)行該項(xiàng)目
使用docker logs -f <container-id>查看當(dāng)前的日志
當(dāng)開(kāi)發(fā)完成后,使用docker build -t xxxx構(gòu)建新的鏡像。
其他
- nodemon是什么
Nodemon是一個(gè)實(shí)用程序,它將監(jiān)視源中的任何更改并自動(dòng)重新啟動(dòng)服務(wù)器。 Nodemon不會(huì)對(duì)你的代碼產(chǎn)生額外的更改,它只是node命令的替代品。 因?yàn)楫?dāng)你修改源文件后,如果你用的是原來(lái)的node 則必須手動(dòng)重啟你的更改才會(huì)有效