版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013867301/article/details/83963584
暂不考虑win10(坑太多),用linux操作
均来自官网,为方便查询,记录一下
操作系统相关
#linux 将docker添加到非root用户
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
#dns修改,在/etc/docker/daemon.json中加入,8.8.8.8备用,需重启service
"dns": ["your_dns_address", "8.8.8.8"]
docker命令
#查看命令
docker
#查看信息
docker --version
docker version
docker info
#查看镜像
docker image ls
#运行镜像
docker run <imgName>
docker run -it <imgName> <shellPath> #以shell窗口交互式创建容器,shellPath 如 /bin/bash
docker run -i -t [-v hostDirectoryPath:containerDirectoryPath] <imgName> <shellPath>
#进入已有容器
docker exec -it <container> <shellPath>
#删除镜像,如果有多个镜像,可以指定名称进行删除
docker rmi [imgId|imgName]
docker image rm $(docker image ls -a -q) #删除所有
#查看容器
docker container --help
docker container ls [--all] [-q]
docker ps -a
# 停止容器运行
docker container stop <container id>
docker container kill <container hash>
#删除容器
docker rm <container hash>
docker container rm <hash>
# 服务
docker service ls
docker service ps <service>
docker inspect <task or container>
# 登录到registry
docker login
# 使用dockerfile创建app,标记tag,
docker build -t <tagName> <dockerfilePath>
# 给镜像添加仓库标记,最后的标签用来区分和标记版本
docker tag <imageName> username/repository[:tag]
# 上传到标记的仓库,之后可以用username/repository:tag作为imageName
docker push username/repository:tag
# 运行app,-d表示后台,-p表示对端口转化
docker run [-d] [-p 4000:80] <tagName>
# stack移除app
docker stack rm <appname>
docker stack ls
# 部署服务,支持修改属性后重新运行立即生效
docker stack deploy -c <composefile> <serviceName>
# 初始化swarm, 不写地址则是本机为manager
# docker-machine ls命令会显示端口号为2376,这是daemon的端口。所以这里不能用,一般可以设置为2377或者不写
docker swarm init [--advertise-addr 192.168.99.100]
# 加入到swarm中,token是初始化时返回的
docker swarm join --token SWMTKN-1-5q563y5uytmtydmr7i745whalm2z8ejivahlfwmfc6ofd7j7x7-92kddt6kcrscjxg4wj874k06s 192.168.99.100:2377
# 从任何节点离开swarm
docker swarm leave
# 从manager离开
docker swarm leave --force
# 在manager上查看节点信息
docker node ls
docker node inspect <node ID>
# 创建vm
docker-machine create --driver virtualbox <machineName>
docker-machine ls
# 会输出一些export和命令,你可以执行命令,让shell配置,这样就可以直接和vm交互。
docker-machine env <machineName>
# ssh进入虚拟机,并执行“command”命令,此方式可以直接登录vm,但是不能操作主机文件
docker-machine ssh <machine> "<command>"
# 跨机器拷贝,windows下需要git bash等linux terminal
docker-machine scp <file> <machine>:~
# 将环境变量配置到shell的方式打印出来,执行最后的提示语之后,vm会变成active
docekr-machine env <machineName>
# 重置env的配置
eval $(docker-machine env -u)
# 启动
docker-machine start <machine-name>
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
# change proxy
ENV http_proxy host:port
ENV https_proxy host:port
# Run app.py when the container launches
CMD ["python", "app.py"]
requirements.txt
Flask
Redis
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)
docker-compose.yml
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:
- "4000: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
redis:
image: redis
ports:
- "6379:6379"
volumes:
- "/home/docker/data:/data"
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet: