Docker容器配置

1、新建一个文件夹

docker在container中新建文件夹 docker创建文件夹_docker

文件夹列表

docker在container中新建文件夹 docker创建文件夹_python_02

2、定义一个容器 Dockerfile

Dockerfile定义您的容器内环境中发生了什么。访问网络接口和磁盘驱动器等资源是在此环境中虚拟化的,与系统的其余部分隔离,因此您需要将端口映射到外部世界,并明确要将哪些文件“复制”到那个环境。但是,在完成这些之后,您可以期望在其中定义的应用程序的构建 Dockerfile在其运行的任何位置都完全相同。

编辑Dockerfile

# Use an official Python runtime as a parent image

FROM python:2.7-slim

# Set the working directory to /app

WORKDIR /app

# Copy the current directory contents into the container at /app

ADD . /app

# Install any needed packages specified in requirements.txt

RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container

EXPOSE 80

# Define environment variable

ENV NAME World

# Run app.py when the container launches

CMD ["python", "app.py"]

另外还有两个文件,一个是:requirements.txt,一个是:app.py

都要在同一目录下

当上述Dockerfile被内置到的图像,app.py和 requirements.txt是因为存在Dockerfile的ADD命令,并从输出app.py是通过HTTP得益于访问EXPOSE 命令。

# requirements.txt 内容如下
Flask 
Redis
# 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)

现在运行build命令

这会创建一个Docker镜像,我们将使用-t它来标记,因此它有一个友好的名称。

# 注意后面空格有个点
docker build -t friendlyhello .

Successfully tagged friendlyhello:latest

我构建的镜像跑到哪里去了?他们在你本地的镜像库里面:friendlyhello这个就是的。

root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker image ls
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 friendlyhello       latest              99fa0c4345cf        4 minutes ago       151MB
 <none>              <none>              e21d979e3223        6 minutes ago       140MB
 python              2.7-slim            46ba956c5967        12 days ago         140MB
 hello-world         latest              e38bc07ac18e        5 weeks ago         1.85kB
 root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest#



如果有停止一个镜像,可能需要强制停止

root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker rmi 99fa0c4345cf --force
 Untagged: friendlyhello:latest
 Deleted: sha256:99fa0c4345cf9dd423945342f0d2fa4b460e36932edf58c0973fc991e5068d24
 Deleted: sha256:f6071820b82680b2eb179a8bc5584451f6e69c2672ef3989040698fa36a66f13
 Deleted: sha256:517f33d026cd6ba5ce5433aa4ee575a6e47aa228030c76fda1ffe6ded5abca10
 Deleted: sha256:7564cd520ac57faa1032a04f6b7894c09fb08d4e6349c80377d9b74666135274
 Deleted: sha256:585d0dbb4c234c5243d8098c175565dc8158968537f4904b5797f6b0aca88977


6、如果有故障了,就看看这里(针对Linux用户的故障排除)

代理服务器在启动并运行后可以阻止与您的网络应用程序的连接。如果您位于代理服务器的后面,请使用以下ENV命令为代理服务器指定主机和端口,将以下行添加到Dockerfile中:

# Set proxy server, replace host:port with values for your servers
 ENV http_proxy host:port
 ENV https_proxy host:port


代理服务器设置 
DNS错误配置可能会产生问题pip。您需要设置您自己的DNS服务器地址才能pip正常工作。您可能需要更改Docker守护程序的DNS设置。您可以/etc/docker/daemon.json使用dns密钥编辑(或创建)配置文件,如下所示:

{
   "dns": ["your_dns_address", "8.8.8.8"]
 }


在上面的例子中,列表的第一个元素是你的DNS服务器的地址。第二项是Google的DNS,当第一项不可用时可以使用它。 
在继续之前,保存daemon.json并重新启动泊坞窗服务。 
sudo service docker restart 
一旦修复,重试运行build命令。

7、运行应用程序

运行应用程序,使用以下命令将计算机的端口4000映射到容器的已发布端口80 -p:下面这样就是运行成功了

root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker run -p 4000:80 friendlyhello
  * Serving Flask app "app" (lazy loading)
  * Environment: production
    WARNING: Do not use the development server in a production environment.
    Use a production WSGI server instead.
  * Debug mode: off
  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)



您应该看到Python正在为您的应用提供服务的消息http://0.0.0.0:80。但是该消息来自容器内部,它不知道你将该容器的端口80映射到4000,从而制作正确的URL http://localhost:4000。

那么我现在要从外部去访问它,如果是阿里云的话,需要开启安全组 

通过ip:端口的方式来访问 

后台运行

root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker run -p 4000:80 friendlyhello
  * Serving Flask app "app" (lazy loading)
  * Environment: production
    WARNING: Do not use the development server in a production environment.
    Use a production WSGI server instead.
  * Debug mode: off
  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
 45.76.53.148 - - [17/May/2018 09:29:05] "GET / HTTP/1.1" 200 -
 45.76.53.148 - - [17/May/2018 09:29:06] "GET /favicon.ico HTTP/1.1" 404 -



这种方式按Ctrl+C就退出了,不好,我们要在后台运行,只需要多一个-d就可以了。

root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker run -d -p 4000:80 friendlyheol 
 ca08a914abea5290bb7cdf422c335b77738fc23e7f6c6ba596165a021daf4584
 root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest#



8、查看正在运行的容器(一个程序对应一个容器)

