云服务器上部署各开发环境以及Node项目的两种部署方式

1,192 阅读1分钟

一、安装 Docker

  1. 安装Docker 的依赖库。
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 添加Docker CE的软件源信息。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装Docker CE。
yum makecache fast
yum -y install docker-ce
  1. 启动Docker服务。
systemctl start docker
  1. 修改 /etc/docker/daemon.json 来使用加速器
tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors":["https://xxx.com"]
}
EOF
  1. 重新加载服务配置文件
systemctl daemon-reload
  1. 重启docker服务
systemctl restart docker

二、安装Node.js环境

  1. 下载Node.js压缩包
wget https://npm.taobao.org/mirrors/node/v12.4.0/node-v12.4.0-linux-x64.tar.xz
  1. 解压
tar -xvf node-v12.4.0-linux-x64.tar.xz
  1. 移动并且重命名Node.js安装目录
mv node-v12.4.0-linux-x64/ /usr/local/node
  1. 将Node.js的可执行文件目录添加到系统环境变量
echo "export PATH=$PATH:/usr/local/node/bin" >> /etc/profile
  1. 使得配置的环境变量立即生效,并且查看node和npm版本
source /etc/profile

# 查看版本
node -v
npm -v

三、使用Docker部署node项目

(1) 映射宿主机目录的方式

  1. 拉取最新的node镜像
docker pull node:latest
  1. 运行容器,假定项目目录: /usr/app/Helloworld
docker run -it -v /usr/app/Helloworld/:/usr/app/src/ -w /usr/app/src/ -p 8080:8080 --name Helloworld -d node:latest npm run serve
# -i (interactive)以交互模式运行容器
# -t (terminal)为容器重新分配一个伪输入终端
# -v (volume)目录映射 宿主机:容器内部
# -w (workdir)指定容器内的工作目录
# -p (port)端口映射
# --name 容器名
# -d ()后台运行容器
# --rm 推出容器时即删除
# image 后面紧跟的则是要执行的命令

(2)制作镜像

  1. 创建一个node项目
npm init -y

npm i express -D

touch server.js

# 编写一个简单的web应用
vim server.js
  1. 在项目根目录下创建Dockerfile文件
touch Dockerfile
  1. 编写Dockerfile
# 基础镜像
FROM node:latest
# 指定工作目录
WORKDIR /usr/src/app
# 拷贝package.json 和 lock 文件
# 只是拷贝了 `package.json` 文件而非整个工作目录。这允许我们利用缓存 Docker 层的优势
COPY package*.json ./
# 安装依赖
RUN npm install
# 拷贝所有文件(.代表docker build时传入的上下文)
COPY . .
# 端口
EXPOSE 8080
# 执行命令
CMD ["npm", "start"]
  1. .dockerignore 文件
node_modules
npm-debug.log
  1. 在应用根目录执行build
docker build . -t <your username>/node-web-app
# build 后跟的参数则是上下文,供Dockerfile内使用
# -t 标记镜像,使得可以通过 `docker images` 查询到镜像
  1. 镜像制作完成即可运行镜像
docker run -p 49160:8080 -d <your username>/node-web-app

四、使用docker安装Jenkins

  1. 下载jenkins镜像
docker pull jenkins/jenkins
  1. 启动jenkins容器
新建/var/jenkins_home并设置文件权限
$ mkdir /var/jenkins_home
$ sudo chown 777 /var/jenkins_home
# 或者
$ sudo chown -R 1000:1000 /var/jenkins_home


启动jenkins容器
$ docker run -d -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /etc/localtime:/etc/localtime --name jenkins docker.io/jenkins/jenkins
-d                                后台运行镜像
-p 8080:8080                      将镜像的8080端口映射到服务器的8080端口(服务器端口:镜像端口)
-p 50000:50000                    基于 JNLP 的 Jenkins 代理通过 TCP 端口 50000 与 Jenkins master 进行通信,所以也要映射
-v /var/jenkins_home:/var/jenkins_home                /var/jenkins_home目录为jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。
-v /var/run/docker.sock:/var/run/docker.sock          jenkins容器内也需要docker来执行任务,所以这里将docker命令也映射到容器里
-v /usr/bin/docker:/usr/bin/docker                    将docker命令映射到容器内
-v /etc/localtime:/etc/localtime  让容器使用和服务器同样的时间设置。
--name myjenkins                  给容器起一个别名
docker.io/jenkins/jenkins         使用刚下载的镜像安装

可能出现的错误:
1"docker run" requires at least 1 argument.
原因:命令少了参数,即命令最后需要加jenkins安装来源:docker.io/jenkins/jenkins

2、Error response from daemon: driver failed programming external connectivity on endpoint jenkins (db9d8092ddb37d4243647cad8c63555e090b9
161d1f3c90db8d8c43281e9c86e):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8081 -j DNAT --to-destination 
172.17.0.2:8080 ! -i docker0:iptables: No chain/target/match by that name.
原因:端口映射失败,重启下docker

$ sudo systemctl restart docker

https://cao0507.github.io/2018/12/05/docker%E5%AE%B9%E5%99%A8%E5%90%AF%E5%8A%A8%E6%97%B6%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84%E5%A4%B1%E8%B4%A5/

3、docker: command not found
jenkins容器内并没有docker命令,所以通过挂在docker命令目录来使容器内部可以找到docker命令,通过挂载docker.sock来让宿主机的docker执行相关命令