前提摘要:
1. 安装Docker(最新版本)
2. 阅读 Docker入门核心概念1
3. 测试当前docker环境 docker run hello-world
新的开发环境
过去使用python开发时,首先要安装python开发环境,然后创建程序运行所需的一切,即便开发环境中可以正常的运行,但是在产品环境当中就不一定了。
使用docker,你可以抓取一个便携的python运行环境来作为一个镜像,没有安装过程的必要了。这些便携的镜像可以通过一个 Dockerfile 来进行定义
使用 Dockerfile 定义容器
Dockerfile定义什么运行在容器的环境当中。像访问网络接口和磁盘驱动一样的资源访问会被虚拟化,它会与操作系统剩余的部分进行隔离,所以你需要映射外部的端口。定义需要从外部环境所需要复制的文件。无论如何,你都会希望,通过Dockerfile定义构建的app,无论在哪都可以正常的运行。
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
COPY . /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"]
Dockerfile 关联着我们还没创建的文件 app.py 和 requirements.txt.
requirements.txt
Flask
Redis
app.py
fromflaskimportFlaskfromredisimportRedis,RedisErrorimportosimportsocket# Connect to Redisredis=Redis(host="redis",db=0,socket_connect_timeout=2,socket_timeout=2)app=Flask(__name__)@app.route("/")defhello():try:visits=redis.incr("counter")exceptRedisError:visits="<i>cannot connect to Redis, counter disabled</i>"html="<h3>Hello {name}!</h3>"\"<b>Hostname:</b> {hostname}<br/>"\"<b>Visits:</b> {visits}"returnhtml.format(name=os.getenv("NAME","world"),hostname=socket.gethostname(),visits=visits)if__name__=="__main__":app.run(host='0.0.0.0',port=80)
(代码是我从官网粘贴的,可用其他代码替换即可)
构建App
docker build -t friendlyhello .
(在刚才创建文件的目录当中)
执行后,查看本地镜像: docker image ls
REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398
在构建的时候,可能会遇到代理和DNS域名解析问题,处理方式见如下链接:
https://docs.docker.com/get-started/part2/#build-the-app
运行这个app
docker run -p 4000:80 friendlyhello
-p 选项,docker运行的容器中的80端口,对应着依赖的主机内核4000端口
-d 选项 后台运行该实例
关闭实例
docker container stop 实例id
分享镜像
创建的镜像上传至云服务器当中(使用docker public registry)
如果使用阿里云等镜像仓库管理,见该链接:https://docs.docker.com/get-started/part2/#run-the-app
首先登陆
docker login
为镜像打上版本号(标签)
docker tag image username/repository:tag
eg:
docker tag friendlyhello gordon/get-started:part2
上传镜像至服务器
docker push username/repository:tag
然后就可以通过远程拉去并运行该镜像了
docker run -p 4000:80 username/repositiory:tag
总结一下:
其实本篇文章写的就是关于如下命令的使用:
docker build -t friendlyhello . # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode
docker container ls # List all running containers
docker container ls -a # List all containers, even those not running
docker container stop <hash> # Gracefully stop the specified container
docker container kill <hash> # Force shutdown of the specified container
docker container rm <hash> # Remove specified container from this machine
docker container rm $(docker container ls -a -q) # Remove all containers
docker image ls -a # List all images on this machine
docker image rm <image id> # Remove specified image from this machine
docker image rm $(docker image ls -a -q) # Remove all images from this machine
docker login # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag # Tag <image> for upload to registry
docker push username/repository:tag # Upload tagged image to registry
docker run username/repository:tag # Run image from a registry