Dockerfile -> Image -> Container

https://www.cnblogs.com/xiadongqing/p/6144053.html


基本概念:

  • container

容器。可以把每个 container 看做是一个独立的主机。 container 的创建通常有一个 image 作为其模板。类比成虚拟机的话可以理解为 image 就是虚拟机的镜像,而 container 就是一个个正在运行的虚拟机。一个虚拟机镜像可以创建出多个运行的虚拟主机且相互独立。 注意:container 一旦创建如果没有用 rm 命令移除,将会一直存在。所以用完后记得删除哦。

  • image

镜像。image 相当于 container 的模板,container 创建后里面有什么软件完全取决于它使用什么 image 。image 可以通过 container 创建(相当于把此时 container 的状态保存成快照),也可以通过 Dockerfile (一个文本文件,里面使用 docker 规定的一些写法)来创建。其中通过 Dockerfile 创建的方法能让环境配置和代码一起被版本库一起管理。

  • registry

存放镜像的仓库。只要能连接到 registry 每个人都可以很方便地通过 pull 命令从仓库中获取镜像。docker 默认使用的仓库是 docker hub,国内可以使用 DaoCloud 来建立 Mirror 连接到 docker hub,进而加快获取 image 的速度。

  • boot2docker

一个轻量级 linux 虚拟机,主要是为了让非 linux 系统也能用上 docker 。它实质上是一个 virtualbox 虚拟主机+一个能管理这个虚拟主机的命令行工具。由于这个虚拟主机的存在,在非 linux 系统上 container 需要获取一些物理系统资源(如 usb 设备)时不仅需要配置 docker 命令,还需要配置 boot2docker 这个虚拟主机的资源配置。

常用命令表

通用:

操作命令示例
查看 docker 版本docker versiondocker version
查看 docker 信息docker infodocker info
查看某命令 help 信息docker help [command]docker help attach
查看 docker help 信息docker --helpdocker --help
  • container 相关:
操作命令示例
创建 containerdocker createdocker create chenhengjie123/xwalkdriver
创建并运行 containerdocker rundocker run chenhengjie123/xwalkdriver /bin/bash
创建并运行 container 后进入其 bash 控制台docker run -t -i image /bin/bashdocker run -t -i ubuntu /bin/bash
创建并运行 container 并让其在后台运行,并端口映射docker run -p [port in container]:[port in physical system] -d [image] [command]docker run -p 5000:5000 -d training/webapp python app.py
查看正在运行的所有 container 信息docker psdocker ps
查看最后创建的 containerdocker ps -ldocker ps -l
查看所有 container ,包括正在运行和已经关闭的docker ps -adocker ps -a
输出指定 container 的 stdout 信息(用来看 log ,效果和 tail -f 类似,会实时输出。)docker logs -f [container]docker logs -f nostalgic_morse
获取 container 指定端口映射关系docker port [container] [port]docker port nostalgic_morse 5000
查看 container 进程列表docker top [container]docker top nostalgic_morse
查看 container 详细信息docker inspect [container]docker inspect nostalgic_morse
停止 continerdocker stop [container]docker stop nostalgic_morse
强制停止 containerdocker kill [container]docker kill nostalgic_morse
启动一个已经停止的 containerdocker start [container]docker start nostalgic_morse
重启 container (若 container 处于关闭状态,则直接启动)docker restart [container]docker restart nostalgic_morse
删除 containerdocker rm [container]docker rm nostalgic_morse

命令中需要指定 container 时,既可使用其名称,也可使用其 id 。

  • image 相关:
操作命令示例
从 container 创建 imagedocker commit [container] [imageName]docker commit nostalgic_morse ouruser/sinatra:v2
从 Dockerfile 创建 imagedocker build -t [imageName] [pathToFolder]docker build ouruser/sinatra:v3 .
查看本地所有 imagedocker imagesdocker images
在 registry 中搜索镜像docker search [query]docker search ubuntu
从 registry 中获取镜像 (若无指定 tag 名称,则默认使用 latest 这个 tag)docker pull [imageName]docker pull ubuntu:14.04, docker pull training/webapp
给 image 打 tagdocker tag [imageId] [imageName]docker tag 5db5f8471261 ouruser/sinatra:devel
把本地 image 上传到 registry 中 (此时会把所有 tag 都上传上去)docker push [imageName]docker push ouruser/sinatra
删除本地 imagedocker rmi [image]docker rmi training/sinatra

