Docker 构建镜像运行项目 - 结合 Jenkins

本文,我们来讲解下如何进行 docker 镜像的构建、项目的运行并且结合 Jenkins 实现构建~

构建镜像

假设我们在目标机器和 jenkins 机器上都已经安装了 Docker

通过 Docker -v 进行验证。当然,如果你只是想在本地测试,在自己的电脑上安装 docker 环境。

那么,我们可以通过类似 docker build --force-rm -t target.jimmy.com/test:demo . 来构建镜像,上面👆的意思是:

  • --force-rm:在构建过程完成后,强制删除中间容器。
  • -t target.jimmy.com/test:demo:指定要构建的镜像的名称和标签。
  • .:表示 Dockerfile 所在的路径。

是的,上面命令行执行后,会在项目的根目录下寻找 dockerfile 来执行。

我们编写下 dockerfile 文件:

bash 复制代码
# 拉取基础镜像
FROM registry.cn-hangzhou.aliyuncs.com/zhengqing/nginx:1.21.1

# 复制打包文件
COPY dist/. /usr/share/nginx/html
COPY nginx /etc/nginx

# 暴露端口
EXPOSE 8001

上面,我们拉取了基础镜像 registry.cn-hangzhou.aliyuncs.com/zhengqing/nginx:1.21.1,然后将项目的打包文件 dist 复制到镜像中的 /usr/share/nginx/html 目录下。并把 nginx 文件夹内容复制到 /etc/nginx,并暴露出了端口为 8001

假设我们编写的是单页面应用,dist 为其打包文件内容。我们对 nginx 添加的配置如下:

bash 复制代码
- nginx
    - conf.d
        - demo.conf
    - nginx.conf

nginx.conf 中的重点是引入 conf.d 下的所有文件:

bash 复制代码
http {
  # other
  include /etc/nginx/conf.d/*.conf;
  # other
}

然后我们编写 demo.conf 文件:

bash 复制代码
server {
  listen       8001;
  server_name _;
  root   /usr/share/nginx/html;

  location / {
    index /index.html;
    try_files  $uri $uri/ /index.html;
  }
  
  error_page  404 403   /404.html;
}

上面,我们监听了 8001 的端口,并将入口文件指向了 index.html 文件。

自此,我们就可以构建一个镜像。

结合 Jenkins

那么,我们结合 Jenkins 进行构建镜像和推送。

bash 复制代码
stage("docker") {
  agent any;
  steps {
    script {
        steps.gitlabCommitStatus(name: 'publish') {
            docker.withRegistry('https://target.jimmy.com/', 'jimmy') {
              sh "docker ps"
              sh "docker build --force-rm -t target.jimmy.com/test:demo ."
              sh "docker push target.jimmy.com/test:demo"
              sh "docker rmi target.jimmy.com/test:demo"
            }
        }
    }
  }
}

我们通过 withRegistry 登录到我们私服。然后通过 docker build --force-rm -t target.jimmy.com/test:demo . 构建镜像 target.jimmy.com/test:demo;接着,我们通过 docker push 推送镜像。最后通过 docker rmi 删除镜像。

运行项目

到目前为止,我们已经将镜像推送到私服了。那么,接下来,我们在目标机器上进行镜像的拉取,容器的启动等。

当然,目标机器上也需要安装 docker 环境

我们进入了目标机器,通过执行 docker pull target.jimmy.com/test:demo 拉取镜像。

然后,我们启动容器:

bash 复制代码
docker run -itd -p 9991:8001 target.jimmy.com/test:demo
  • -itd:在交互模式下运行容器,并将其分离到后台。
  • -p 9991:8001:将容器的端口 8001 映射到主机的端口 9991。

我们通过地址访问 404 页面,如下:

docker 重要命令行

  • docker ps:查看正在运行的容器
  • docker ps -a:查看所有的容器
  • docker stop <容器ID或容器名称>:停止指定正在运行的容器
  • docker rm <容器ID或容器名称>:删除指定的容器
  • docker exec -it <容器ID或容器名称> /bin/bash:进入指定的容器
  • docker logs <容器ID或容器名称>:查看容器日志「容器运行不起来时候定位」
  • docker image ls:查看所有的镜像
  • docker image rm <镜像ID或镜像名称>:删除指定的镜像「需要该镜像下的容器全部移除才可以执行成功」

参考

相关推荐
众生回避3 分钟前
鸿蒙ms参考
前端·javascript·vue.js
洛千陨3 分钟前
Vue + element-ui实现动态表单项以及动态校验规则
前端·vue.js
Flying_Fish_roe5 分钟前
linux-软件包管理-包管理工具(Debian 系)
linux·运维·debian
BLEACH-heiqiyihu31 分钟前
红帽9中nginx-源码编译php
运维·nginx·php
666786661 小时前
Mysql高级篇(中)—— SQL优化
linux·运维·服务器·数据库·sql·mysql
GHUIJS1 小时前
【vue3】vue3.5
前端·javascript·vue.js
企业管理8MSaaS1 小时前
了解CRM销售自动化:类型、优势、策略和工具
运维·自动化
码拉松1 小时前
千万不要错过,优惠券设计与思考初探
后端·面试·架构
&白帝&1 小时前
uniapp中使用picker-view选择时间
前端·uni-app
魔术师卡颂1 小时前
如何让“学源码”变得轻松、有意义
前端·面试·源码