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或镜像名称>:删除指定的镜像「需要该镜像下的容器全部移除才可以执行成功」

参考

相关推荐
Lary_Rock43 分钟前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
逐·風3 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫3 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
码农小旋风3 小时前
详解K8S--声明式API
后端
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
尚梦4 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app