注意:image 中没有指定 tag 名称的话默认使用 latest 这个 tag 。然而 latest 的含义和 VCS 中的 head 不一样,不是代表最新一个镜像,仅仅是代表 tag 名称为 latest 的镜像。若不存在 tag 名称为 latest 的镜像则会报错。

总结

docker 虽然是一个虚拟化技术,但使用上却更像是在管理系统软件或者代码。里面的一些 pstoprm 命令让使用 Linux 命令的人感到十分亲切(虽然它们的语义有点不一样。。。),startstoprestart 让你感觉像是在控制 service ,而 pushpullcommittag 又让你觉得像是在使用 git 。因此程序员会感到很亲切且容易上手。

同时由于可以使用 Dockerfile 进行 image 的构建,且 docker hub 支持从 github 等地方自动根据 Dockerfile 进行构建,所以 docker 把运行环境也集成到 CI 中了。

美中不足的是由于 docker 目前仅支持 linux 上的容器技术,因此它要在非 Linux 系统下运行必须加多一个虚拟机层。这会造成一些在 Linux 上运行不会出现的问题(ip 地址、硬件资源、文件映射等),同时由于基于 linux ,一些 windows 的程序会水土不服,泛用性比虚拟机差一些。

但带来的好处是占用的系统资源低很多。一个只能开数个虚拟机的电脑一般能开数十个 container ,且 container 的启动时间一般在数秒内,比虚拟机快得多。另外,由于 docker 的 image 除了一些特殊的基础镜像外基本都是增量镜像,因此重复部分不会耗费额外的资源,所以几个看起来有数 g 的 image 如果里面使用的基础镜像有重复部分(大部分情况下都会有部分重复),那么它们实际占用空间将会小得多。


