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

参考

相关推荐
嘉伟桑28 分钟前
Python调用电价API返回JSON示例:分时电价、现货电价和字段解析
后端
刘卓航众创芯云服务部31 分钟前
Kimi K3复杂任务实测:我把团队最头疼的三个场景全跑了一遍
前端
cll_86924189141 分钟前
一个好看的Wordpress博客文字css样式
前端·css·ui
武子康44 分钟前
Shippy:确定性工具、会话级 Sandbox 与 Live-Data Eval(4 类收敛 + 7 步实现方案 + 6 类评测指标)
前端·人工智能·后端
糖果店的幽灵1 小时前
langgraph分支之 - 动态分支(Dynamic Branch)
java·前端·javascript·人工智能·langgraph
慕伏白1 小时前
【慕伏白】Linux 系统如何根据端口号关闭进程
linux·运维·服务器
meilindehuzi_a1 小时前
Workflow 与 Agent 有什么区别:从 LangChain 流水线到智能体决策
前端·人工智能
三翼鸟数字化技术团队1 小时前
一种前端大屏适配方案
前端·css
我叫黑大帅1 小时前
我为什么单一消费者的场景下,要用 Redis List 当消息队列?
redis·后端·面试
letisgo51 小时前
VMware Workstation + Ubuntu 26.04 LTS 小白运维部署手册
linux·运维·ubuntu