專案背景
此專案是在已有專案基礎上,開發的一套相對獨立的系統。專案總體分為三部分,前端、中間應用服務、流媒體服務。前端技術選型為vue+elementui,中間應用服務為.net core webapi+mysql+redis,流媒體服務為第三方成熟應用。在專案開發完畢之後,起初部署方式為在虛機上統一部署,倒也方便直觀。但是對個人而言,一直關注著docker,但是一直沒有應用到生產環境,於是就藉此機會更新下部署模式,採用docker。關於docker的簡介就不必多說了,網上的介紹很多,但是想要詳細瞭解,建議參考官方文件。
docker架構
docker 包括三個基本概念,如下所示(採摘於菜鳥教程):
之所以有此介紹,是因為了解這幾個基本概念,在應用上會方便許多。
- 映象(Image):
- Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。
- 容器(Container):
- 映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
- 倉庫(Repository):
- 倉庫可看著一個程式碼控制中心,用來儲存映象。
詳細資訊自行百度
應用實戰
1. 安裝docker
博主所用主機為centos 7+,關於docker的部署,可參考官方文件
1. 解除安裝舊版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 安裝yum-utils
軟體包、設定倉庫
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3. 安裝DOCKER引擎
sudo yum install docker-ce docker-ce-cli containerd.io
4. 啟動docker
sudo systemctl start docker
5.通過執行hello-world
映像來驗證是否正確安裝了Docker Engine 。
sudo docker run hello-world
6.登陸docker
執行命令 sudo docker login
輸入賬號、密碼登陸成功即可。
2. 建立倉庫
倉庫就是存放映象的地方,博主所用倉庫為docker-hub。當然還有很多廠商提供,如果考慮企業化建設,也可以私有化搭建。 docker-hub官方地址
就像git一樣,自由建立私有倉庫。
3. 製作映象
本篇以前端專案為例,製作映象釋出到倉庫。
前端專案採用的vue,進入打包好的dist檔案中,建立Dockerfile檔案,編寫內容如下:
FROM nginx
WORKDIR /app
COPY . /dist
from nginx 指的是 依賴於nginx, workdir /app 指的是設定工作目錄 copy . /dist 指的是 將dist資料夾中的內容 copy到外部 dist資料夾
完畢之後,在dist資料夾,即dockerfile檔案所在資料夾,執行命令如下: docker build -t zy/bg:vmp-web .
建立映象。改命令意思是,製作一個隸屬於bg倉庫下的映象,並且為改映象打標籤為:vmp-web。 完畢之後,通過 docker images
檢視已有映象
按照我個人習慣,一個倉庫包含web、server等多個專案的映象。通過tag進行區分。
映象製作完畢後,可通過push命令將 映象推送到遠端倉庫,便於後續使用。docker push zy/bg:vmp-web
推送完畢後,便可以在docker-hub中看到。
映象製作完畢之後,便可以執行了。docker run --name vmp-web -p 80:80 -d zy/bg:vmp-web
-p 是進行埠對映,因為每一個容器就是一個沙盒,可以理解為一個精簡版的虛機,80(外):80(容器) 就是把容器80埠,對映到外部的80埠。-d 是保持後臺執行。--name 設定容器名稱。 至此,訪問地址就可以看到部署在容器內的應用了。
既然容器就是一臺精簡版的虛機,我們當然也可以進入他的檔案系統。
進入docker容器有如下四種方式
- docker attach
- SSH
- nsenter
- exec
在這裡前三種不是特別推薦使用,不方便且不適用於生產環境,推薦用exec的方式。exec命令相對簡單,操作方便適用生產。該命令必須適用於正在執行的容器,引數如下表所示:
引數 | 描述 |
---|---|
--detach , -d | 分離模式:在後臺執行命令 |
--detach-keys | 覆蓋分離容器的鍵序列 |
--env , -e | 設定環境變數 |
--interactive , -i | 即使沒有附加也保持STDIN 開啟 |
--privileged | 賦予命令擴充套件許可權 |
--tty , -t | 分配偽TTY |
--user , -u | 使用者名稱或UID |
--workdir , -w | 容器內的工作目錄 |
以我們剛才建立的vmp-web容器為例,我們想要修改容器內nginx的配置資訊,我們可以通過命令 docker exec -it vmp-web /bin/bash
進入容器,進入容器之後,就和平常操作linux幾乎一致了。通過vim nginx.conf
修改時,會提示命令無法找到,也是正常現象。因為該容器內只包含了程式執行的必須條件,並不包含vim。此時我們想要修改容器nginx.conf,可以通過從外部copy檔案的形式,也可以通過vim 直接修改。通過vim修改的時候,先在容器內安裝vim,通過命令apt-get install vim
進行安裝,但是會提示如下資訊:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
並不是命令有誤,輸入apt-get update
命令,這條命令的作用就是同步 /etc/apt/sources.list
和 /etc/apt/sources.list.d
中列出的源的索引。更新完畢後,再鍵入apt-get install vim
即可。此時容器內已正常安裝vim,可使用vim編輯nginx.conf檔案了。
但是很多時候我們想要直接從外部copy到容器內部,比如替換個檔案,可以採用docker cp
命令,該命令使用方式如下:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
從容器內部copy檔案到外部,從外部copy檔案到容器內部。
以剛才執行的vmp-web容器為例,想要將index.html copy到容器內部,docker cp index.html vmp-web:/
改命令即是將index.html 檔案複製到vmp-web容器內的根目錄。如果想要將此檔案從容器內複製到外部,可 通過 docker cp vmp-web:/index.html /index.html
命令,即將容器內index.html檔案複製到根目錄中。想要退出docker容器,輸入exit
命令即可。
至此,舉一反三,想要將專案應用上docker已經差不多了,但是docker遠不止這麼簡單,目前所介紹的也僅僅是應用基礎。
docker 常用命令介紹
命令 | 使用方式 | 說明 |
---|---|---|
login | docker login -p -u | 登陸docker倉庫 |
logout | docker logout | 退出 |
search | docker search nginx | 搜尋nginx映象 |
build | docker build -t zy/bg:vmp-web . | 構建bg映象,打標籤為vmp-web,其中zy 為個人docker使用者名稱 |
pull | docker pull nginx | 拉取nginx映象 |
push | docker push zy/bg:vmp-web | 將本地生成的映象推送到bg倉庫,並且打標籤為vmp-web |
images | docker images | 列出所有映象 |
tag | docker tag zy/bg:vmp-web vmp-webOld | 標記映象 |
rmi | docker rmi vmp-webOld | 刪除映象 |
run | docker run --name vmp-web -p 80:80 -d zy/bg:vmp-web | 選擇映象啟動容器 |
ps | docker ps | 列出正在執行的容器,docker ps -a 列出所有容器,包括已經停止的容器 |
start | docker start vmp-web | 啟動容器 |
stop | docker stop vmp-web | 停止容器 |
kill | docker kill vmp-web | 殺掉容器 |
rm | docker rm vmp-web | 刪除容器 |
exec | docker exec -it vmp-web /bin/bash | 進入容器內部 |
cp | docker cp index.html vmp-web:/ | 將index.html檔案複製到docker容器內部根目錄 |
更多命令請參考官方文件
在本篇中,博主大都以name:tag 的形式刪除、停止等操作映象、容器,當然可以以image id和container id的形式操作。並且在以id操作的時候,並不需要完全鍵入id,以前幾位形成唯一標識即可。
docker知識點還有很多,需要繼續探索。且描述有諸多不足,且請見諒。