我们用Python代码演示,代码都是共通的大家都要了解下。

这次我们创建一个Hello world的web服务器。

mkdir -p identidock/app   

#首先创建一个新的multiidentidock来存放我们的项目,在这个目录下面,创建一个app目录来存放Python代码。touch app/identidock.py  

#在app目录下创建identidock.py
# 编辑identidock.py的内容
from flask import Flask
app = Flask(__name__)  #初始化Flask和设置应用对象
@app.route('/')     #创建一个与URL关联的路由,当这个URL被请求,它会调用hello_world函数。
def hello_world():return "Hello Docker!\n"
if __name__ == '__main__':app.run(debug=True,host='0.0.0.0')  #初始化Python web服务器,使用0.0.0.0作为主机参数绑定了所有的网络接口
#现在我们需要一个存放Python代码的容器然后运行它。在identidock目录下面创建一个Dockerfile文件,并且编辑如下内容
FROM python:3.4
RUN pip install Flask==0.10.1
WORKDIR /app
COPY app /app
CMD ["python" "identidock.py"]

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

docker build -t identidock .
……
docker run -d -p 5000:5000 identidock
  • -d 代表在后台运行容器

  • -p 代表我们想转发主机的5000端口到容器的5000端口

curl localhost:5000    #进行测试
Hello World!

但是有一些问题存在:每次代码的改变,我们都需要重新构建镜像然后重启这个容器。

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

docker stop $(docker ps -ql)  #停止最近创建的容器
docker rm $(docker ps -lq)    #删除最近创建的容器
docker run -d -p 5000:5000 -v $(pwd)/app:/app identidock
-v $(pwd)/app:/app 参数绑定app目录到容器的/app。 它会覆盖容器内/app的内容,同时对于容器内部也是可写的(你也可以挂载为只读模式)-v 参数必须是绝对路径。
curl localhost:5000  #测试
Hello world!

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

sed -i 's/World/Docker/' app/identidock.py  #使用sed快速替换World为Docker,你也可以使用正常的文本编辑器。
curl localhost:5000
Hello Docker!

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

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

FROM python:3.4
RUN pip install Flask==0.10.1 uWSGI==2.0.8
WORKDIR /app
COPY app /app
CMD ["uwsgi", "--http", "0.0.0.0:9090", "--wsgi-file", "/app/identidock.py", \"--callable", "app", "--stats", "0.0.0.0:9191"]
docker build -t identidock  #构建这个镜像,然后运行它我们可以看到其中的不同
……
docker run -d -p 9090:9090 -p 9191:9191 identidock
curl localhost:9090
Hello Docker!

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

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

FROM python:3.4
RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI==2.0.8
WORKDIR /app
COPY app /app
COPY cmd.sh /
EXPOSE 9090 9191
USER uwsgi
CMD ["uwsgi","--http","0.0.0.0:9090","--wsgi-file","/app/identidock.py", \
"--callable","app","--stats","0.0.0.0:9191"]
docker build -t identidock . #重建这个镜像
...
docker run identidock whoami
uwsgi

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

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

docker run -d -P --name port-test identidock
#-P 让Docker自动的映射一个大数字的本地主机端口到容器内部。

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

docker port port-test
9090/tcp -> 0.0.0.0:32769
9191/tcp -> 0.0.0.0:32768
curl localhost:32769 #现在做个测试
Hello Docker!

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

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

#!/bin/bash set -e
if [ "$ENV" = 'DEV' ]; thenecho "Running Development Server"exec python "identidock.py"
elseecho "Running Production Server"exec uwsgi --http 0.0.0.0:9090 --wsgi-file /app/identidock.py \--callable app --stats 0.0.0.0:9191
fi
chmod +x cmd.sh
#编辑Dockerfile
FROM python:3.4
RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI==2.0.8
WORKDIR /app
COPY app /app
COPY cmd.sh /
EXPOSE 9090 9191
USER uwsgi
CMD ["/cmd.sh"]
docker stop $(docker ps -q)
docker rmr $(docker ps -aq)
docker build -t identidock .  #重建镜像
docker run -e "ENV=DEV" -p 5000:5000 identidock
Running in development environment.* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)* Restarting with stat* Debugger is active!* Debugger pin code: 290-812-275
docker run -p 5000:5000 -v $(pwd)/app:/app -e "ENV=DEV" identidock #这时我们可以实时修改代码了

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

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

docker容易内部怎么编辑_在Docker的工作流中常见问题及最终方案相关推荐

  1. jar docker镜像不能启线程_使用docker部署SpringCloud项目

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:现实太狗ochttps://blog.csdn.net/u011508407/ 分类 ...

  2. docker 容器运行 golang程序_「Docker」 - 运行 amp; 管理容器

    容器是基于容器技术所建立和运行的轻量级应用运行环境,它是Docker封装和管理应用程序或微服务的「集装箱」,在Docker中,容器是最核心的部分. 一.容器的创建和启动 Docker容器的生命周期里分 ...

  3. Docker——容器内部执行宿主机的docker命令

    现在有一个需求是在容器内部使用docker命令,但试了一下报命令不存在 解决办法: 把docker相关的命令和依赖使用-v挂载到容器 docker@box:~$ docker run -it -d \ ...

  4. docker搭建java测试环境_基于docker构建测试环境

    目录 0x01介绍 0x02 镜像基本操作 0x03 容器基本操作 0x04 容器的修改与保存 0x05 使用Dockerfile定制镜像 0x01介绍 Docker 是一个开源的应用容器引擎,基于 ...

  5. docker 查看容器磁盘大小_软件安全 : Docker逃逸详解

    前言 在虚拟化技术日益成熟的今天,Docker作为必须使用的一项服务,它的安全性尤为重要.今天,我们来一起学习Docker最大的安全威胁--逃逸技术. Docker是什么 Docker 是一个开源的应 ...

  6. docker部署python web应用_在 Docker 中运行一个 Python 的 Web 应用

    几周前, Elastic Beanstalk声明在AWS云中配置和管理Docker容器.在本文中,我们通过一个简单的注册表单页面应用去理解Docker部署过程,该表单使用Elastic Beansta ...

  7. docker部署python web应用_安装docker并部署web项目

    一.docker简介 1.docker定义:docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以装笔,书包可以放书一样.你可以把"hello world!"放到docke ...

  8. docker image设置jdk版本_使用Docker搭建Java环境的步骤方法

    Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,源代码托管在 Github 上, 遵从Apache2.0协议开 ...

  9. docker redis 删除集群_基于Docker的Redis集群实践

    单机版的Redis相信大家都比较熟悉了,这里介绍几种Redis的集群模式,并结合Docker来进行实践操作 abstract.png 准备工作 通过Docker下载最新的Redis镜像 # 获取red ...

最新文章

  1. 【我的Android进阶之旅】推荐一款能提升数十倍效率的Android应用开发助手
  2. 算法实现没思路?最全Python算法实现大礼包!(附学习资源)
  3. Yann LeCun:距离“真正的” AI,我们还缺什么?
  4. 监控利器Prometheus初探
  5. 004_JavaScript版本
  6. ccna学习指南笔记9
  7. preg_filter用法
  8. javascript数据结构与算法---队列
  9. MySQL的ibdata1文件占用过大
  10. 浏览器宽度和高度的说明
  11. NLP—2.语言模型及文本表示
  12. 95.不同的二叉搜索数II(力扣leetcode) 博主可答疑该问题
  13. PyCharm主题更换
  14. HTML 参考手册- (HTML5 标准)
  15. 服务器网卡多路径配置文件,IPSAN(五)IPSAN多路径设置(客户端)
  16. 杰理之ANC对照目标曲线【篇】
  17. [JZOJ4274] 终章-剑之魂
  18. Zookeeper客户端Curator详解
  19. 2018年SEO网络营销新技巧,如何让新网站快速收录与排名
  20. 使用代理爬去微信公众号_使用微信公众号开发模拟面试功能

热门文章

  1. 一文带你看网络协议之因特网中的转发和编址! | 原力计划
  2. 37岁程序员被裁!120天找不到工作?不想被淘汰,这可能是你最后的机会
  3. 20 道必看的 Vue 面试题 | 原力计划
  4. 官宣!阿里进军 5G,成立 XG 实验室发力新基建
  5. 助力开发者的魔法式“绝招儿”,你了解几个?
  6. 41 款实用工具,数据获取、清洗、建模、可视化都有了
  7. Java、Python 竟成区块链主流开发语言?!
  8. 意大利不禁止华为;13 款 5G 手机时间表公布;亚马逊 CEO 遭威胁 | 极客头条
  9. 张小龙「跳一跳」都玩到 6000 多分,是时候掌握微信小游戏高级开发了
  10. 被马云、周鸿祎、李书福等人拉黑的微信,究竟犯了哪些众怒?