一、docker

1、why docker ?

2、repository、image、container、tag

3、how to use ?

1) command

# 以守护过程模式启动Dockersudo service docker start# 设置开机主动启动Dockersystemctl start docker# 查看版本docker version
# 拉取镜像 docker pull name:tagdocker pull nginxdocker pull busyboxdocker pull python:2.7# 查看镜像docker images# 删除镜像docker rmi id# 查看容器 运行中docker psdocker ps -a # 查看网络 (namespace,veth pair)docker network ls{ bridge, host, none, overlay}
# docker run 启动容器-d 后盾运行--name 指定容器名称-p 80:80 端口映射-v /root:/root 目录映射--link 链接容器--nwtwork 指定网络-c 增加运行时cmd 命令-e 增加环境变量 # docker exec name -it -it    交互模式进入容器-i --interactive-t --tty     

2) example

-- 启动nginx容器docker run -it --name web-n1 -p 80:80 -v /var/www/html:/usr/share/nginx/html -d nginx:alpine

-- 启动redisdocker run -d --name rds -p 6379:6379 redis
-- 链接容器docker run -d --link rds --name app-1 -e REDIS_HOST=rds app:1.0

3) dockerfile

dokcerfile构建:FROM  : 起源根底镜像 (scratch -> 所有镜像原始镜像)MAINTAINER :  作者<邮箱>RUN : 容器构建须要执行的命令 (创立用户组 , 创立文件夹 , 安装包 等)RUN yum -y install vim RUN yum -y install net-toolsRUN mkdir /var/wwwroot 倡议如下应用 , 应用 & 连贯 : RUN yum -y install vim \&& yum -y install net-tools \&& mkdir /var/wwwroot EXPOSE : 裸露的端口号WORKDIR : 指定在创立并且进去容器终端后的工作目录(无指定到 / 根目录)ENV : 构建镜像过程中设置的环境变量 ENV MY_PATH /var/wwwrootWORKDIR $MY_PATHADD : 将宿主机目录下的文件拷贝进镜像 , 并且会主动解决url和解压tar压缩包COPY : 相似add , 拷贝到镜像, 没有解决性能VALUME : 容器数据卷, 用于数据长久化 , 容器中创立指定的目录CMD : 指定容器启动时运行的命令 ( 多个命令只有最初一个失效 , 会被docker run之后的参数笼罩)ENTRYPOINT : 与cmd性能一样 , 会在docker run之后的参数追加命令ONBUILD : 当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发
FROM python:3.7COPY . /var/www/appWORKDIR /var/www/appRUN pip install flask redisEXPOSE 80CMD [ "python","app.py" ]
from flask import Flaskfrom redis import Redisimport osimport socketapp = Flask(__name__)redis = Redis(host=os.environ.get('REDIS_HOST','127.0.0.1'),prot=6379)@app.route("/")def incr():  redis.incr('like')  return 'current like = %s, current host = %s \n' % (redis.get('like'),socket.gethostname())if __name__ == "__main__":  app.run(host="0.0.0.0",port=80,debug=True)
# 应用dockerfile构建镜像docker build -t name:tag -f template .docker build -t app-1:1.0 .# 运行构建镜像docker run -d --link rds-1 --name app-5 -p 80:80 -e REDIS_HOST=rds-1 app-1:3.0# 进入容器docker exec -it app-5 bashcurl 0.0.0.0:80--> current like = b'1', current host = bc33562a73ea--> current like = b'2', current host = bc33562a73ea--> current like = b'3', current host = bc33562a73ea

4) cluster example

etcd + docker

overlay network

/usr/bin/dockerd -H tcp://0.0.0.02375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.xxx.xx:2379 --cluster-advertise=192.168.xxx.xx1:2375&/usr/bin/dockerd -H tcp://0.0.0.02375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.xxx.xx:2379 --cluster-advertise=192.168.xxx.xx2:2375&

4、docker-compose

1) docker-compose.yml

version: "3"services:   rds:    image: redis  app:    build:       context: .      dockerfile: Dockerfile      ports:         - 80:80        environment:           REDIS_HOST: rds          

2) scale、load balance

--scale

docker-compose up --scale app=3 -d

version: '3'services:  rds:    image: redis  app:    build:      context: .      dockerfile: Dockerfile    # ports:    # - 80:80    environment:      REDIS_HOST: rds  lib:    image: dockercloud/haproxy    links:      - app    ports:      - 80:80    volumes:      - /var/run/docker.sock:/var/run/docker.sock

3) command

cd ~/pathdocker-compose up -ddocker-compose stopdocker-compose restartdocker-compose downdocker-compose build

4) cluster

k8s, swarm