初次使用Docker

本文檔通過(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文件的步驟

  1. From 從node鏡像開(kāi)始構(gòu)建項(xiàng)目,若沒(méi)有下載node鏡像,則自動(dòng)下載
  2. 鏡像下載完成后,復(fù)制項(xiàng)目到鏡像中WORKDIR是指鏡像中的位置,COPY . .將當(dāng)前項(xiàng)目的文件,復(fù)制到鏡像中的WORKDIR下。并且安裝依賴.
  3. CMD命令則是第一次運(yùn)行容器的時(shí)候,默認(rèn)運(yùn)行的命令.
  4. 最后,-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)目需要

  1. 重新build項(xiàng)目
  2. 使用run運(yùn)行項(xiàng)目

更新項(xiàng)目之前,需要先暫停之前運(yùn)行的項(xiàng)目(使用命令行或者Docker客戶端,這里使用命令行)

  1. 獲取id鏡像
docker ps
  1. 暫停鏡像
docker stop <the-container-id>
  1. 刪除鏡像
docker rm <the-container-id>

可以使用一個(gè)命令實(shí)現(xiàn) 暫停和刪除鏡像

docker rm -f <the-container-id>

04 分享你的鏡像

分享你的鏡像,首先需要在DockerHub創(chuàng)建一個(gè)倉(cāng)庫(kù)。

發(fā)布你的鏡像

  1. 在發(fā)布鏡像之前,需要在你的主機(jī)上登陸DockerHub賬號(hào)。
docker login -u Your-User-Name
  1. 然后使用-t給你的鏡像一個(gè)新的名字

使用方法

docker tag old-container-name new-container-name

案例

docker tag getting-started YOUR-USER-NAME/getting-started
  1. 最后使用下面命令推送
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

這兩種方式比較

UMPMi9

開(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)建新的鏡像。

其他

  1. 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ì)有效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容