Docker从入门到精通之Docker Compose

Docker从入门到精通之Docker Compose,第1张

Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,只需一个命令,就可以从配置中创建并启动所有服务。

用python构建一个简易网页统计网页点击量,docker-compose进行发布

Step1:创建项目

Step2:创建Dockerfile文件

Step3:在docker-composeyml中定义services

Step4:用Docker compose构建和运行app

Step5:绑定一个数据卷

将当前目录与容器的/code目录绑定,这样可以动态修改代码

Step6:重新构建和运行app

先docker-compose down停止服务,在构建

用YAML文件定义服务,默认文件是docker-composeyml,包含4个顶级key,version、services、networks、volumes

参考compose-spec/specmd at master · compose-spec/compose-spec · GitHub

指定本 yml 依从的 compose版本

定义多个应用服务,包含环境配置、镜像构建等

指定构建镜像的路径

定义服务的block IO配置,参考compose-spec/specmd at master · compose-spec/compose-spec · GitHub

指定自定义容器名称

定义服务间启动或关闭的依赖关系

覆盖容器启动的默认命令

domainname declares a custom domain name to use for the service container

覆盖容器默认的entrypoint

从文件中添加环境变量到容器,可以是一个或多个文件

文件格式:

添加环境变量

暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口

用于检测 docker 服务是否 健康 运行。

指定容器运行的镜像

设置容器标签

连接到另一个容器的网络,简单将就是让容器相互连通

服务的日志记录配置,driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项

仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。

syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。

设置网络模式,格式如下:

配置容器连接的网络

指定ip地址

端口映射,映射主机与容器端口,格式:Host:ontainer

容器重启策略

存储敏感数据,比如密码

将主机数据卷挂载到容器

覆盖容器工作目录

1shell方式启动

如dockerfile中定义

CMD "/run"

则容器内的PID为1的进程为/bin/sh -c "/run"

另外又有个进程/run

2exec方式启动

如dockerfile中定义

CMD ["/run"]

则容器内的PID为1的进程直接就是/run

有何不同?退出机制可能大不相同

背景: docker stop的时候,会向PID为1的进程发送SIGTERM信号,通知进程关闭。如果10秒钟依然没有关闭,将会发送SIGKILL强制kill进程。

不同之处:

1exec启动的进程会接收到SIGTERM信号,程序自行处理该信号,清理资源,优雅关闭。

2shell启动的进程会接收到SIGTERM信号,但是shell进程没有处理该信号的逻辑,所以直接忽略该信号。

一直等到10秒后超时,收到了SIGKILL信号,强制kill所有的进程。

这时资源来不及释放,会导致各种数据不一致的问题。

在Docker中,容器的配置和数据是分离的,因此在修改配置文件后需要重新启动容器才能生效。如果您修改了容器中的配置文件,但是重启容器后发现配置没有生效,可能是以下原因之一:

1 容器中的配置文件不是您想要修改的文件:有些应用程序可能会从多个配置文件中读取配置,而您修改的可能不是正在使用的配置文件。您可以查看应用程序的文档或者配置文件来确定正确的配置文件位置。

2 挂载配置文件的方式不正确:Docker可以通过挂载本地文件系统上的文件来替换容器中的文件。如果挂载的本地文件系统上的文件不是您想要使用的配置文件,或者挂载的路径不正确,那么容器中的配置文件将不会被替换。您可以通过检查`docker run`或`docker-compose`命令中的挂载路径是否正确来解决此问题。

3 Docker镜像缓存:Docker在构建容器时使用缓存,如果您在容器中增加了新的配置文件,但是没有更新Docker镜像,则容器使用的可能是旧的镜像,从而导致配置文件没有生效。您可以使用`docker-compose build --no-cache`命令来避免Docker镜像缓存的问题。

如果您已经确认修改了正确的配置文件,并且挂载路径也正确,那么您可以尝试使用以下步骤来解决问题:

1 停止容器:`docker stop <container_name>`

2 删除容器:`docker rm <container_name>`

3 重新启动容器:`docker run --name <container_name> -v <local_config_path>:<container_config_path> <image_name>`

其中`<local_config_path>`是本地文件系统上的配置文件路径,`<container_config_path>`是容器中的配置文件路径,`<container_name>`是容器的名称,`<image_name>`是容器所使用的镜像名称。

通过这些步骤,您可以重新启动容器,并且使用新的配置文件。

那么对于宿主机上运行的服务比,在容器内运行有以下两种优势

