Docker使用笔记

腾讯技术工程 发表于 10天以前  | 总阅读数:196 次

1. 为什么使用Docker

我们的业务需要使用公司内部的一个平台做报表展示,公司内部的一个平台支持的数据库都是正式环境或者IDC环境,这使得我们的业务逻辑也需要部署到正式环境或者IDC环境。自从自研资源上云后,鹅厂内部使用IDC资源时不再推荐使用方单独申请IDC资源,而是推荐使用容器服务进行资源的申请和使用。具体来说,就是我们需要把我们的业务先在测试环境上使用docker做成镜像,再把镜像上传到镜像仓库,再从容器服务中把我们的镜像给启动起来。因此,我们就有了使用docker的诉求。

2. Docker是什么

Docker是一个开源平台,它允许用户快速构建、测试和部署应用程序。Docker通过将软件及其依赖项打包到轻量级、可移植的容器中来实现这一目标。这些容器是独立的、可执行的软件包,它们包含了运行应用程序所需的所有内容,包括代码、运行时、库、环境变量和系统工具。

Docker的一个重要特点是它可以屏蔽环境差异。这意味着,只要应用程序及其依赖项被打包到Docker容器中,那么无论应用程序运行在哪个环境中,它的行为都是一致的。这消除了“在我的环境上可以运行”的问题,并实现了“build once, run everywhere”的目标。

Docker的另一个优势是快速部署。由于容器启动速度非常快,并且只要确保一个容器中的程序正确运行,就可以确信无论在生产环境部署多少个容器都能正确运行,因此Docker非常适合用于快速部署应用程序。

Docker的关键组件包括Dockerfile文件、Docker映像和Docker容器。Dockerfile文件是一个包含命令的脚本,用于组装Docker映像并定义其中的内容。Docker映像是一个只读的模板,用于创建Docker容器。Docker容器是从Docker映像启动的运行实例。

Docker被广泛使用,因为它简化了应用程序的部署过程,并为开发人员提供了可移植性、一致性和效率。Docker的创新性在于它将程序的所有依赖项一起打包,从而简化了运行环境管理的繁琐步骤。

3. 怎么使用Docker

3.1 Docker的安装

在不同操作系统上,docker的安装命令不同,我们这次以Ubuntu系统为例来说明如何安装docker。下面的各个步骤都是来源于混元大语言模型的返回:

在Ubuntu系统上安装Docker,你可以按照以下步骤操作:

1.更新软件包索引:

sudo apt-get update

2.安装依赖项:

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

3.添加Docker官方GPG密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4.设置Docker稳定版本的存储库:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5.更新软件包索引:

sudo apt-get update

6.安装Docker:

sudo apt-get install docker-ce docker-ce-cli containerd.io

7.验证Docker是否已成功安装:

sudo docker --version

按照混元大模型给出来的步骤执行安装,问题出现在了第4-6步。环境中的lsb_release执行报错:

Traceback (most recent call last):
  File "/usr/bin/lsb_release", line 25, in <module>
    import lsb_release
ModuleNotFoundError: No module named 'lsb_release'

这个错误解决了半天也没有搞定,最后通过绕道而搞定。按照道理,第四步的目的是指定当前系统的稳定docker版本,这里可以通过下面的命令替代:

codename=$(cat /etc/os-release | grep "VERSION_CODENAME" | cut -d "=" -f 2)

把codename的值替换到第4步中的$(lsb_release -cs),再执行第6步就能成功了。如果还是执行失败的话,可以新建个文件:/etc/apt/sources.list.d/docker.list,并且把第4步的前半部分,即:

deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu bionic stable

写入到文件中,其中“bionic”就是前面提到的codename。注意,这个命令要写对,一定要以deb开头,在stable前一定要有codename值。

3.2 生成镜像

3.2.1 创建Dockerfile

生成镜像的第一步是创建一个Dockerfile。在我这里,参考着官方文档,使用混元平台生成了一个大致可用的Dockerfile,我跟混元的对话如下(当然第一次没把需求提的这么清楚,经过多轮对话我的要求优化为):

写一个Dockerfile,满足下面的要求:
0、创建一个Ubuntu镜像
1、在docker中安装python3
2、使用requirements.txt安装依赖
3、把accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三个文件夹拷贝到docker中
4、写一个start.sh,在脚本中分别使用python来启动accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三个文件夹中的main.py,每个python脚本的执行记录都写到日志文件中,且每个程序保持在后台运行
5、使用start.sh作为docker的启动命令

混元的返回是:

# 0. 创建一个Ubuntu镜像
FROM ubuntu:latest

# 设置工作目录
WORKDIR /app

# 1. 在docker中安装python3
RUN apt-get update && \
    apt-get install -y python3 python3-pip

# 2. 使用requirements.txt安装依赖
COPY requirements.txt .
RUN pip3 install -r requirements.txt

# 3. 把accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三个文件夹拷贝到docker中
COPY accuracy_recall_for_ehp cos_log_download_process test_rule_checker /app/

# 4. 写一个start.sh,在脚本中分别使用python来启动accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三个文件夹中的main.py,每个python脚本的执行记录都写到日志文件中,且每个程序保持在后台运行
RUN echo '#!/bin/bash' > start.sh && \
    echo 'python3 /app/accuracy_recall_for_ehp/main.py > /app/accuracy_recall_for_ehp.log 2>&1 &' >> start.sh && \
    echo 'python3 /app/cos_log_download_process/main.py > /app/cos_log_download_process.log 2>&1 &' >> start.sh && \
    echo 'python3 /app/test_rule_checker/main.py > /app/test_rule_checker.log 2>&1 &' >> start.sh && \
    chmod +x start.sh

# 5. 使用start.sh作为docker的启动命令
CMD ["/app/start.sh"]

经过测试,这个Dockerfile他是可用的。从一个侧面也说明了大语言模型对我们工作效率的提升还是比较有效的。

3.2.2 镜像仓库

在正式创建Docker镜像前,我们先来说下镜像仓库。

3.2.2.1 镜像仓库是什么

镜像仓库是一种存储、分发和检索软件镜像(即Docker镜像)的集中化服务。以下是为什么需要使用镜像仓库的一些原因:

便捷性:镜像仓库允许用户在不构建本地镜像的情况下,快速获取并运行预构建的镜像。这样可以节省时间和资源,提高开发效率。

版本控制:镜像仓库可以帮助用户跟踪和回溯软件的版本历史,并且可以轻松地将软件回滚到以前的版本。这对于在生产环境中进行故障排查和修复问题时非常有用。

安全性:镜像仓库可以帮助用户集中管理和控制对镜像的访问权限。这可以防止未经授权的访问和潜在的恶意攻击。

协作:镜像仓库支持多人合作开发同一个项目。通过将镜像存储在仓库中,团队成员可以轻松地共享和同步软件镜像,从而提高团队协作效率。

可扩展性:镜像仓库可以轻松地支持大量用户和镜像。这对于大型组织和企业在全球范围内分发和部署软件镜像非常有用。

综上所述,镜像仓库可以帮助用户更快速、安全、便捷地管理和分发软件镜像,从而提高开发效率和团队协作水平。

3.2.2.2 常用的镜像仓库

常用的Docker仓库包括以下几种:

1、Docker Hub:Docker官方提供的公共仓库,包含了大量的官方和社区维护的镜像,用户可以通过docker pul命令从Docker Hub获取镜像。

2、私有仓库:可以在本地或私有网络中搭建的私有Docker仓库,用于存储和管理自定义的镜像。常见的私有仓库包括Docker Registry、Harbor等。

3、第三方仓库:除了Docker Hub和私有仓库,还有一些第三方的Docker仓库,提供了特定领域或特定用途的镜像。例如,Gogle Cloud Container Registry、AWS Elastic Container Registry等。

4、其他公共仓库:除了Docker Hub,还有一些其他的公共仓库,例如Quay.io、Azure Container Registry等,它们提供了各种不同的镜像和服务。

这些仓库为用户提供了方便、安全、高效的Docker镜像存储和分发解决方案,帮助用户更好地管理和部署应用程序。

3.2.3使用Dockerfile创建镜像

在生成了Dockerfile之后,就是使用Dockerfile来生成镜像了。如果只是在本地测试,那么使用docker build命令就可以了:

sudo docker build -t my-image .

如果我们想要把镜像存入到镜像仓库中,我们在创建镜像时,就需要使用把镜像的名字生成的“讲究”、漂亮一些。具体来说,如果我们想把镜像存入到镜像仓库中以备后续在容器服务中使用的话,我们为镜像起名字时要把我们后续需要使用的镜像仓库地址以、个人文件夹写入到镜像名字中。建议先创建一个个人的镜像来做测试。在创建好自己的仓库地址后,在build镜像时需要指定仓库的地址为镜像的名称,即:

sudo docker build -t myusername/myimage:latest .

其中,latest为仓库的tag。在创建好镜像后,可以通过下面的命令来查看镜像是否创建成功(结果就不贴了,是否成功一目了然):

sudo docker images

3.3 启动镜像

在创建好镜像后,可以通过下面的命令来启动镜像:

sudo docker run -d -p 80:80 --name test-container myusername/myimage

其中test-container为镜像启动后的容器名称。在启动后,可以通过下面的命令来判断当前容器的运行情况:

sudo docker ps -a

返回的格式如下:

建议使用ps -a而不是ps,使用ps -a能够看到全量的包括历史上运行已经停止了的容器的情况。

3.3.1 容器运行状态

上面提到了使用ps -a命令能看到容器当前的运行情况,其中STATUS这一列说明了不同容器当前的运行状态。STATUS可能的值包括:Up、Exited、Created、Restarting、Removing和Dead。这些值的具体含义如下:

Up: 容器正在运行。

Exited: 容器已退出,通常表示容器内的主进程已完成并正常退出。

Created: 容器已创建,但尚未启动。

Restarting: 容器正在重启。

Removing: 容器正在被删除。

Dead: 容器已死亡,通常表示容器内的主进程已崩溃或被终止。

3.1.1.1 inspect命令

上面的值可能会因为Docker版本和操作系统的不同而有所不同。要获取更详细的信息,你可以使用docker inspect命令查看容器的详细信息。例如:

docker inspect 9c436ea546b9

inspect命令的返回值是个json文件,包含对象的所有属性和配置,一些常见的字段包括:“Id”、“Name”、“State”、“Mounts”、“NetworkSettings”等值。这里就不展开说明,感兴趣的小伙伴们可以自己试试。

3.1.1.2 Exited原因解析

继续说回STATUS中的Exited状态,这个状态的不同值能反应容器退出的原因,当Docker ps命令的STATUS列显示为Exited时,表示容器已经退出。Exited后面的数字表示容器退出时的状态码。状态码0表示容器正常退出,而非0的状态码表示容器异常退出。

非0的状态码通常表示容器在执行过程中遇到了错误,以下是一些常见的非0状态码及其含义:

1:一般性未知错误

2:不适用的shell或者语法错误

126:命令不可执行

127:未找到命令

128:无效的退出参数

128+n:通过信号n终止的程序

130:通过Ctrl+C终止的程序

255:退出状态码超出有效范围

需要注意的是,这些状态码并不是唯一的,具体的状态码可能会因应用程序的不同而有所不同。

3.1.1.3 logs命令

在实际使用中,建议查看容器的日志以获取更多关于错误的详细信息。如果容器运行起来后就处于Exited状态,我们除了可以通过inspect命令来查看当前退出可能的原因外,我们也可以通过docker logs命令来查看容器运行起来时的日志,具体的命令如下:

sudo docker logs 9c436ea546b9

其中“9c436ea546b9”为Container_Id。在实际应用中,我使用logs命令发现了我的进程异常退出的原因:

ubuntu@VM-77-147-ubuntu:~$ sudo docker logs 5ade7c784050
start.sh: line 7: ture: command not found

脚本写错了,把true写成了ture(这是在混元返回的基础上自己写的少量代码之一,这也说明了人没那么靠谱?)。LOL。

另外,建议在启动脚本中,启动应用时,以nohup启动并将程序的运行日志重定向到文件中。如果脚本中只是启动一个守护进程,可以在启动脚本后面增加一个循环语句或者wait命令,让镜像能持续的运行

3.4 进入容器

可以使用下面的命令进入到容器中:

sudo docker exec -it “CONTAINER ID” /bin/sh

其中CONTAINER ID为上面docker ps命令返回的第一列。进入到容器后,可以像在本地的系统一样进行调试,可以通过启动脚本或者其他命令来查看我们想要执行的命令是否正确。

3.5 关闭容器

一般来说,在本地调试时,可以通过下面的命令来进行关闭容器:

sudo docker stop “CONTAINER ID”

其中CONTAINER ID为上面docker ps命令返回的第一列。在使用stop命令后,可以再次调用ps -a命令查看当前的docker进程情况

3.6 推送镜像

在本地测试通过后,可以通过下面的命令将生成的镜像推送到镜像仓库中:

sudo docker push myusername/myimage:latest

这时在3.2.3中提到的-t的创建镜像时指定名称就起作用了,在这里指定好镜像的命令,进行推送。推送成功后,仓库中就能见到myusername目录下的标签是latest的镜像了。

3.7 更新镜像

在测试的过程中遇到了一些环境问题(这里举例说明如何更新镜像,后来环境问题通过其他方式解决了),比如我们需要使用Python 3.12,而现在Python的官网上并未正式的支持Python3.12,我们不能通过apt-install的方式进行安装,并且使用下面的命令在执行时也失败了:

sudo add-apt-repository ppa:deadsnakes/ppa

ppa安装失败。花了一些功夫没有解决掉。这时候想到了一个可以绕道的办法,像在本地安装Python3.12这样,下载Python3.12的安装文件夹,把这个文件夹拷贝到镜像中,使用3.4中提到的方法进入到容器中,再进入到Python3.12的路径下通过./configure,mak -j和make altintall的方式进行安装。安装成功后的结果:

这时退出容器,通过docker的commit方法把刚才的操作给存起来,我们从docker --help能看到docker commit的释义:

 commit      Create a new image from a container's changes

从这个能看出来,commit的作用是把现在容器中的变化给存储起来。具体的命令是:

sudo docker commit 10074a786927 myusername/myimage:v2

其中“10074a786927”是前面提到的“CONTAINER ID”。提交成功后,再push到镜像仓库中。

3.8 删除容器

在3.3中提到了如何启动容器,在3.4中提到了如何进入到容器中。除了这两点外,我们还可以使用docker ps -a命令查看当前的容器运行情况,在命令的返回结果中我们能看到容器的名字,如果我们想要删除某些容器,可以使用下面的命令来删除:

sudo docker rm my_container

其中my_container是容器的名字。

3.9 删除镜像

在前面3.2.3中我们看到可以使用docker images来查看当前的镜像的状态,如果我们有些镜像不用了,需要删除掉这些镜像,我们可以使用下面的命令来进行删除:

sudo docker rmi image_id

其中image_id是镜像的id。

4. 镜像部署

在把镜像上传到仓库后,就可以在自己的容器配置平台进行镜像部署了。由于大家的镜像部署环境和平台都不相同,大家可以参考自己的平台配置指引进行部署,这里就不给大家举例子了。

5. 拓展阅读

本篇文章只是以一个新手能快速的上手,构建自己的镜像并在容器服务上运行起来的一个操作手册,没有深入的介绍Docker的运行原理,Docker的高级用法,甚至对Docker中常用的命令介绍的也不全。各位小伙伴们如果想更深入了解Docker,可以考虑阅读更多相关技术文章。

说明:本文中的主体内容,包括第2节和第3节中的绝大部分内容都是通过和混元大语言模型交互得到的内容。也欢迎大家体验混元。

腾讯混元模型是由腾讯研发的一种大型预训练模型,旨在通过大规模数据和算力来提升模型的性能和泛化能力。该模型采用了先进的深度学习技术,具备自然语言处理、计算机视觉等多种能力,可以广泛应用于各种场景,如智能问答、内容生成、自动驾驶等,混元官网

本文由微信公众号腾讯技术工程原创,哈喽比特收录。
文章来源:https://mp.weixin.qq.com/s/9jP4syhPU0ZAiex-Vlny6Q

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:8月以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:8月以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:7月以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:8月以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:8月以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:8月以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:8月以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:8月以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:8月以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:8月以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:8月以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:8月以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:8月以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:8月以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:8月以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:8月以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:8月以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:8月以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:8月以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:8月以前  |  398次阅读  |  详细内容 »
 目录