关于 Docker 的概念是确实不太好总结,下面我通过四点向你说明 Docker 到底是个什么东西。
看一张 Docker 架构图
下面是对架构中基本组成说明,比较详细,大家看的时候可以对着架构图看。概念这个东西,你看下就好,怎么记都记不住的,只有你常用的东西才会记住和想着去记住它,看完本文,可以把下面的应用实践一遍。
镜像仓库,存储大量镜像,可以从镜像仓库拉取和推送镜像。
类似虚拟机快照,从仓库拉取,或者在现有工具镜像上创建新镜像。通过镜像可以启动容器。
从镜像中创建应用环境,以单进程的方式运行。对外公开服务。是一种短暂的和一次性的环境。
数据卷可以完成数据持久化,数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
Docker 容器之间的网络交互,可以使用端口映射
的方式,其他容器可以直接通过端口实现。除该方式外还有一个容器连接(linking)系统
也可以达到容器交互。(本文中 node 连接 mongodb 使用的是端口映射的方式)
关于Docker 网络模块,容器连接详情推荐这篇文章:Docker的网络模式详解
Koa2
初始化一个 Node
项目,通过 Mongose
中间件 连接 Mogodb
数据库,实现一个基础接口 Mogodb
插入数据。项目地址:https://github.com/koala-coding/dockerstudy # /usr/src/nodejs/dockerstudy/.dockerignore
.git
node_modules
Dockerfile
文件(Dockerfile 这里重点讲一下)部署 Node项目
的时候,会有一个 Dockerfile
文件配置
# /usr/src/nodejs/hello-docker/Dockerfile
FROM node:10.0
# 在容器中创建一个目录
RUN mkdir -p /usr/src/nodejs/
# 定位到容器的工作目录
WORKDIR /usr/src/nodejs/
# RUN/COPY 是分层的,package.json 提前,只要没修改,就不会重新安装包
COPY package.json /usr/src/app/package.json
RUN cd /usr/src/app/
RUN npm i
# 把当前目录下的所有文件拷贝到 Image 的 /usr/src/nodejs/ 目录下
COPY . /usr/src/nodejs/
EXPOSE 3000
CMD npm start
配置参数说明( DockerFile 学习):
FROM:FROM 是构建镜像的基础源镜像,该 Image 文件继承官方的 node image。
详细说明:Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令!它引入一个镜像作为我们要构建镜像的基础层,就好像我们首先要安装好操作系统,才可以在操作系统上面安装软件一样。
RUN:后面跟的是在容器中要执行的命令。
详细说明:每一个 RUN
指令都会新建立一层,在其上执行这些命令,我们频繁使用 RUN
指令会创建大量镜像层,然而 Union FS
是有最大层数限制的,不能超过 127
层,而且我们应该把每一层中我用文件清除,比如一些没用的依赖,来防止镜像臃肿。
WORKDIR:容器的工作目录
COPY:拷贝文件至容器的工作目录下,.dockerignore 指定的文件不会拷贝
EXPOSE:将容器内的某个端口导出供外部访问
CMD:Dockerfile 执行写一个 CMD 否则后面的会被覆盖,CMD 后面的命令是容器每次启动执行的命令,多个命令之间可以使用 && 链接,例如 CMD git pull && npm start
详细说明:CMD
指令用来在启动容器的时候,指定默认的容器主进程的启动命令和参数。它有两种形式
CMD echo 1
CMD ["npm", "run", "test"] 必须是双引号
第一种执行的命令会被包装程,CMD [ "sh", "-c", "echo 1" ] JSON
数组形式,一般推荐 JSON
数组形式。容器中的应用都应该以前台执行,而不是启动后台服务,容器内没有后台服务的概念。对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义。比如 CMD service nginx start
它等同于 CMD [ "sh", "-c", "service nginx start"]
主进程实际上是 sh
,sh
也就结束了,sh
作为主进程退出了。
ENV(补充)
ENV
指令用来设置环境变量,它有两种形式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
4.代码环节暂且告一段落,将带有 Dockerfile 提交到 github 或 gitlab等。
以我的服务器 centos7
为例,已安装好 Docker
。
5.首先检出代码,把项目克隆到指定目录
git clone https://github.com/koala-coding/dockerstudy
6.进入目录构建
cd dockerstudy
docker build -t dockerstudy .
★
build
命令用来制作镜像,-t
是给镜像打标签,-f
参数是指定Dockerfile
路径,由于我们使用的是默认Dockerfile
名称,所以可以不同填写该参数。最后一个.
也不要省略,表示Dockerfile
文件的所在目录, 代表是当前路径,它指定镜像构建的上下文。我们刚才说过,真正制作镜像的是docker server
,当我们执行build
命令时,docker client
会将上下文路径下的所有内容打包,然后上传给docker server
。这样当我们要在 Dockerfile 文件中执行 如COPY
指令,就可以将上下文中的文件复制到镜像中去了。”
构建目标名称 dockerstudy,是一个镜像,可以通过 docker images 来列出所有的镜像。
一般应该会将 Dockerfile
置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker
引擎,那么可以用.gitignore
一样的语法写一个 .dockerignore
。
7.通过镜像 dockerstudy
创建一个容器并运行。
docker run --name dockerstudycontainer -d -p 3000:3000 dockerstudy
说明:创建的容器名称是 dockerstudycontainer
,你可以理解为 pid
,这个名称唯一,创建之后如果不删除会一直存在。-p 用来指定端口映射,将容器的端口
3000映射到主机
3000`端口上,这样就可外部访问了。
此时在宿主机中可以使用curl
测试服务器提供的服务是否正常
curl localhost:3000
或者可以直接在浏览器中请求接口看一下输出
创建容器后,有时候需要看一下容器资源占用,使用docker stats
docker stats dockerstudycontainer
★如果是购买的阿里云或者腾讯云服务器,注意这里将自己购买的 centos 服务器
3000
端口开放,在安全组”
8.进入容器
docker ls -a 查看所有容器,包括当前容器的id
docker exec -it <id> bash
9.日志检查 查看运行日志,“50425b8f2ef3” 为容器 ID
$ docker logs -f 50425b8f2ef3
但是到了这里我还有个问题,那我真想看日志文件的时候,也不能每个容器进去看日志,好浪费时间啊!有没有什么更高的方式?我会在下一篇文章《线上环境如何优雅的打印,保存,分析日志》中写到。
docker pull mongo
2.创建一个docker容器
docker run -p 27017:27017 -v /data/db --name docker_mongodb -d mongo
在上面的命令中,几个命令参数的详细解释如下:
-p
参数主动将容器内部端口给暴漏出来,将服务器的 27017
端口映射到容器的 27017
端口,这样在外网就可通过 服务器的 27017
端口访问到我们的服务,Mongodb 默认端口为 27017
。最终访问的还是本机的端口)3.测试连接容器中的 Mongodb
以上是 MongoDB 容器创建后的信息。接下来,我们使用 Robo 3T 图形界面软件尝试打开数据库。打开 RoBo 3T,选择新建连接,按照下图填入相关数据库信息,保存。
★注意其中的权限认证。连接数据库时候可能失败,会出现问题,这时候注意一个问题,安全组问题,需要把安全组中的
27017
的 Mongodb 数据库端口打开”
Compose 是 Docker 官方开源的一个项目,可以管理多个 Docker 容器组成一个应用,例如 Web 服务,除了服务本身还有数据库、Redis、Nginx 等一系列相关联服务需要安装。
有个 Compose 的支持,我们只需要定义一个 YAML 格式的配置文件(docker-compose.yml),来编写一个项目所需要的多个容器配置及调用关系,通过简单的命令即可同时开始或者关闭这些容器。Compose 定位是定义和运行多个 Docker 容器的应用。在这篇文章中不具体讲 DockerCompose 使用,主要讲清楚 Docker 基本架构各部分的应用,多实践下哦!
环境隔离('隔离,安全')
Docker 实现了资源隔离,一台机器运行多个容器互无影响。
更高效的资源利用(节约成本)
Docker 容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
更快速的交付部署(敏捷)
使用 Docker,开发人员可以利用镜像快速构建一套标准的研发环境,开发完成后,测试和运维人员可以直接通过使用相同的环境来部署代码。
更易迁移扩展(可移植性)
Docker 容器几乎可以在任意的平台上运行,包括虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性让用户可以在不同平台之间轻松的迁移应用。
更简单的更新管理(高效)
使用 Dockerfile,只需要很少的配置修改,就可以替代以往大量的更新工作。并且所有修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理。
docker pull [镜像名称:版本] 拉取镜像
docker images 镜像列表
docker rmi [镜像名称:版本] 删除镜像
docker history [镜像名称] 镜像操作记录
docker tag [镜像名称:版本][新镜像名称:新版本]
docker inspect [镜像名称:版本] 查看镜像详细
docker search [关键字] 搜索镜像
docker login 镜像登陆
docker ps -a 容器列表(所有容器)
docker ps 查看所有(运行的)容器
docker exec -ti <id> bash 以 bash 命令进入容器内
docker run -ti --name [容器名称][镜像名称:版本] bash 启动容器并进入
docker logs 查看容器日志
docker top <container_id> 查看容器最近的一个进程
docker run -ti --name [容器名称] -p 8080:80 [镜像名称:版本] bash 端口映射
docker rm <container_id> 删除容器
docker stop <container_id> 停止容器
docker start <container_id> 开启容器
docker restart <container_id> 重启容器
docker inspect <container_id> 查看容器详情
docker commit [容器名称] my_image:v1.0 容器提交为新的镜像
在上面实战中已经详细讲解,可以返回看,这里就不再重复写。
读完本文后,你应该掌握了 Docker 的基本使用,对 Docker 这个概念不那么陌生了,并且知道了它的应用场景,可以自己实践下,这个过程也会出现很多问题的,实践才能更好的记住那些知识以及常用命令。
本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/HxmclgHW3i-l0GPpsEKLCA
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。