docker container ls

root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker container ls
 CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                  NAMES
 ca08a914abea        friendlyhello       "python app.py"     About a minute ago   Up About a minute   0.0.0.0:4000->80/tcp   friendly_minsky
 root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest#



9、停止这个程序,结束这个进程

现在docker container stop用来结束这个过程,使用CONTAINER ID如下所示:

//查看container Id
 root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker container ls
 CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                  NAMES
 ca08a914abea        friendlyhello       "python app.py"     About a minute ago   Up About a minute   0.0.0.0:4000->80/tcp   friendly_minsky
 //结束
 root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker container stop ca08a914abea
 ca08a914abea
 //没有了
 root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest# docker container ls
 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 root@iZbp162mb58mqtz72o389nZ:~/docker/pythontest#



三、分享我的镜像

1.为了演示我们刚才创建的可移植性,我们上传我们构建的映像并在其他地方运行它。毕竟,当您想要将容器部署到生产环境时,您需要知道如何推送注册表。

注册表是存储库的集合,而存储库是图像的集合 - 有点像GitHub存储库,但代码已经创建。注册表上的帐户可以创建许多存储库。该dockerCLI使用公共注册表默认情况下。

注意:我们在这里使用Docker的公共注册表仅仅是因为它是免费和预先配置的,但有许多公共选项可供选择,甚至可以使用Docker Trusted Registry设置您自己的私有注册表。
2.使用您的Docker ID登录

如果您没有Docker帐户,请在cloud.docker.com注册一个帐户 。记下你的用户名。

2.1 登录到本地计算机上的Docker公共注册表。

root@iZbp162mb58mqtz72o389nZ:~# docker login
 Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
 Username: xiongben
 Password: 
 Login Succeeded
 root@iZbp162mb58mqtz72o389nZ:~#



2.2 标记图像

将本地映像与注册表中的存储库相关联的符号是 username/repository:tag。该标签是可选的,但建议使用,因为它是注册管理机构用于为Docker镜像提供版本的机制。为该上下文提供存储库并标记有意义的名称,例如 get-started:part2。这将图像放入get-started存储库并标记为part2。 
现在,把它放在一起来标记图像。docker tag image使用您的用户名,存储库和标签名称运行,以便将图像上传到您想要的目的地。该命令的语法是:

docker tag image username/repository:tag
 1
 运行如下:root@iZbp162mb58mqtz72o389nZ:~# docker tag friendlyhello xiongben/get-started:part2


1
2.3 需要去创建一个docker的仓库

例如我创建了一个get-started。 
docke cloud 

2.4 运行docker图像ls以查看新标记的图像。

root@iZbp162mb58mqtz72o389nZ:~# docker image ls
 REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
 friendlyhello          latest              7f2dee16bc71        2 hours ago         151MB
 xiongben/get-started   part2               7f2dee16bc71        2 hours ago         151MB
 <none>                 <none>              e21d979e3223        2 hours ago         140MB
 python                 2.7-slim            46ba956c5967        12 days ago         140MB
 hello-world            latest              e38bc07ac18e        5 weeks ago         1.85kB



2.5 发布镜像

root@iZbp162mb58mqtz72o389nZ:~# docker push xiongben/get-started:part2
 The push refers to repository [docker.io/xiongben/get-started]
 bb1832784221: Pushed 
 3769158c31ac: Pushed 
 2ac6ade48cac: Pushed 
 a40d037570f2: Mounted from library/python 
 4e1a46391216: Mounted from library/python 
 10dd6271862c: Mounted from library/python 
 ba291263b085: Mounted from library/python 
 part2: digest: sha256:ce25797c1fb3d95fc7393f015ea584be0c110e0469e186813ee755f41f76922a size: 1787
 root@iZbp162mb58mqtz72o389nZ:~#



2.6 看下这样就成功了

root@iZbp162mb58mqtz72o389nZ:~# docker push xiongben/get-started:part2
 The push refers to repository [docker.io/xiongben/get-started]
 bb1832784221: Pushed 
 3769158c31ac: Pushed 
 2ac6ade48cac: Pushed 
 a40d037570f2: Mounted from library/python 
 4e1a46391216: Mounted from library/python 
 10dd6271862c: Mounted from library/python 
 ba291263b085: Mounted from library/python 
 part2: digest: sha256:ce25797c1fb3d95fc7393f015ea584be0c110e0469e186813ee755f41f76922a size: 1787
 root@iZbp162mb58mqtz72o389nZ:~#



四、从远程存储库中提取并运行图像

从现在开始,您可以使用docker run此命令在任何机器上使用并运行您的应用程序

docker run -p 4000:80 username/repository:tag


那么来运行一下试一试:

root@iZbp162mb58mqtz72o389nZ:~# docker run -p 4000:80 xiongben/get-started:part2
  * Serving Flask app "app" (lazy loading)
  * Environment: production
    WARNING: Do not use the development server in a production environment.
    Use a production WSGI server instead.
  * Debug mode: off
  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)



访问一下: 
无论在哪里docker run执行,它都会将您的图像,Python以及所有依赖项从中拉出requirements.txt,然后运行您的代码。它们都在一个整洁的小包中一起旅行,并且您不需要在主机上安装任何Docker来运行它(意思是这样你的机器上安装的docker环境,你不需要再将程序传上去,直接从cloud上拉出来,就可以运行了)。
好啦,完成啦!


原文链接: