利用Dockerfile自定义镜像-图解轻松学Docker&K8S

本文详细介绍了如何使用Dockerfile构建自定义镜像。通过Dockerfile的一系列指令,如FROM、WORKDIR、ADD等,可以基于基础镜像扩展并定制自己的应用环境,例如在此例中扩展tomcat镜像并部署web页面。学习Dockerfile的使用,能帮助读者更好地理解和管理Docker容器。

>>> 点我开始视频学习 <<<

你好,我是老齐,本节咱们来学习使用docker file配置文件,构建属于自己的镜像。回到咱们的控制台,在这首先来看一下。上一节课我们学习了如何从远程仓库来安装tomcat 镜像。对于这个tomcat来说,只要运行一个非常简单的命令。

Docker run -p 8000 tomcat

马上一个全新的tomcat就会给我们完成自动部署,但这里也衍生出来一个问题,作为当前的tomcat他并不是一个有效的应用,因为我们并没有在上面发布任何属于自己的web页面,未来我们希望在tomcat的基础上安装自己的网页该怎么做呢?

这就需要我们编写一个Docker中独有的文件dockerfile。什么是dockerfile?我们来看一下。

#利用FROM命令设置基准镜像
FROM tomcat:latest
#cd /usr/local/tomcat/webapps
WORKDIR /usr/local/tomcat/webapps
#ADD用于复制本地文件到镜像中
ADD docker-web ./docker-web

它的作用是对我们的镜像进行描述,描述我们的镜像到底要做哪些工作,在这个文件中它书写了一系列的指令,通过这些指令docker就知道我们如果要安装一个tomcat,需要哪几步,安装 一个redis需要哪几步,这非常像我们linux中的shell脚本或者是windows中的bat。

作为dockerfile 提供了很多的命令,每一个命令都有他自己的用意,归根到底它就是为了完成我们一个新镜像的制作。
文中涉及的源代码和训练素材可以从下面链接下载

http://itlaoqi.com/chapter/1650.html

下面我们分别介绍一下每一句的含义:

#利用FROM命令设置基准镜像
FROM tomcat:latest

现在我们新创建一个核心的配置文件,这个文件名就叫Dockerfile。注意这个文件名是不要有任何扩展名的,作为Dockerfile他要描述我们新产生镜像的一系列操作步骤,
from代表我们从哪个基准镜像进行扩展,作为大多数应用都是在现有的镜像基础上扩展而来的,所以这里的tomcat就是tomcat镜像进行扩展。
这里还会涉及到一个新问题,tomcat后面冒号LATEST是什么呢?它是版本号在前面,我们不是下载了tomcat吗?来看一下,作为tomcat是镜像名字,但是tag其实对应的就是版本了,如果下载时没有指定的话,默认就会下载LATEST的版本,这里我from以后书写的格式就是镜像的名字冒号再加上tag版本号,这样我们就可以在镜像基础上进行扩展了。

#cd /usr/local/tomcat/webapps 切换镜像内部工作目录
WORKDIR /usr/local/tomcat/webapps

workdir指向/usr/local/tomcat/webapps
workdir代表工作目录的意思,其实非常像我们在Linux中的cd。这个指令我们将当前工作的目录跳转到这个目录下

小技巧:如何进入指定容器呢,使用下面命令,确定要切换的工作目录?

docker exec -it 容器编号 /bin/bash
ls
cd 'usr/local/tomcat/webapps
#ADD用于复制本地文件到镜像中
ADD docker-web ./docker-web

ADD命令ADD是复制的意思,ADD命令用于复制本地的文件到镜像的指定位置。至于它的用法也很简单,第一个参数docker-web是指我们本地的目录。第二个参数是指向镜像中要复制到哪个目录, 这个文件夹如果不存在的话,则docker会自动创建。
作为文件存储好了怎么用?只有通过构建加载dockerfile才可以完成新的镜像构建。

docker build -t 镜像名:版本号 dockerfile所在目录

build的就是构建的意思,根据指定的dockerfile来进行新镜像的构建,
在build的后面我们增加一个参数-t,-t代表为新镜像赋予一个名字。例如这里itlaoqi/mydocker-web:1.0,而第二个参数是要指向dockerfile所在的目录是哪个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x7vBih3q-1586266110668)(/attachment/20200406/9d6f7c71133e49089f74216279ef4ea7.jpg)]

构建好以后,来咱们再利用

Docker images

查看本地所有经验,itlaoqi/mydocker-web出现在列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VeCqTe5w-1586266110670)(/attachment/20200406/a6fecd90e24343d1a6379a7b78033d54.jpg)]

利用docker run创建新的容器

docker run -p 8001:8080 itlaoqi/mydocker-web:1.0

这样我们便完成了从dockerfile编写到容器运行的全过程.
在后面的章节我们将继续学习dockerfile中各种常用命令的使用办法

