新版博客SEO优化基本完成,新老博客内容正在整合中,保证每篇文章高质量。 SiteMap RSS Github
Docker学习记录(二)
嘉美伯爵   2019年7月17日 11:31   运维   Docker   206  

打包并运行一个镜像

使用 Dockerfile 定义容器

在空白目录下,新建 Dockerfile 文件,内容如下

# 将官方 Python 运行时用作父镜像
FROM python:2.7-slim

# 将工作目录设置为 /app
WORKDIR /app

# 将当前目录内容复制到位于 /app 中的容器中
ADD . /app

# 安装 requirements.txt 中指定的任何所需软件包
RUN pip install -r requirements.txt

# 使端口 80 可供此容器外的环境使用
EXPOSE 80

# 定义环境变量
ENV NAME World

# 在容器启动时运行 app.py
CMD ["python", "app.py"]

项目代码

在Dockerfile同级目录下,新建app.py 和 requirements.txt

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

requirements.txt

Flask
Redis

构建应用

docker build -t friendlyhello .    # . 即当前目录,也可指定绝对路径

访问

docker run -p 4000:80 firsthello/flask

容器连接

  • 端口映射并不是唯一把 docker 连接到另一个容器的方法。
  • docker有一个连接系统允许将多个容器连接在一起,共享连接信息。
  • docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。

镜像运行参数

  • p:自定义映射端口信息

  • P:Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口

  • d:后台运行

docker run -d -P --name flask_project firsthello/flask
  • v:宿主机的/test目录挂载到容器的/soft目录

  • t:docker分配一个伪终端并绑定到容器的标准输入上

  • i:让容器的标准输入保持打开

docker run -it -v /test:/soft centos /bin/bash
  • restart:always自动重启
docker run -d -p 8652:8652 --restart=always --name tools --link mysqldb:mb tools:v1
  • e:传入的环境变量参数
docker run  --name mysqlb  -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=emos -d mysql:5.6.2 --character-set-server=utf8mb4 --max_allowed_packet=1024M --tmp_table_size=1024M --max_heap_table_size=1024M --innodb_log_file_size=512M --innodb_buffer_pool_size=1024M --innodb_log_buffer_size=512M  --skip-new

容器通讯

  • 外部通信

docker 外部通信可以使用宿主机的ip和运行docker容器时指定的端口映射来访问(-p 8000:8000)

sudo docker run -d -p 8888:8888 --name test-flask testflask:v1

  • 内部通信

镜像tooltooltool中的数据库host为mb,这样在启动镜像的时候通过name两个镜像就完成了通信

docker run -d --name nodetest --link mysqldb:mb  testflask:latest

  • 与宿主机通信

如果我们在一个容器内访问另一个容器的mysql服务,可以使用docker inspect 来查看镜像的IP地址进行访问

下面方法,测试但未生效

参考文档

docker 访问宿主机

docker 的 link 和 network 网络互连问题

外部访问docker容器(docker run -p/-P 指令)

关于对docker run --link的理解

那些让你看起来很牛逼的Docker使用技巧

Docker与自动化部署