一、常用指令
docker images
####查看當前鏡像列表;
docker rmi 鏡像ID或鏡像名 [-f]
####刪除指定鏡像,-f表示強制刪除;
docker pull 鏡像名[:版本號]
####從公共庫里拉取鏡像,不指定版本號則默認最新版本latset;
docker build -t 鏡像名 .
####注意最後有一個句號,表示依據當前目錄下的dockerfile創建鏡像,這一步容易報錯,可以執行下npm cache clean --force
####多試幾次,另外dockerfile的編寫下面再說
docker run -p 本機端口號:docker端口號 --name 容器名 -v 當前項目路徑:docker工作目錄 所在鏡像名
####在鏡像裏創建容器,指定端口映射,需要注意的是在window下"%cd%"表示當前目錄,$PWD無效
docker ps [-a]
####查詢啓動的容器列表,-a表示所有的容器列表
docker rm [-f] 容器ID或容器名稱
####刪除容器,-f表示強制刪除
docker stop/start/restart 容器ID或容器名稱
####停止/啓動/重啓 容器
docker exec -it 容器ID bash
####進入指定容器內部
apt-get update
####更新容器 ctrl+d 或exit 即可退出
install vim
####安裝vim編輯器,注意在此之前最好先執行一遍apt-get update
二、dockerfile
最好放在一個單獨的文件夾內,不然與其他文件混在一塊,在build時會把其他文件一併傳給docker引擎打包
####第一部分:基礎鏡像信息
#基於centos鏡像
FROM centos
####第二部分:維護人信息(新版本好像已經取消了)
#維護人的信息
MAINTAINER The CentOS Project <[email protected]>
####第三部分:鏡像操作命令隊列
#安裝httpd軟件包
RUN yum -y update
RUN yum -y install httpd
#開啓80端口
EXPOSE 80
#複製網站首頁文件至鏡像中web站點下
ADD index.html /var/www/html/index.html
#複製該腳本至鏡像中,並修改其權限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
####容器啓動時執行的命令隊列
#當啓動容器時執行的腳本文件 如果有多個CMD,最後一個會把前面的覆蓋掉
CMD ["/run.sh"]
常用指令:
from 基礎鏡像名[:版本號]
####指定依賴的基礎鏡像名
MAINTAINER 維護人信息
####備註維護人信息,更推薦使用 LABEL maintainer="維護人"
RUN ["yum", "install", "httpd"] ----exec模式
RUN yum install httpd ----shell模式
####構建鏡像時運行的Shell命令
CMD ["-C", "/start.sh"]
CMD ["/usr/sbin/sshd", "-D"]
CMD /usr/sbin/sshd -D
####啓動容器時運行的shell命令,如果有多個CMD,最後一個會把前面覆蓋掉
EXPOSE 端口號
####服務運行的docker端口,不一定是訪問時的,在啓動容器時可以再映射
ADD 當前項目路徑 docker路徑
COPY 當前項目路徑 docker路徑
####兩個都是拷貝文件或目錄到鏡像中,add會自動解壓,copy不會,這個路徑不必先創建,沒有會自動創建
WORKDIR 工作路徑
####指定docker工作目錄路徑,注意的是這個路徑必須是事先創建好的
三、VUE項目部署
分爲兩種方式吧。(注意下面部署跟上面這個dockerfile沒有關係哈)
一是我們先用npm build項目,然後把dist文件夾部署到docker上,這樣好像項目開發完的最終部署。
另一種是直接把項目部署到docker上,打包神馬的操作都在docker進行,其實是在docker裏進行了npm的操作。這樣部署完可以把鏡像push上去,然後team內pull,有利於統一環境的版本,但是問題也是有的,在本地代碼修改之後並不會立即響應到頁面,得手動啓用一下容器,有點卡蛋。
1.先說第一種方式,因爲部署的是打包好的(先npm run build),所以不需要依賴node了,直接配置個nginx鏡像就行了。
a.先獲取nginx鏡像
docker pull nginx
b.創建nginx config配置文件
在項目根目錄下創建nginx文件夾,該文件夾下新建文件default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
這個文件可以看到首頁的指向爲 /usr/share/nginx/html/index.html, 所以我們可以一會把構建出來的index.html文件和相關的靜態資源放到/usr/share/nginx/html目錄下。
還將上面node服務代理出去了。容器內部 ip 通過查看docker inspect containerID
c.啓動容器
docker run \
-p 8000:80 \
-d --name vuenginx \
--mount type=bind,source="%cd%"/vueclidemo/nginx,target=/etc/nginx/conf.d \
--mount type=bind,source="%cd%"/vueclidemo/dist,target=/usr/share/nginx/html \
nginx
命令太長可以用\換行。
-p 8000:80 是指把本地的8000端口映射到docker的80端口上;
-d 後臺運行
--name vuenginx 指定容器的名稱
--mount type=bind 沒明白乾啥的,後面的source表示當前項目的目錄,target表示docker的目錄
最後要跟上依賴容器的名稱。
到此第一種部署結束了,在本地瀏覽器中用8000端口訪問。
2.第二種方式,相對麻煩一些
a.先依賴於node鏡像創建一個鏡像,在項目根目錄下創建一個dockerfile
#基於 node:latest 鏡像而構建的
FROM node
#指定工作目錄
WORKDIR /usr/src/app
#COPY 指令將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置。
COPY package*.json ./
#安裝依賴
RUN npm install
#將所有文件copy到工作目錄
COPY . .
#聲明運行時容器提供服務端口
EXPOSE 8080
#指定默認的容器主進程的啓動命令
CMD [ "npm", "start" ]
b.build鏡像
在Dockerfile目錄運行下面的build命令, -t參數指定了創建好的鏡像的名稱:
docker build -t dockerdemo .
build成功後可以通過下面命令查詢你的鏡像列表:
docker images
c.啓動容器
docker run -v "%cd%":/usr/src/app -p 8088:8080 --name container-test dockerdemo
-v "%cd%":/usr/src/app 綁定掛載目錄
-p 8088:8080 把本地端口8088映射到docker的8080
--name container-test 指定容器的名字爲container-test
最後爲所在鏡像的名稱。
在本地瀏覽器訪問8088端口。
不想每次啓動這麼麻煩可以在根目錄下創建一個makefile.bat文件,內容如下:
echo off
set b=%cd%
if "%1"=="dev" docker run -v "%b%":/usr/src/app -p 8088:8080 --name container-test dockerdemo
然後每次啓動只需要輸入:
makefile.bat dev
我這裏只配置了dev,其他模式還可以仿着配。
最後說幾個自己遇到坑:
1.命令過長可以\換行
2.在瀏覽器訪問時儘量不要用localhost:8088,最好換成自己的ip
3.在win系統下"%cd%"表示當前目錄,網上資料裏的$PWD無效
4.第二種部署方式裏,vue項目的config/index.js配置文件中的port和dockerfile裏EXPOSE端口號要保持一致,不然即便是映射以 後瀏覽器也訪問到(不知道爲啥,知道的大牛麻煩留言解釋下,謝謝)
5.第二種部署方式裏,vue項目的config/index.js配置文件中的host最好爲"0.0.0.0",不用"localhost",不然即便是映射以後瀏覽器也有可能訪問到(不知道爲啥,知道的大牛麻煩留言解釋下,謝謝)
6.還有給忘了,想起來再補吧。
上述的所有,是我自己初步瞭解docker遇到的,不對的地方歡迎指正,docker菜雞一隻。