Docker容器配置
1、新建一个文件夹
文件夹列表
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上拉出来,就可以运行了)。
好啦,完成啦!
原文链接: