例子

    1. from python:3
    2. RUN pip install flask
    3. RUN pip install redis
    4. RUN mkdir /data
    5. COPY hello.py /data/
    6. WORKDIR /data
    7. EXPOSE 5000
    8. ENV FLASK_APP=/data/hello.py
    9. ENTRYPOINT ["flask", "run", "-h", "0.0.0.0"]

    解释

    • from:表示基础镜像是 python:3;
    • RUN:表示在 docker build 的时候会执行后面的几个命令;
    • COPY:拷贝文件或者目录都可以;
    • WORKDIR:表示启动容器之后,当前的工作目录;
    • EXPOSE:表示容器要暴露 5000 端口;
    • ENV:环境变量;
    • ENTRYPOINT:表示 Docker 容器的启动进程。这里 entrypoint 中的 flask run 我们增加了参数 -h 0.0.0.0。如果不加这个参数的话,进程默认绑定到 127.0.0.1,外面是没有办法访问的。
    docker run -p 5000:5000 --link redis-test:redis-host -d --name web web:v1
    

    其中有一个运行参数需要进行简单说明,也就是 —link。link 后面跟一对映射的值,左侧的为已经存在的 Docker 容器,右侧的为该容器映射到我们启动的 Docker 应用中的 host 名字,这里也就是 web 这个 Docker 容器。我们下面通过 docker exec 进入到容器中看一下 link 是怎么做的。

    [root@docker ~]# docker exec -ti 64eef1f67c39 /bin/bash
    root@64eef1f67c39:/data#
    

    我们查看一下 hosts 文件。

    root@64eef1f67c39:/data# cat /etc/hosts
    127.0.0.1    localhost
    ::1    localhost ip6-localhost ip6-loopback
    fe00::0    ip6-localnet
    ff00::0    ip6-mcastprefix
    ff02::1    ip6-allnodes
    ff02::2    ip6-allrouters
    172.17.0.5    redis-host 0d748e8ce766 redis-test
    172.17.0.6    64eef1f67c39
    

    我们可以看到 redis-host 已经被写到 hosts 中,所以我们在 web 这个 Docker 容器中就可以通过 redis-host 这个主机名访问到 Redis 容器了,这也是我们的应用代码的写法。