一、安装 Docker
- 安装Docker 的依赖库。
yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加Docker CE的软件源信息。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装Docker CE。
yum makecache fast
yum -y install docker-ce
- 启动Docker服务。
systemctl start docker
- 修改
/etc/docker/daemon.json来使用加速器
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://xxx.com"]
}
EOF
- 重新加载服务配置文件
systemctl daemon-reload
- 重启docker服务
systemctl restart docker
二、安装Node.js环境
- 下载Node.js压缩包
wget https://npm.taobao.org/mirrors/node/v12.4.0/node-v12.4.0-linux-x64.tar.xz
- 解压
tar -xvf node-v12.4.0-linux-x64.tar.xz
- 移动并且重命名Node.js安装目录
mv node-v12.4.0-linux-x64/ /usr/local/node
- 将Node.js的可执行文件目录添加到系统环境变量
echo "export PATH=$PATH:/usr/local/node/bin" >> /etc/profile
- 使得配置的环境变量立即生效,并且查看node和npm版本
source /etc/profile
# 查看版本
node -v
npm -v
三、使用Docker部署node项目
(1) 映射宿主机目录的方式
- 拉取最新的node镜像
docker pull node:latest
- 运行容器,假定项目目录:
/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)制作镜像
- 创建一个node项目
npm init -y
npm i express -D
touch server.js
# 编写一个简单的web应用
vim server.js
- 在项目根目录下创建Dockerfile文件
touch Dockerfile
- 编写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"]
- .dockerignore 文件
node_modules
npm-debug.log
- 在应用根目录执行build
docker build . -t <your username>/node-web-app
# build 后跟的参数则是上下文,供Dockerfile内使用
# -t 标记镜像,使得可以通过 `docker images` 查询到镜像
- 镜像制作完成即可运行镜像
docker run -p 49160:8080 -d <your username>/node-web-app
四、使用docker安装Jenkins
- 下载jenkins镜像
docker pull jenkins/jenkins
- 启动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执行相关命令