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

参考

相关推荐
艾伦_耶格宇21 分钟前
【ACP】阿里云云计算高级运维工程师--ACP
运维·阿里云·云计算
lyj16899723 分钟前
vue-i18n+vscode+vue 多语言使用
前端·vue.js·vscode
程序员岳焱1 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
一位摩羯座DBA1 小时前
Redhat&Centos挂载镜像
linux·运维·centos
麦兜*1 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅2 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
小白变怪兽2 小时前
一、react18+项目初始化(vite)
前端·react.js
ai小鬼头2 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
cui_win2 小时前
【网络】Linux 内核优化实战 - net.core.flow_limit_table_len
linux·运维·网络
风清再凯2 小时前
自动化工具ansible,以及playbook剧本
运维·自动化·ansible