在Docker的工作流中常见问题及最终方案

  • 目前搬瓦工IP被封非常多,建议使用Vultr,充5刀美5刀,按小时计费,IP随时换---点击注册送5刀
  • 这次我们创建一个Hello world的web服务器。

    现在我们可以构建我们的简单镜像了

  • -d 代表在后台运行容器
  • -p 代表我们想转发主机的5000端口到容器的5000端口
  • 但是有一些问题存在:每次代码的改变,我们都需要重新构建镜像然后重启这个容器。

    对此,有一个简单的解决方案,我们可以绑定主机的源代码文件夹到内部容器文件夹中。

    现在我们可以在主机上编辑文件看看

    现在除了容器内容封装的一些依赖关系,我们就拥有了一个相对正常的开发环境了。然而这里还有一个问题,那就是我们不能在生产环境使用这个容器,因为它正在运行的是默认的Flask webserver,它只适用于开发者,在生产环境中则效率低下并且不安全。一个好的解决方法就是采纳Docker减少开发环境和生产环境的区别,现在让我们在看一下怎么处理吧。

    uWSGI是一个为生产环境准备的应用服务器,它也可以位于类似于Nginx的web server后面。使用uWSGI代替Flask webserver会提供我们一个灵活的容器,方便我们进行设置。我们可以转换这个容器到使用uwSGI容器只需要修改Dockerfile中的两行。

    你可以使用docker logs来看一下日志uWSGI的日志信息。当然我们也可以在http://localhost:9191中看到一些uWSGI暴露的状态信息。

    但是实际上,上面会提示一个安全问题,我们使用root来运行服务了。我们可以在Dockerfile中很容易的修复这个问题,同时我们在声明一下容器监听的端口。

    #你最好在你的所有的Dockerfile中设置用户,或者在ENTRYPOINT或CMD脚本中改变用户。

    现在在容器呢把的命令不是以root来运行了,让我们运行一下这个容器试试。。

    我们可以看下那个端口被映射了

    现在还存在一个问题,那就是我们缺失了开发工具,例如调试输出和实时的代码重载。理想情况下,我们想要使用这个镜像既可以作为开发环境又可以作为生产环境。我们可以使用环境变量和一个简单的脚本来实现这个需求。

    在和Dockerfile相同的目录下创建cmd.sh,然后编辑如下内容

    然后再不加ENV=DEV的情况下运行就是成产环境了。

    小结:
    上面依次展示了一些Docker生产中可能会存在的问题。并且提供了最后的解决方案。

    未经允许不得转载:国外便宜VPS » 在Docker的工作流中常见问题及最终方案

    赞 (0) 打赏

    觉得文章有用就打赏一下文章作者

    支付宝扫一扫打赏

    微信扫一扫打赏