@圖文並茂基於CentOS Linux release 7.8.2003 Core安裝並Docker化你的Node.js應用
簡體中文 | English
說明
- 本文介紹如何在CentOS Linux release 7.8.2003部署並使用Docker。
- 旨在使用最簡單快速的辦法,解決使用docker部署nodejs需求。
前提
你要有一個服務器喲~~
購買后打開就像這個下面這個樣子
備注
- 因為本來用的是阿里雲服務器進行安裝,Aliyun Linux 2.1903 LTS 64位操作系統的ECS實例,后期遇到一些問題,查詢很多資料按照資料操作,但是問題暫時還未解決,所以用了同事的服務器進行再次安裝
- 具體配置情況如下
- 查看Linux 內核
uname -a
cat /proc/version
- 查看當前系統版本的詳細信息
1.cat /etc/redhat-release(此方法只適合Redhat 系的Linux)
2.lsb_release -a (此命令適用於所有的Linux 發行版本)
步驟一:鏈接服務器
- 鏈接成功后如下圖所示,如果不知道如何鏈接,可以參考(這個地址)
- 依次運行以下命令添加yum源。
yum update
yum install epel-release -y
yum clean all
yum list
- 安裝並運行Docker。
yum install docker-io -y
systemctl start docker
- 解決報錯,查看錯誤信息:(備註,如果你用的CentOS Linux可以直接跳過這一步,一般沒有下面問題)
[root@iZ2ze67ifeuz62igol9apzZ ~]# docker -v
Docker version 1.13.1, build 4ef4b30/1.13.1
[root@iZ2ze67ifeuz62igol9apzZ ~]# systemctl status docker.service -l
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since 日 2020-06-28 15:31:55 CST; 6min ago
Docs: http://docs.docker.com
Process: 24481 ExecStart=/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE)
Main PID: 24481 (code=exited, status=1/FAILURE)
6月 28 15:31:54 iZ2ze67ifeuz62igol9apzZ systemd[1]: Starting Docker Application Container Engine...
6月 28 15:31:54 iZ2ze67ifeuz62igol9apzZ dockerd-current[24481]: time="2020-06-28T15:31:54.799852050+08:00" level=warning msg="could not change group /var/run/docker.sock to docker: group docker not found"
6月 28 15:31:54 iZ2ze67ifeuz62igol9apzZ dockerd-current[24481]: time="2020-06-28T15:31:54.800671443+08:00" level=info msg="libcontainerd: new containerd process, pid: 24490"
6月 28 15:31:55 iZ2ze67ifeuz62igol9apzZ dockerd-current[24481]: time="2020-06-28T15:31:55.813485177+08:00" level=error msg="'overlay' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded."
6月 28 15:31:55 iZ2ze67ifeuz62igol9apzZ dockerd-current[24481]: time="2020-06-28T15:31:55.814654057+08:00" level=error msg="'overlay' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded."
6月 28 15:31:55 iZ2ze67ifeuz62igol9apzZ dockerd-current[24481]: Error starting daemon: error initializing graphdriver: devicemapper: Error running deviceCreate (CreatePool) dm_task_run failed
6月 28 15:31:55 iZ2ze67ifeuz62igol9apzZ systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
6月 28 15:31:55 iZ2ze67ifeuz62igol9apzZ systemd[1]: Failed to start Docker Application Container Engine.
6月 28 15:31:55 iZ2ze67ifeuz62igol9apzZ systemd[1]: Unit docker.service entered failed state.
6月 28 15:31:55 iZ2ze67ifeuz62igol9apzZ systemd[1]: docker.service failed.
解決方案如下
卸載老版本的 docker 及其相關依賴
# 1、先查詢所有安裝的包
yum list installed | grep docker*
# 或者
rpm -qa docker*
# 2、刪除查詢出來的包
# 一般情況會有一個
yum remove -y docker-ce
# 18.09新增了cli工具
yum remove -y docker-ce-cli
# 3、刪除鏡像文件
rm -rf /var/lib/docker
rm -rf /var/lib/docker*
升級linux內核,重新安裝docker:
#查看已經安裝的和未安裝的軟件包組,來判斷我們是否安裝了相應的開發環境和開發庫;
yum grouplist
#一般是安裝這兩個軟件包組,這樣做會確定你擁有編譯時所需的一切工具
yum groupinstall "Development Tools"
#你必須這樣才能讓 make *config 這個指令正確地執行
yum install ncurses-devel
#如果你沒有 X 環境,這一條可以不用
yum install qt-devel
#創建 CentOS-6 內核時需要它們
yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel
- 不好意思,上面的報錯一直沒有解決,找了許多方法去處理,但是始終是沒有結果,於是我換了同事的服務器按照以上步驟安裝。
- 下面的內容均基於CentOS Linux release 7.8.2003 (Core)
- 查看安裝版本,啟動 docker
docker version
systemctl start docker
6. 驗證是否安裝成功
docker info
7. 設置開機啟動
chkconfig docker on
配置Docker
- 切換國內鏡像源, 加速訪問 Docker Hub
echo "OPTIONS='--registry-mirror=https://mirror.ccs.tencentyun.com'" >> /etc/sysconfig/docker
systemctl daemon-reload
service docker restart
2. 安裝配置node環境
docker search node
docker pull docker.io/node:7.8.0
- 在自己喜歡的目錄里創建Dockerfile文件
[root@VM_0_5_centos ~]# cd /var/opt/test
[root@VM_0_5_centos test]# ll
總用量 0
[root@VM_0_5_centos test]# touch Dockerfile
- 假設Node.js應用的啟動命令為node server.js, 監聽端口為8090
# 可以指定依賴的node鏡像的版本 node:<version>,如果不指定,就會是最新的
FROM node
WORKDIR /app
# 把其他源文件復制到工作目錄
COPY ./app /app
# 把 package.json,package-lock.json(npm@5+) 或 yarn.lock 復制到工作目錄(相對路徑)
RUN npm install
# 只安裝dependencies依賴
# 替換成應用實際的端口號
EXPOSE 8090
# 這里根據實際起動命令做修改
CMD [ "node", "server.js" ]
5. 補充.dockerignore
touch .dockerignore
.dockerignore內容如下
node_modules
npm-debug.log
6. 創建鏡像
docker build -t node78:v1 .
在 Docker 守護進程執行 Dockerfile 中的指令前,首先會對 Dockerfile 進行語法檢查,有語法錯誤時會返回:(如果按照上面的Dockerfile配置文件,不會報這個錯,配置文件是后期修改過的,又重新截圖的哦~)
[root@VM_0_5_centos test]# docker build -t node78:v1 .
Sending build context to Docker daemon 3.584 kB
Error response from daemon: Unknown instruction: :
- 查看鏡像
docker images
# 示例輸出
REPOSITORY TAG ID CREATED
node 8 1934b0b038d1 5 days ago
${your_name}/${image_name} latest d64d3505b0d2 1 minute ago
- 嘗試一下docker run node不僅可以可以尋找鏡像,如果沒有它就幫助你下載最新的版本
因為我下載的不是最新鏡像,它自動開始搞最新啦
docker run node
9. 查看鏡像
你會看到我們有倆鏡像了,一個最新版,一個是初始下載的版本.要是不想要後期可以刪除哦~
圖片裡的docker run 命令先不要執行哦~
docker image ls
- 准備一個簡單的nodejs文件
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.end('Hello World\n');
}).listen(8090);
console.log('Server running at http://127.0.0.1:8090/');
- 構建鏡像,不要忘了後面還有一個點點哦
docker build -t docker.io/node:latest .
- 啟動容器腳本
docker run -d -p 8090:8090 docker.io/node:latest
12. 測試,成功連接
至此恭喜,部署成功!
常用命令
- 另外附一些常用命令:
# 查看所有容器(包括已終止的)
docker ps -a
# 或使用新命令
docker container ls -a
# 查看運行中的容器
docker ps
# 或使用新命令
docker container ls
# 示例輸出
ID IMAGE COMMAND ... PORTS
ecce33b30ebf ${your_name}/${image_name}:latest npm start ... 49160->8080
# 查看某容器內日志
docker logs -f ${container_id}
# 進入某容器,並有shell執行環境
# 進入容器
# -i表示:交互式操作,-t表示:終端
docker exec -it ${container_id} bash
# 可通過輸入 exit 退出
# 停止容器
docker container stop ${container_id}
# 啟動已終止的容器
docker container start ${container_id}
#刪除容器
docker container rm ${container_name || container_id}
#查看鏡像
docker images
# 或使用新命令
docker image ls
#刪除鏡像
docker image rm ${image_id}
#其他命令
doctor run -it -d --name springboot -p 8080:8080 springboot:latest
-d 后台運行容器,並返回容器ID
-i 以交互模式運行容器,通常與-t同時使用
-t 為容器新分配一個偽輸入終端,通常與i同時使用
-P 大寫,隨機端口映射,容器內部端口隨機
-p 小寫,指定端口映射,格式為: 主機端口:容器端口
--name 重命名
FROM 100.111.222.111/library/centos/jdk:1.8.0 -----OPEANJDK:8
從鏡像下載JDK
FROM 是指需要倉庫下載一個JDK的鏡像作為底層系統,然后在該JDK上執行后面那些操作。
結語
本教程旨在快速完成Node.js項目部署,其他配置項詳細情況問題沒有列舉出來哦...后期有空會增加配置文章喲~~
歡迎大家指出文章需要改正之處~
如果有更好的方法,歡迎大家提出來,共同進步喲~~