<think>好的,我现在需要帮助用户理解如何将GitLab、Jenkins、Ansible、Harbor和Docker这些DevOps工具集成起来,形成一个协同工作的工具链。首先,我得回顾一下每个工具的主要功能和在流程中的作用,这样才能理清它们之间的联动方式。 用户提供的引用内容中提到了一些具体的配置,比如Jenkins通过SSH将文件传给Ansible服务器,使用Docker Compose部署GitLab,以及在Ansible中调用Docker命令等。这些信息是关键,我需要结合这些步骤来构建整个流程。 首先,整个CI/CD流程通常从代码管理开始,也就是GitLab。开发者将代码推送到GitLab仓库后,需要触发Jenkins的构建任务。这里可能需要配置GitLab的Webhook,以便在代码提交时自动通知Jenkins。不过用户提到的Jenkins配置中使用了Git Checkout阶段,直接从GitHub拉取代码,但用户现在的问题是关于GitLab的集成,所以可能需要调整这部分,改为从GitLab仓库拉取代码。不过根据引用1中的示例,用户之前可能用的是GitHub,但现在想转向GitLab,需要注意配置正确的仓库URL和认证方式。 接下来是Jenkins的部分。Jenkins需要从GitLab获取代码,然后执行构建,比如编译、测试、打包。之后,生成的应用需要构建成Docker镜像。这里可能需要使用Dockerfile,然后通过Docker命令构建镜像。构建完成后,需要将镜像推送到Harbor私有仓库中。这涉及到Docker登录Harbor的步骤,确保Jenkins有权限推送镜像。引用3中提到使用docker_login步骤,这可能需要在Jenkins Pipeline中添加相应的阶段,使用Harbor的凭证进行认证。 然后,Jenkins需要将部署任务交给Ansible。根据引用1,用户之前是通过SSH将Dockerfile传给Ansible服务器,但现在可能需要传递更复杂的信息,比如镜像名称、版本等。可能需要通过Ansible Playbook来执行部署任务,比如在目标服务器上拉取Harbor中的镜像并启动容器。这里需要确保Ansible服务器能够访问Harbor,并且有足够的权限。引用3中提到在远程主机安装Python的Docker库,这可能是因为Ansible的docker_container模块需要这些依赖。 整个流程中,各个工具的凭证管理和通信安全是关键。比如Jenkins需要配置GitLab的访问凭证、Harbor的登录凭证,以及Ansible服务器的SSH密钥。这些凭证需要在Jenkins中妥善管理,通常使用Jenkins的凭据管理功能,并在Pipeline中通过credentialsId引用。 另外,关于工具之间的触发和联动,Jenkins可能需要配置Pipeline的触发器,比如轮询GitLab仓库或者通过Webhook触发构建。在构建成功后,触发Ansible执行部署。这里可能需要使用Jenkins的插件或者直接通过SSH调用Ansible的命令。 现在需要将这些步骤整合成一个连贯的流程,并考虑每个环节的配置细节。例如,在Jenkins Pipeline中,各个阶段如何顺序执行,如何处理失败情况,以及如何确保镜像版本的正确传递。同时,需要验证各工具之间的网络连通性,比如Jenkins能否访问GitLab、Harbor,Ansible能否访问目标服务器和Harbor等。 可能遇到的问题包括:凭证配置错误导致认证失败,网络策略阻止工具之间的通信,镜像标签管理不当导致部署版本混乱,以及Ansible Playbook中的任务编写错误。需要逐步测试每个环节,确保流程的顺畅。 总结来说,整个集成过程需要按照代码提交→自动触发构建→构建镜像→推送镜像→触发部署→执行部署的步骤进行,每个步骤对应不同的工具,并通过恰当的配置将它们连接起来。接下来需要将这些思考整理成结构化的步骤,并提供具体的配置示例,帮助用户理解和实施。</think>以下是GitLab、Jenkins、Ansible、Harbor、Docker工具链集成的实现方案,包含关键集成步骤和示例代码: ### 一、工具链集成架构 ![DevOps工具链流程图](https://via.placeholder.com/600x300?text=GitLab→Jenkins→Harbor→Ansible→Docker) 工具协作流程:$GitLab \xrightarrow{代码推送} Jenkins \xrightarrow{构建镜像} Harbor \xrightarrow{镜像存储} Ansible \xrightarrow{部署容器} Docker$ ### 二、核心集成步骤 #### 1. GitLab与Jenkins联动 ```groovy // Jenkins Pipeline配置 stage('GitLab代码拉取') { git branch: 'main', credentialsId: 'gitlab-cred', url: 'http://gitlab.example.com/group/project.git' // 根据引用[2]调整GitLab地址 } ``` *配置要点*:在Jenkins凭据管理中添加GitLab的SSH密钥或账号密码[^2] #### 2. Jenkins与Harbor集成 ```groovy stage('构建推送镜像') { docker.withRegistry('https://harbor.example.com', 'harbor-cred') { def image = docker.build("myapp:${env.BUILD_ID}") image.push() } } ``` *需安装Docker Pipeline插件*,镜像命名规范:$harbor_domain/project_name/image_name:tag$[^3] #### 3. Ansible与Docker联动 ```yaml # deploy.yml - name: 部署容器 docker_container: name: myapp image: harbor.example.com/project/myapp:{{ build_version }} ports: "8080:8080" restart_policy: always ``` *前置条件*:目标主机需安装$python-docker$组件(如引用[3]所述) #### 4. 完整Pipeline示例 ```groovy pipeline { agent any stages { stage('GitLab同步') { steps { /* 同步骤1 */ } } stage('Maven构建') { steps { sh 'mvn clean package' } } stage('Docker构建') { steps { /* 同步骤2 */ } } stage('Ansible部署') { steps { sshagent(['ansible-ssh-key']) { sh ''' ansible-playbook -i production.ini deploy.yml \ -e "build_version=${BUILD_ID}" ''' } } } } } ``` ### 三、安全配置要点 1. 凭证管理矩阵: | 工具 | 凭证类型 | 存储位置 | |--------------|----------------|----------------| | GitLab | SSH密钥 | Jenkins凭据库 | | Harbor | 用户名/密码 | Jenkins凭据库 | | Ansible | SSH私钥 | Jenkins凭据库 | 2. 网络连通性验证: $$ \text{Jenkins} \leftrightarrow \text{GitLab(8929)} \quad \text{Jenkins} \leftrightarrow \text{Harbor(443)} \quad \text{Ansible} \leftrightarrow \text{Docker Host(2375)} $$ ### 四、典型问题解决方案 1. **镜像推送失败**:检查Harbor项目权限设置,确保Jenkins使用的账号有对应项目的$push$权限 2. **Ansible连接超时**:验证SSH跳板机配置,建议使用$ssh-agent$插件管理密钥(如引用[1]示例) 3. **版本一致性**:通过$BUILD_ID$变量实现镜像版本与部署版本严格对应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值