<think>好的,我现在需要帮助用户解决在Kubernetes中删除原有的Docker相关配置或容器的问题,这可能涉及到迁移或替换容器运行时。首先,我得回忆一下用户之前的问题,他之前遇到了Docker守护进程无法连接的问题,并且现在可能想要迁移到其他容器运行时,比如containerd或者CRI-O。 用户提到要“k8s replace docker runtime”,也就是替换Kubernetes的容器运行时。根据Kubernetes的文档,从1.20版本开始,Docker作为容器运行时已经被弃用,推荐使用containerd或CRI-O。所以用户可能需要按照官方建议进行迁移。 接下来,我需要考虑如何安全地移除Docker相关的配置和容器。首先,需要确保Kubernetes集群已经配置为使用新的容器运行时,否则直接删除Docker可能会导致集群不可用。步骤可能包括以下几个部分: 1. **确认当前容器运行时**:用户需要先检查Kubernetes当前的容器运行时是否是Docker,可以通过检查节点状态或kubelet的配置来确认。 2. **配置Kubernetes使用新的运行时**:比如切换到containerd,这需要修改kubelet的配置,可能需要更新/etc/default/kubelet文件,设置--container-runtime-endpoint参数指向containerd的socket。 3. **排空节点**:在切换运行时之前,应该排空节点上的工作负载,避免影响正在运行的容器。 4. **卸载Docker和相关组件**:一旦确认新运行时正常工作,就可以卸载Docker引擎、Docker Compose等组件,同时清理相关的镜像、容器和卷。 5. **清理残留配置**:删除Docker的配置文件、服务单元以及Kubernetes可能遗留的Docker相关配置,比如CNI插件等。 同时,用户可能需要迁移现有的容器到新的运行时。这里需要注意的是,直接删除Docker容器可能会导致数据丢失,所以需要确保已经备份或迁移了重要数据。 还要考虑权限和依赖问题。比如,如果之前有脚本或服务依赖于Docker命令,切换后这些可能需要调整。此外,用户可能使用了Docker特定的存储驱动,换成containerd后可能需要调整存储配置。 另外,用户提供的引用内容中有提到使用Docker Compose安装以及HAProxy和Keepalived的配置,这可能意味着他们的环境中有复杂的网络配置,需要确保在切换容器运行时后,这些网络配置仍然有效,或者进行相应的调整。 最后,需要验证新的容器运行时是否正常工作,比如部署测试Pod,检查日志和事件,确保没有报错。同时,提供回滚方案,以防出现问题可以快速恢复。 总结来说,步骤可能包括确认环境、配置新运行时、排空节点、卸载Docker、清理配置、验证和测试。需要详细指导用户每一步,并提醒注意事项,比如备份和数据迁移的重要性。</think>以下是在Kubernetes集群中安全移除Docker并迁移容器运行时的完整方案,包含关键原理与风险控制措施: --- ### 操作流程图解 $$ \begin{array}{ccc} \text{确认当前运行时状态} & \rightarrow & \text{切换kubelet运行时} \\ \downarrow & & \downarrow \\ \text{排空节点} & \rightarrow & \text{移除Docker组件} \\ \downarrow & & \downarrow \\ \text{清理残留配置} & \rightarrow & \text{验证新运行时} \end{array} $$ --- ### 分步实施指南 #### 一、环境预检(所有节点执行) ```bash # 确认当前容器运行时 kubectl get nodes -o wide --show-labels | grep 'beta.kubernetes.io/os' docker ps -a # 查看现有Docker容器 kubectl describe node <node-name> | grep Runtime # 确认K8s检测的运行时类型 ``` #### 二、切换容器运行时(以containerd为例) 1. **配置containerd** ```bash sudo apt-get install containerd sudo systemctl enable containerd ``` 2. **修改kubelet配置** ```bash sudo sed -i 's/--container-runtime=docker//' /etc/default/kubelet echo 'KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"' | sudo tee -a /etc/default/kubelet ``` 3. **重启组件** ```bash sudo systemctl daemon-reload sudo systemctl restart kubelet containerd ``` #### 三、节点排空与清理 1. **优雅驱逐Pod** ```bash kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data ``` 2. **移除Docker组件** ```bash sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo rm -rf /var/lib/docker /etc/docker /var/run/docker.sock ``` 3. **清理CNI残留** ```bash sudo rm -rf /etc/cni/net.d/*docker* ``` #### 四、验证新运行时 ```bash kubectl describe node <node-name> | grep "Container Runtime Version" # 应显示containerd://x.x.x kubectl run test --image=busybox -- sleep 3600 # 创建测试Pod kubectl get pod test -o jsonpath='{.status.hostIP}{"\n"}' ``` --- ### 关键风险控制 1. **数据保留策略** ```bash # 迁移前备份容器数据卷 docker run --rm -v /var/lib/docker:/docker -v $(pwd):/backup alpine \ tar czf /backup/docker-volumes-$(date +%s).tar.gz -C /docker volumes/ ``` 2. **回滚方案** 若切换失败,恢复原有配置: ```bash sudo apt-get install docker-ce=5:20.10.12~3-0~ubuntu-focal sudo systemctl unmask docker.service sudo systemctl restart docker kubelet ``` --- ### 关联问题 1. 如何验证containerd与Kubernetes的CRI兼容性? 2. 容器存储卷迁移有哪些注意事项? 3. 容器网络插件需要做哪些适配调整? [^1]: Kubernetes官方文档-移除Docker运行时指引 [^2]: Containerd生产环境配置规范 [^3]: 云原生计算基金会(CNCF)容器运行时白皮书
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值