1配置:将服务放入容器,提前配置好提供服务所需的程序、库、配置文件等,无须担心宿主机是否有这些组件。若有需要也很容易将容器迁移到另一个宿主机上。

2隔离:每个容器有自己单独的文件系统和网络接口,能按需运行多个相同的服务容器。每个容器使用各自的IP和端口来公开其服务,这些服务之间不会彼此冲突。

在虚拟机内安装容器测试后发现虚拟机内的容器性能接近于物理机。

1查看容器镜像 docker ps -a

2进入容器里面 docker exec -it f74716b965d7 /bin/bash 或者 docker exec -it f74716b965d7 "bash"

3在容器内运行命令 apt-get update

如图所示可以安装想装的软件了 apt-get install vim

registry是一个位置——在那里能够找到许多repository相关联的镜像。

repository是一个名字——Docker用它来代表多个镜像。

docker search ubuntu

docker search -s 10 ubuntu

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速。Docker 官方和国内很多云服务商都提供了国内加速服务,我们以 Docker 官方加速 >

docker容器cpu占用过高会卡死。

当docker容器的CPU占用较高时,容器可能会变得不稳定,尤其在系统资源不足的情况下容易出现问题。容器的CPU占用率一直很高,而系统资源却不足以满足容器的需要,容器将会发生阻塞或卡死情况,导致应用程序无法响应或者终止运行。

除了CPU占用过高,大量的I/O读写 *** 作、内存泄漏、网络延迟等因素也容易导致容器的卡死和运行不稳定。

我们可以轻易地在Docker容器中运行大多数GUI程序且不出错。Docker是一个开源项目,提供了一个打包、分发和运行任意程序的轻量级容器

的开放平台。它没有语言支持、框架或者打包系统的限制,并可以运行在任何地方、任何时候,从小型的家用电脑到高端的服务器都可以运行。这让人们可以打包不

同的包用于部署和扩展网络应用,数据库和后端服务而不必依赖于特定的栈或者提供商。

下面是我们该如何在Docker容器中运行GUI程序的简单步骤。本教程中,我们会用Firefox作为例子。

1 安装 Docker

在开始前,我们首先得确保在Linux主机中已经安装了Docker。这里,我运行的是CentOS 7 主机,我们将运行yum管理器和下面的命令来安装Docker。

# yum install docker

# systemctl restart dockerservice

2 创建 Dockerfile

现在,Docker守护进程已经在运行中了,我们现在准备创建自己的Firefox

Docker容器。我们要创建一个Dockerfile,在其中我们要输入需要的配置来创建一个可以工作的Firefox容器。为了运行 Docker

镜像我们需要使用最新版本的CentOS。要创建 Docker 镜像,我们需要用文本编辑器创建一个名为Dockerfile的文件。

# nano Dockerfile

接着,在Dockerfile中添加下面的行并保存。

#!/bin/bash

FROM centos:7

RUN yum install -y firefox

# 用你自己的 uid /gid 替换下面的0

RUN export uid=0 gid=0

RUN mkdir -p /home/developer

RUN echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash">>/etc/passwd

RUN echo "developer:x:${uid}:">>/etc/group

RUN echo "developer ALL=(ALL) NOPASSWD: ALL">>/etc/sudoers

RUN chmod 0440/etc/sudoers

RUN chown ${uid}:${gid}-R /home/developer

USER developer

ENV HOME /home/developer

CMD /usr/bin/firefox

注意:在第四行的配置中,用你自己的用户和组id来替换0。 我们可以用下面的命令在shell或者终端中得到uid和gid。

# id $USER

3 构造Docker容器

下面我们就要根据上面的Dockerfile构建一个容器。它会安装firefox浏览器和它需要的包。它接着会设置用户权限并让它可以工作。这里镜像名是firefox,你可以根据你的需要命名。

# docker build --rm -t firefox

4 运行Docker容器

现在,如果一切顺利,我们现在可以在运行在CentOS 7镜像中的Docker容器里面运行我们的GUI程序也就是Firefox浏览器了。

# docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/X11-unix:/tmp/X11-unix firefox

总结

在Docker容器中运行GUI程序是一次很棒的体验,它对你的主机文件系统没有任何的伤害。它完全依赖你的Docker容器。

以上就是关于Docker从入门到精通之Docker Compose全部的内容,包括:Docker从入门到精通之Docker Compose、docker容器中进程启动的两种模式、docker修改conf配置重启容器配置没有了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9803075.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存