@JunQiu
2018-11-04T19:30:25.000000Z
字数 8051
阅读 2223
summary_2018/06
npm
docker
# 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"]
Tips:
1、RUN命令与CMD命令的区别在哪里?简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入image文件;CMD命令则是在容器启动后执行。另外,一个Dockerfile可以包含多个RUN命令,但是只能有一个CMD命令。
Tip:注意,指定了CMD命令以后,docker container run命令就不能附加命令,否则它会覆盖CMD命令。
2、ENV 在实际commit不要固定,生成的时候进行配置
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)
Flask
Redis
$ ls
Dockerfile app.py requirements.txt
docker build -t friendlyhello .
//-t参数用来指定image文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile文件所在的路径,上例是当前路径,所以是一个点。
Tips:生成Image时会生成一些程序依赖文件,使用dockerignore文件可以避免将依赖文件包含到image中
tag命令(为本地的 image 标注用户名和版):
//标准(可以生成的时候直接设定)
$ docker image tag [imageName] [username]/[repository]:[tag]
# login
docker login url(optioal:自己的库地址,默认Docker Hub)
docker push username/repository:tag
repository: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 details
image: username/repo:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
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 getstartedlab
docker stack deploy -c docker-compose.yml getstartedlab
// Scale the app(拓展),update docker-compose.yml,run
docker stack deploy -c docker-compose.yml getstartedlab
Tips: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 details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer: //添加一个可视化服务
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
## 一些常见的命令:
docker --version
docker build -t friendlyname . # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyname # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyname # 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 start <hash> # start container
docker container rm $(docker container ls -a -q) # Remove all containers
docker image ls -a # List all images on this machine
docker inspect <hash> # 查看image的内容
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
docker stack ls # List stacks or apps
docker stack deploy -c <composefile> <appname> # Run the specified Compose file
docker service ls # List running services associated with an app
docker service ps <service> # List tasks associated with an app
docker inspect <task or container> # Inspect task or container
docker container ls -q # List container IDs
docker stack rm <appname> # Tear down an application
docker swarm leave --force # Take down a single node swarm from the manager
// docker进入容器的几种方式
1、docker attach
docker attach 44fc0f0582d9(多个窗口会同步/阻塞)
2、nsenter(需要安装)
3、ssh(需要安装)
4、docker exec(V1.3.X,推荐)
docker exec -it 775c7c9ee1e1 /bin/bash
// 当前默认镜像:Ubuntu