@JunQiu
2018-11-04T11:30:25.000000Z
字数 8051
阅读 2595
summary_2018/06 npm docker

# Use an official Python runtime as a parent imageFROM python:2.7-slim# Set the working directory to /appWORKDIR /app# Copy the current directory contents into the container at /appADD . /app# Install any needed packages specified in requirements.txtRUN pip install --trusted-host pypi.python.org -r requirements.txt# Make port 80 available to the world outside this containerEXPOSE 80# Define environment variableENV NAME World# Run app.py when the container launchesCMD ["python", "app.py"]Tips:1、RUN命令与CMD命令的区别在哪里?简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入image文件;CMD命令则是在容器启动后执行。另外,一个Dockerfile可以包含多个RUN命令,但是只能有一个CMD命令。Tip:注意,指定了CMD命令以后,docker container run命令就不能附加命令,否则它会覆盖CMD命令。2、ENV 在实际commit不要固定,生成的时候进行配置
from flask import Flaskfrom redis import Redis, RedisErrorimport osimport socket# Connect to Redisredis = 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)
FlaskRedis
$ lsDockerfile app.py requirements.txtdocker build -t friendlyhello .//-t参数用来指定image文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile文件所在的路径,上例是当前路径,所以是一个点。Tips:生成Image时会生成一些程序依赖文件,使用dockerignore文件可以避免将依赖文件包含到image中
tag命令(为本地的 image 标注用户名和版)://标准(可以生成的时候直接设定)$ docker image tag [imageName] [username]/[repository]:[tag]# logindocker login url(optioal:自己的库地址,默认Docker Hub)docker push username/repository:tagrepository:REPOSITORY tag:TAG(版本/标签)
docker run -p 4000:80 friendlyhello //本地或从仓库拉取//将该容器的端口80映射到4000参数说明:docker container run -p 8000:3000 -it demo:0.0.1 /bin/bash-p参数:容器的 3000 端口映射到本机的 8000 端口。-it参数:容器的Shell映射到当前的Shell,然后你在本机窗口输入的命令,就会传入容器。demo:0.0.1:image文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用Shell。(这个可以直接写在dockerfile中,CMD node demos/01.js,它表示容器启动后自动执行node demos/01.js)
## 什么是服务???在分布式应用程序中,应用程序的不同部分称为“服务”。例如,如果您想象一个视频共享站点,它可能包括一个用于将应用程序数据存储在数据库中的服务,一个用于在后台进行视频转码的服务。用户上传内容,前端服务等。服务实际上只是“生产中的容器”。服务只运行一个映像,但它编码了映像的运行方式-它应该使用哪些端口,应该运行多少个容器副本,以便服务具有所需的容量,以及等等。扩展服务会更改运行该软件的容器实例的数量,从而为流程中的服务分配更多计算资源。## docker中的service一个docker-compose.yml文件是一个YAML文件,它定义了如何Docker容器在生产中应表现version: "3"services:web:# replace username/repo:tag with your name and image detailsimage: username/repo:tagdeploy:replicas: 5resources:limits:cpus: "0.1"memory: 50Mrestart_policy:condition: on-failureports:- "80:80"networks:- webnetnetworks:webnet:该docker-compose.yml文件告诉Docker执行以下操作:Pull the image from the registry.将该映像的5个实例作为一个被调用的服务运行web,限制每个实例使用,最多10%的CPU(跨所有内核)和50MB的RAM。如果失败,立即重启容器。Map port 80 on the host to web’s port 80.webnet使用默认设置(负载平衡的覆盖网络)定义网络。// stack是swarm上的概念docker swarm init//run app,set name getstartedlabdocker stack deploy -c docker-compose.yml getstartedlab// Scale the app(拓展),update docker-compose.yml,rundocker stack deploy -c docker-compose.yml getstartedlabTips:Docker将进行就地更新,无需首先拆除堆栈或杀死任何容器。放大,会直接增加,减少会杀死容器。// Take the app down with docker stack rm:docker stack rm getstartedlab// Take down the swarm.docker swarm leave --force//docker ps :查看运行的实例
群集是一组运行Docker并加入群集的计算机。加入群组后,它们被称为节点。Swarm管理器可以使用多种策略来运行容器,例如“emptiest node” - 它使用利用率最低的机器。群集管理器是群中唯一可以执行命令的机器,或授权其他机器作为工作者加入群集。工人只是在那里提供能力,并且没有权力告诉任何其他机器它能做什么和不能做什么。//初始化当前机器为集群管理器docker swarm init//比如我们在上面service中的使用(只有一个节点的集群),更多见原文。。。。
//栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起。//添加服务通过修改docker-compose.yml,并配置swarm如何调度容器version: "3"services:web:# replace username/repo:tag with your name and image detailsimage: username/repo:tagdeploy:replicas: 5restart_policy:condition: on-failureresources:limits:cpus: "0.1"memory: 50Mports:- "80:80"networks:- webnetvisualizer: //添加一个可视化服务image: dockersamples/visualizer:stableports:- "8080:8080"volumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:placement:constraints: [node.role == manager]networks:- webnetnetworks:webnet:
## 一些常见的命令:docker --versiondocker build -t friendlyname . # Create image using this directory's Dockerfiledocker run -p 4000:80 friendlyname # Run "friendlyname" mapping port 4000 to 80docker run -d -p 4000:80 friendlyname # Same thing, but in detached modedocker container ls # List all running containersdocker container ls -a # List all containers, even those not runningdocker container stop <hash> # Gracefully stop the specified containerdocker container kill <hash> # Force shutdown of the specified containerdocker container rm <hash> # Remove specified container from this machinedocker container start <hash> # start containerdocker container rm $(docker container ls -a -q) # Remove all containersdocker image ls -a # List all images on this machinedocker inspect <hash> # 查看image的内容docker image rm <image id> # Remove specified image from this machinedocker image rm $(docker image ls -a -q) # Remove all images from this machinedocker login # Log in this CLI session using your Docker credentialsdocker tag <image> username/repository:tag # Tag <image> for upload to registrydocker push username/repository:tag # Upload tagged image to registrydocker run username/repository:tag # Run image from a registrydocker stack ls # List stacks or appsdocker stack deploy -c <composefile> <appname> # Run the specified Compose filedocker service ls # List running services associated with an appdocker service ps <service> # List tasks associated with an appdocker inspect <task or container> # Inspect task or containerdocker container ls -q # List container IDsdocker stack rm <appname> # Tear down an applicationdocker swarm leave --force # Take down a single node swarm from the manager// docker进入容器的几种方式1、docker attachdocker attach 44fc0f0582d9(多个窗口会同步/阻塞)2、nsenter(需要安装)3、ssh(需要安装)4、docker exec(V1.3.X,推荐)docker exec -it 775c7c9ee1e1 /bin/bash// 当前默认镜像:Ubuntu