前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker系列(3):一文学会使用Docker

Docker系列(3):一文学会使用Docker

作者头像
Homqyy
发布2023-03-06 13:21:54
2800
发布2023-03-06 13:21:54
举报
文章被收录于专栏:知行合一知行合一

前言

至今入IT的6年小跑中,学过见过的很多,但记住的不多。记忆犹新的是《代码大全》作者“Steve McConnell”说的一句话“应当对所有重复事情零容忍”,而Docker来的时间刚刚好,给我带来了全方面的效率提升。

Docker作为新时代的产物拥有许多靓丽的地方,很多人对Docker应该还是很迷茫,除了觉得使用它去部署程序或则环境简单外并没有其他的认知或者应用。

Docker可以从以下几个方面提供帮助:

  • 研发人员可以通过Docker去构建与项目贴合的开发环境,并利用Docker的打包和分发能力轻松的进行共享。
  • 运维人员可以通过Docker Compose去编排本机服务,通过k8s去编排集群服务。
  • 程序员更可以结合插件化的VSCode编辑器去打造程序员个人的修仙炉

对个人使用来说,集群服务暂且用不到,因此主要应用的是“修仙炉”和“Compose”。“修仙炉”是对多语言傍身或者多项目开发者来说的利器法宝,而Compose则是主机运维工作的利器法宝。

此次进阶过程我们从几个维度展开:

  • 运行容器
  • 构建镜像
  • 配置容器
  • 编排主机服务
  • 分享容器

在开始前需要先简单了解下容器状态变迁过程:

图中所示的动作都是docker命令。即:

  • docker create命令创建容器,容器的初始状态为“停止”。
  • docker start命令用于启动容器,使容器进入“运行”状态。
  • docker pause命令将容器中的所有进程暂停,使容器进入“暂停”状态。
  • docker unpause命令恢复容器中被暂停的进程,使容器重新进入“运行”状态。
  • docker stop命令用来停止容器,使容器进入“停止”状态。
  • docker rm命令用来删除容器。
  • 如果在docker create的时候,给了--restart参数,且容器在“运行”时抛出了异常,这时候容器会自动重启。

因此,容器的生命周期从docker create开始,直至docker rm后消亡。


运行容器

从上文我们了解到了docker createdocker start两个命令分别用于“创建”和“运行”容器。而在实际使用中却很少见,那是因为还有一个更便利的命令docker run,该命令能自动完成创建和运行两个动作,除此之外,如果本地没有存在所需的镜像的话,它还能自动从Registry拉取镜像:

代码语言:javascript
复制
$ docker run -d --name http homqyy/example_http
  • -d:daemon,后台运行的意思。
  • --name:设置容器名称,比如这里设置容器名称为http
  • homqyy/example_http:用来运行容器的镜像,homqyy是作者,example_http是镜像名称。

通过docker ps命令,可以查看当前正在运行的容器:

  • 如上所示,我们可以看到一个名(NAMES)为http的容器正在运行,其运行了两分钟(STATUS: Up 2 minutes),它是通过镜像(IMAGEhomqyy/example_http创建的,且创建于2分钟前(CREATE: 2 minutes ago)。

既然运行了容器,那么我们肯定有操作容器内部进程或文件的需求,就像我们通过操作虚拟机一样。docker也同样支持,只需要使用docker exec命令即可,该命令时可以实现:在目标容器中执行特定命令:

代码语言:javascript
复制
$ docker exec -it http bash
  • -i:interactive,交互的意思,它将目标容器的STDIN映射到当前终端。
  • -t:tty,伪终端的意思,它将为目标容器创建一个伪终端(这里不详细展开,它超过了本文章的陈述范围),配合-i就起到了跟虚拟机一样的效果,即:打开一个终端(输出),并将输入映射到此容器中。
  • http:目标容器的名称,这里也可以用容器的ID,即在本示例中的 2d9afdd06269
  • bash:要在容器中运行的命令,这里是bash,因此相当于在目标容器中运行一个shell程序,同时由于我们创建了终端并映射了输入,从而达到了跟虚拟机一样的效果。

这时候用ls命令看一下目录情况,可以明显的看出我们已经进入到容器内部中了。我们尝试修改下容器中的nginx配置文件/etc/nginx/nginx.conf,并通过命令/usr/sbin/nginx -t测试一下配置文件是否有误:

代码语言:javascript
复制
$ sed -i 's/listen 8080/listen 8081/g' /etc/nginx/nginx.conf
$ /usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • 为了方便,我这里直接用sed工具来修改配置文件:将listen 8080改为listen 8081
  • 当然,这里就不进行reload重载配置了。

由于容器默认情况下是不允许直接被访问的,因此我们此时打开浏览器访问:”http://localhost:8080″是无法访问成功的:

为了能够在宿主机中访问容器的服务,需要开放端口,方法是在docker run命令中追加-p参数来指定端口的映射关系,例如这里再新起一个http服务:

代码语言:javascript
复制
$ docker run -d --name http2 -p 50000:8080 homqyy/example_http
  • -p <host_port:container_port/protocol>:此参数可以指定端口映射关系,此样例的意思是将主机的50000端口映射到容器的8080端口,这意味着可以访问主机的50000端口来访问容器中的8080端口,即:在主机的浏览器中访问http://localhost:50000就相当于访问容器中的8080端口的服务。
    • host_port:宿主机的端口
    • container_port:容器中的端口
    • protocol:协议,值可以是udptcp
  • 此时再次用主机的浏览器访问http://localhost:50000,将得到正确的返回。

这里需要注意,至此总共运行了httphttp2两个容器,且是由相同的镜像homqyy/example_http产生的,这里表明了镜像与容器的关系是“1对n”的。这是查看一下两个容器,看一下彼此间的区别,可以观察到PORTS列有明显区别:

代码语言:javascript
复制
$ docker ps |grep homqyy/example_http
... PORTS                                                     NAMES
... 80/tcp, 0.0.0.0:50000->8080/tcp, :::50000->8080/tcp       http2
... 80/tcp, 8080/tcp                                          http
  • http2体现出了主机和容器的映射关系,这也说明我们可以通过此来查看容器与主机的映射关系。
  • 而那些没有映射关系的端口是怎么出现的?其实是“镜像”的作者在构建镜像的时候手动指示的,用来告知使用者,运行容器时会提供哪些端口服务。

在运行完样例后可以开始清除容器和镜像了:

代码语言:javascript
复制
$ docker stop http
$ docker rm http
$ docker stop http2
$ docker rm http
$ docker rmi homqyy/example_http

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年8月30日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 运行容器
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档