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

参考

相关推荐
崔庆才丨静觅12 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法12 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
七夜zippoe12 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
崔庆才丨静觅12 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment12 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅13 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊13 小时前
jwt介绍
前端
爱敲代码的小鱼13 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
Cobyte13 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
NEXT0613 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法