docker簡介
docker是一個開源的應用容器引擎,可以為我們提供安全、可移植、可重復的自動化部署的方式。docker采用虛擬化的技術來虛擬化出應用程序的運行環境。如上圖一樣。docker就像一艘輪船。而輪船上面的每個小箱子可以看成我們需要部署的一個個應用。使用docker可以充分利用服務器的系統資源,簡化了自動化部署和運維的繁瑣流程,減少很多因為開發環境中和生產環境中的不同引發的異常問題。從而提高生產力。
docker三個核心概念如下:
-
鏡像(images):一個只讀的模板,可以理解為應用程序的運行環境,包含了程序運行所依賴的環境和基本配置。相當於上圖中的每個小箱子里面裝的東西。
-
倉庫(repository):一個用於存放鏡像文件的倉庫。可以看做和gitlab一樣。
-
容器(container):一個運行應用程序的虛擬容器,他和鏡像最大的區別在於容器的最上面那一層是可讀可寫的。 相當於上圖中的每個小箱子里。
docker安裝
mac
官網下載地址,點擊下載即可。
liunx
打開終端 輸入
curl https://releases.rancher.com/install-docker/17.12.sh | sh
等待安裝完成。檢查是否安裝成功。
環境已經安裝完畢。現在來開始部署應用吧。
docker實戰
准備工作
初始化一個NodeJs程序
以下操作必須已經安裝了NodeJS。如果沒有安裝請參照之前的教程傳送門
首先創建一個空文件夾。並創建以下文件:
- server.js
- package.json
- Dockerfile
- .dockerignore
mkdir docker_demo
cd docker_demo
touch server.js
touch package.json
touch Dockerfile
touch .dockerignore
然后在server.js寫入
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello docker';
});
app.listen(3000);
在package.json中寫入
{
"name": "docker_demo",
"version": "0.1.0",
"private": true,
"scripts": {
"start": "node server.js"
},
"dependencies": {
"koa": "^2.5.0"
}
}
測試程序。控制台輸入
npm start
瀏覽器打開本地測試,如果如圖所示。表示demo創建成功。請繼續往下。
創建dockerfile文件
Dockerfile是由一系列命令和參數構成的腳本,一個Dockerfile里面包含了構建整個image的完整命令。Docker通過docker build執行Dockerfile中的一系列命令自動構建image.
在.dockerignore文件里面寫入代碼。表示過濾該類型的文件。類似git的.gitignore
# Logs
logs
*.log
npm-debug.log*
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules
jspm_packages
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
.idea
.node_modules
node_modules
.vscode
在Dockerfile文件中寫入以下代碼:
#制定node鏡像的版本
FROM node:8.9-alpine
#聲明作者
MAINTAINER robin
#移動當前目錄下面的文件到app目錄下
ADD . /app/
#進入到app目錄下面,類似cd
WORKDIR /app
#安裝依賴
RUN npm install
#對外暴露的端口
EXPOSE 3000
#程序啟動腳本
CMD ["npm", "start"]
構建鏡像
使用build命令構造鏡像,注意后面那個.不能少。
docker build -t docker_demo .
robin:docker_demo robin$ docker build -t docker_demo .
Sending build context to Docker daemon 39.94kB
Step 1/7 : FROM node:8.9-alpine
---> 406f227b21f5
Step 2/7 : MAINTAINER robin
---> Using cache
---> 78d6cdbcfee2
Step 3/7 : ADD . /app/
---> 2cb30678612d
Step 4/7 : WORKDIR /app
Removing intermediate container e51377081039
---> c2b7d0f37d2d
Step 5/7 : RUN npm install
---> Running in da0c3946ca8d
npm notice created a lockfile as package-lock.json. You should commit this file.
added 38 packages in 3.323s
Removing intermediate container da0c3946ca8d
---> eecee87f10e2
Step 6/7 : EXPOSE 3000
---> Running in f3973cc168a4
Removing intermediate container f3973cc168a4
---> 2671a4c6deb4
Step 7/7 : CMD ["npm", "start"]
---> Running in dec529f754aa
Removing intermediate container dec529f754aa
---> 6ec73793d353
Successfully built 6ec73793d353
Successfully tagged docker_demo:latest
等待鏡像構造完成。然后使用 images命令查看鏡像。
此時可以看到images已經構造完成。現在開始啟動images,並測試。
#啟動鏡像 -d表示后台執行,-p 9000:3000表示指定本地的9000端口隱射到容器內的3000端口,docker_demo為鏡像名稱
docker run -d -p 9000:3000 docker_demo
#查看容器
docker ps
此時瀏覽器打開http://localhost:9000/,如果如圖所示。表示容器運行正常。
如果此時本地無法打開。可以使用log命令查看日志。根據日志修改對應出現的對方。
綁定docke hub
鏡像已經存在了我們本機硬盤,那我們實際中要么上傳到服務器呢?這里通常有2個方法。一直是自己搭建鏡像倉庫比如(harbor),還有就是官方的docke hub,類似gitlab。我們這里先以docke hub為列。harbor放在下篇博客。首先需要注冊docke hub賬號,官網注冊地址。然后登陸。
robin:docker_demo robin$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:xxxxxx
Password:
Login Succeeded
robin:docker_demo robin$
登陸成功之后。需要給當前images。添加tag,並push
#格式docker tag 標簽名 用戶名/標簽名
docker tag docker_demo robin365/docker_demo
#格式docker push 用戶名/標簽名
docker push robin365/docker_demo
完成之后,可以登陸docke hub查看剛剛push的鏡像。我們可以設置這個鏡像是否公開。Public:所有人都可以下載。Private:表示自己才能下載。
這樣我們已經把images上傳到docke hub了,在我們需要用到這個images的時候可以直接通過docker pull命令下載使用了。
到此本教程結束。實際項目中部署可能會出現各種各樣的問題,我們需要多查看log。根據log去做相應修改。后面我也會整理出有關docke在部署nodejs應用中的一些比較容易出錯的地方。
dockerc 常用命令
#查看當前docker版本
docker -v
#查看當前本地所有鏡像
docker images
#構造鏡像,用法docker build -t 鏡像名稱 .
docker build -t docker_demo .
#用於容器與主機之間的數據拷貝。用法docker cp 主機文件地址 容器內地址。12d7f14v45cv為容器id。
docker cp /www/runoob 12d7f14v45cv:/www/
#創建一個新的容器並運行,-d為后台執行,-p 9000:3000前面為主機端口,后面是容器端口。docker_demo鏡像名
docker run -d -p 9000:3000 docker_demo
#啟動已被停止的容器
docker start docker_demo
#關閉已被啟動的容器
docker stop docker_demo
#重新啟動容器
docker restart docker_demo
#殺掉一個運行中的容器。
docker kill -s KILL docker_demo
#刪除一個或多少容器。-f :通過SIGKILL信號強制刪除一個運行中的容器-l :移除容器間的網絡連接,而非容器本身-v :-v 刪除與容器關聯的卷
docker rm -f docker_demo、docker_demo1
#在運行的容器中執行命令。104e28f2f072容器id
sudo docker exec -it 104e28f2f072 /bin/bash
#列出容器。 -a:所有容器包含沒有運行的
docker ps
#獲取容器獲取容器的日志 104e28f2f072容器id,-t:顯示時間戳
docker logs -f -t 104e28f2f072
#登陸鏡像倉庫
docker login
#獲取鏡像
docker pull
#上傳鏡像
docker push
#查看指定鏡像的創建歷史。
docker history docker_demo