查看docker版本
1 2 3 4
   | docker  --version docker-compose   --version docker-machine  --version docker info
   | 
 
docker常用命令
1 2 3 4
   | docker search <image> docker pull imagename docker images docker  ps -a 
   | 
 
运行nginx服务器
1
   | docker run -d -p 80:80 --name webserver nginx
   | 
 
停止服务器
删除服务器
docker命令
Docker简介
依赖于linux的cgroups和namespace
1
   | docker run -i -t ubuntu /bin/bash
   | 
 
Docker的基本组成
Docker Client/Docker Daemon
C/S架构
本地/远程
Docker Image
容器的基石(源代码)
层叠的只读文件系统
联合加载(union mount)
— 可写层
— add Apache
— add emacs
— rootfs(Ubuntu)   <————基础镜像
— bootfs
Docker Container
通过镜像启动
启动和执行阶段
写时复用(copy on write)
Docker Registry
公有和私有
从DockerHub上下载
常用命令
1 2 3 4 5 6 7 8 9 10 11
   | docker version docker search imagename docker pull imagename docker run imagename echo 'hello world' docker ps docker run learn/tutorial apt-get install -y ping docker commit containerid learn/ping 修改镜像 docker run learn/ping ping www.baidu.com docker inspect containerid  查看容器信息 docker images docker push learn/ping 保存到dockerhub中
   | 
 
Docker容器相关技术简介
Namespaces命令空间
  系统资源的隔离(包括进程、网络、文件系统)
(1)PID(Process ID) 进程隔离
(2)NET(Network) 管理网络隔离
(3)IPC 管理跨进程通信的访问
(4)MNT(Mount) 管理挂载点
(5)UTS(Unix Timesharing System) 隔离内核和版本标识
Cgroups 控制组
  用来分配资源
  来源于Google
(1)资源限制
(2)优先级限制
(3)资源计量
(4)资源控制
Docker容器的能力
(1)文件系统的隔离:每个容器都有自己的root文件系统
(2)进程隔离:每个容器都运行在自己的进程环境中
(3)网络隔离:容器间的虚拟网络接口和IP地址都是分开的
(4)资源隔离和分组:使用cgroup将cpu和内存之类的资源独立分配给每个Docker容器
Docker在Ubuntu中的安装
检查内核版本
检查Device Mapper
1
   | ls -l /sys/class/misc/device-mapper
   | 
 
(1)ubuntu维护的docker版本安装
1 2
   | sudo apt-get install -y docker.io source /etc/bash_completion.d/docker.io
   | 
 
(2)安装Docker维护的版本
1 2
   | sudo apt-get install -y curl curl -sSL https://get.docker.com/ubuntu/ | sudo sh
   | 
 
使用非root用户
1 2 3
   | sudo groupadd docker sudo gpasswd -a ${USER} docker sudo service docker restart
   | 
 
Docker的客户端和守护进程
Remote API
Restful风格API
STDIN、STDOUT、STDERROR
Docker官方的Remote API Reference:
https://docs.docker.com/reference/api/docker_remote_api/
连接方式(Socket连接)
1 2 3
   | unix:///var/run/docker.sock(默认的连接方式) tcp://host:port fd://socketfd
   | 
 
Remote API example:
1
   | nc -U /var/run/docker/docker.sock
   | 
 
Docker的远程访问
修改docker配置(vim /etc/default/docker)
1
   | sudo service docker restart
   | 
 
客户端的远程访问
1 2
   | curl http://10.211.55.5:2375/info docker -H tcp://10.211.55.5:2375 info
   | 
 
Docker_HOST环境变量
Docker守护进程的配置和操作
1 2 3 4
   | ps -ef | grep docker sudo service docker stop sudo service docker start sudo service docker restart
   | 
 
以守护的形式运行docker
docker -d [OPTIONS]
运行相关:
  -D,–debug=false
  -e,–exec-driver=”native”
  -g,–graph=”/var/lib/docker”
  –icc=true
  -l,–log-level=”info”
  –label=[]
  -p,–pidfile=”/var/run/docker.pid”
Docker服务器连接相关:
  -G,–group=”docker”
  -H,–host=[]
  –tls=false
  –tlscacert=”/home/sven/.docker/ca.pem”
  –tlscert=”/home/sven/.docker/cert.pem”
  –tlskey=”/home/sven/.docker/key.pem”
  –tlsverify=false
RemoteAPI相关:
  –api-enable-cors=false
存储相关:
  -s,–storage-driver=””
  –selinux-enabled=false
  –storage-opt=[]
Registry相关:
  –insecure-registry=[]
  –registry-mirror=[]
网络设置相关:
  -b,–bridge=””
  –bip=””
  –fixed-cidr=””
  –fixed-cidr-v6=””
  –dns=[]
  –dns-search=[]
  –ip=0.0.0.0
  –ip-forward=true
  –ip-masq=true
  –iptables=true
  –ipv6=false
  –mtu=0
Docker Command Line Reference:
  https://docs.docker.com/reference/commandline/cli
启动配置文件
  /etc/default/docker
DOCKER_OPTS = 
容器的基本操作
启动容器:
1
   | docker run image [command] [arg]
   | 
 
启动交互式容器:
1
   | docker run -i -t image /bin/bash
   | 
 
  -i –interactive=true|false 默认是false
  -t –tty=true|false 默认是false
查看容器
-a 列出所有的容器  -l列出最新创建的容器
查看运行的容器
查看所有的容器
查看最近运行的容器
1 2
   | docker ps -l  docker insepct containerId or containerName
   | 
 
Docker自定义容器名
1
   | docker run --name=test -i -t ubuntu /bin/bash
   | 
 
重新启动已经停止的容器:
删除已经停止的容器
Docker守护式容器
1
   | docker run -i -t image /bin/bash
   | 
 
Ctrl+P  Ctrl+Q
重新进入容器
1
   | docker attach containerId
   | 
 
启动守护式容器
1
   | docker run --name dc1 -d ubuntu /bin/sh "while true;do echo hello world; sleep 1;done"
   | 
 
容器日志:
  docker logs [-f] [-t] [–tail]  容器名
  -f –follows=true|false 默认为false
  -t –timestamps=true|false 默认为false
  –tail=”all”
查看容器内的进程:
1
   | docker top containerId or containerName
   | 
 
在运行的容器内启动新进程
1 2
   | docker exec [-d] [-i] [-t] 容器名  [command] [arg...] 785d8f10f6ad docker exec -i -t test01 /bin/bash
   | 
 
停止守护式容器
发送信号,等待容器停止
直接停止容器
在容器中部署静态网站
设置容器的端口映射
run [-P] [-p]
  -P,–publish-all=true|false 默认为false  暴露所有的端口
  docker run -P -i -t ubuntu /bin/bash
  -p,–publish=[]
  containerPort
    docker run -p 80 -i -t ubunbu /bin/bash
  hostPort:containerPort
    docker run -p 8080:80 -i -t ubuntu /bin/bash
  ip:containerPort
    docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
  ip:hostPort:containerPort
    docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
Nginx部署流程
1.创建映射80端口的交互式容器
1
   | docker run -p 80 --name web -i -t ubuntu /bin/bash
   | 
 
2.安装Nginx
1
   | apt-get install -y nginx
   | 
 
3.安装文本编辑器vim
4.创建静态页面
1 2 3 4 5
   | mkdir -p /var/www/html
  cd /var/www/html
  vim index.html
   | 
 
5.修改nginx配置文件
1 2 3 4 5 6 7
   | whereis nginx
  ls /etc/nginx/sites-enabled
  vim /etc/nginx/sites-enabled/default
  root /var/www/html;
   | 
 
6.运行nginx
7.验证网站访问
查看端口的映射情况
80/tcp -> 0.0.0.0:49167
查看容器中进程的运行情况
查看容器的ip地址
1 2 3
   | docker inspect web docker exec web nginx docker top web
   | 
 
查看和删除镜像
1 2 3
   | docker info sudo ls -l /var/lib/docker/aufs sudo ls -l /var/lib/docker/aufs/mnt
   | 
 
docker images:
  -a,–all=false
  -f,–filter=[]
  –no-trunc=false  指定不使用截断的形式
  -q,–quiet=false  只显示镜像的唯一id
1 2
   | docker inspect container/image docker rmi image:
   | 
 
 -f,–force=false  Force removal of the image
 –no-prune=false  Do not delete untagged parents
删除所有的镜像
1
   | docker rmi $(docker images -q)
   | 
 
构建镜像
保存对容器的修改,再次使用
自定义镜像的能力
以软件的形式打包并分发服务及其运行环境
docker commit 通过容器构建
docker build 通过dockefile文件构建镜像
docker commit [OPTIONS] containner[repository[:TAG]]
  -a,–author=”” Author
  eg  “xxx@xxx.com“
  -m,–message=”” commit message
  -p,–pause=true Pause container during commit
eg:
  (1)docker run -it -p 80 –name commit_test ubuntu /bin/bash
  (2)apt-get nginx
  (3)docker commit commit_test -a “test” -m “test” dormancypress/commit_test1
  (4)docker images
  (5)docker run -d –name nginx_web1 -p 80  dormancypress/commit_test1 nginx -g “daemon off;”
创建dockerfile
##First Dockerfile
FROM ubuntu:14.04
MAINTAINER dormancypress “xxx@xxx.com“
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
mkdir -p dockerfile/df_test1
cd dockerfile/df_test1
vim Dockerfile
docker build [OPTIONS] PATH | URL | -
  –force-rm=false
  –no-cache=false
  –pull=false
  -q,–quiet=false
  –rm=true
  -t,–tag=””
docker build -t=’dormancypress/df_test1’ . 
获取和推送镜像
查找镜像
Docker Hub:
  https://registry.hub.docker.com
docker search [OPTIONS] TERM
  –automated=false Only show automated builds
  –no-trunc=false Don’t truncate output
  -s,–stars=0 Only displays with at least X stars
拉取鏡像
docker pull
使用–registry-mirror选项加速下载
(1)修改:/etc/default/docker
(2)添加:DOCKER_OPTS = “–registry-mirror=http://MIRROR_ADDR“
https://www.daocloud.io
vim /etc/default/docker
DOCKER_OPTS = “–registry-mirror=http://MIRROR_ADDR“
sudo service docker restart
ps -ef | grep docker
docker push dormancypress/nginx
Docker指令
指令格式
(1)# Comment   注释
(2)INSTRUCTION argument 指令
基础镜像,必须是dockerfile中第一条指令
FROM    
FROM :
制定镜像的作者信息, 包含镜像的所有者和联系信息
MAINTAINER 
指定当前镜像中运行的命令(构建时运行)
RUN  (shell指令)
  /bin/sh -c command
  RUN echo hello
RUN [“executable”,”param1”,”param2”] (exec模式)
   RUN[“/bin/bash”,”-c”,”echo hello”]
指定运行该镜像的容器使用的端口
EXPOSE  […]
CMD(运行时运行)(会被docker run中指定的启动命令覆盖)
CMD“executable”,”param1”,”param2”
CMD command param1 param2 (shell模式)
CMD[“param1”,”param2”] (作为ENTRYPOINT指令的默认参数)  
不会被docker run中指定的启动命令覆盖(可以使用docker run –entrypoint覆盖)
ENTRYPOINT“executable”,”param1”,”param2”
ENTRYPOINT command param1 param2(shell模式)
CMD和ENTRYPOINT组合使用
docker run -p 80 -d –name ep_test2 dormancypress/df_test5 -g “daemon off;”
ADD包含类似tar的解压功能
ADD …
ADD ““…”“
如果单纯复制文件,Docker推荐使用COPY
COPY …
COPY [““…”“] (适用于文件路径中有空格的情况)
———————-dockerfile——————————–
##first dockerfile for test
FROM ubuntu:14.04
MAINTAINER dormancypress “xxxx@xxxx.com“
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT [“/usr/sbin/nginx”,”-g”,”daemon off;”]
添加卷
VOLUME [“/data”]
从镜像创建一个新容器时,在容器内部设置工作目录。也可以在构建中,为后续的工作指定工作目录
需要注意:通常使用绝对路径,如果使用相对路径,通常路径会传递下去
WORKDIR /path/to/workdir
用来设置环境变量
ENV 
ENV =
指定镜像会以什么样的用户运行
USER daemon
USER user  USER uid
USER user:group   USER uid:gid
USER user:gid    USER uid:group
为镜像添加触发器
当一个镜像被其他镜像作为基础镜像时执行
会在构建过程中插入指令
ONBUILD [INSTRUCTION]
—————-dockerfile—————–
#first dockerfile for test
FROM ubuntu:14.04
MAINTAINER dormancypress “xxx@xxx.com“
RUN apt-get update
RUN apt-get install -y nginx
ONBUILD COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT [“/usr/sbin/nginx”,”-g”,”daemon off;”]
Dockerfile的构建过程
(1)从基础镜像运行一个容器
(2)执行一条指令,对容器做出修改
(3)执行类似docker commit的操作,提交一个新的镜像层
(4)再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令,直至所有指令执行完毕
构建缓存
不使用构建缓存 docker build –no-cache
——————–dockerfile—————-
FROM ubuntu:14.04
MAINTAINER dormancypress “xxx@xxx.com“
ENV REFRESH_DATE 2015-04-01
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
查看镜像的构建过程
docker history image
Docker容器的网络基础
ifconfig  查看网络配置
sudo apt-get install bridge-utils 网桥管理工具
sudo brctl show 
修改docker0地址:
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0
添加虚拟网桥
sudo brctl addbr br0
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
更改docker守护进程的启动配置
/etc/default/docker中添加DOCKER_OPS值
-b=br0
容器的互联
用于测试的Docker镜像Dockefile
FROM ubuntu:14.04
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE 80
CMD /bin/bash
默认允许所有容器互联
–icc=true 默认
docker run -it –name cct1 dormancypress/cct 
nginx
ctrl+p ctrl+q
docker run -it –name cct2 dormancypress/cct
ifconfig
使用代号,避免其他容器访问该容器时,由于容器重新启动产生的ip地址变化的问题
docker run –link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]
拒绝容器间互联
vim /etc/default/docker
DOCKER_OPTS = “–icc=true”
sudo service docker restart
允许特定容器间的连接
–icc=false –iptables=true
–link
sudo /etc/default/docker
DOCKER_OPTS =”–iptables=true,–icc=false”
sudo iptables -L -n
清空iptables的设置
sudo iptables -F
Docker容器与外部网络的连接
ip_forward
–ip-forward=true  决定系统是否会转发流量
sysctl net.ipv4.conf.all.forwarding
iptables
是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含Iptables的功能
(1)表(table)
(2)链(chain)
(3)规则(rule)
ACCEPT REJECT DROP
filter表中包含的链:
INPUT 
FORWARD
OUTPUT
sudo iptables -t filter -L -n
允许端口映射访问
docker run -it -p 80 –name cct5 dormancypress/cct 
docker port cct5
限制ip访问容器
数据卷
数据卷是经过特殊设计的目录,可以绕过联合文件系统(ufs),为一个或多个容器提供访问
数据卷的特点
(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中、
(2)数据卷可以在容器之间共享和重用
(3)可以对数据卷里的内容直接进行修改
(4)数据卷的变化不会影响镜像的更新
(5)卷会一直存在,即使挂载数据卷的容器已经被删除
sudo docker run  -v ~/container_data:/data -it ubuntu /bin/bash
指定访问权限
sudo docker run -it -v ~/datavolume:/data:ro –name dvt1 ubuntu /bin/bash
使用Dockerfile构建包含数据卷的镜像:
VOLUME[“/data”]
# For data volume Test
FROM ubuntu:14.04
VOLUME [“/data/test”,”/data/test01”]
CMD /bin/bash
docker run -it –name dvt5 –volumes-from dvt4 ubuntu /bin/bash
数据卷的备份和还原
备份:
docker run –volumes-from [container name] -v $(pwd):/backup ubuntu
tar cvf /backup/backup.tar [container data volume]
docker restart dvt5
docker attach dvt5
启动容器进行备份
docker run –volumes-from dvt5 -v ~/backup:/backup –name dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolume
典型容器集群管理工具
(1)容器调度
  Docker Swarm  k8s  Apache Mesos  CoreOS Fleet Openstack Magnum
(2)配置管理(同步集群状态)
  Etcd   Zookeeper   Consul
(3)服务发现
  Etcd Haproxy  Consul
(4)日志/监控/报警
  ELK stack cAdvisor Prometheus
云集规模容器管理系统
(1)容器调度
(2)服务发现
(3)网络配置
(4)安全配置
(5)负载均衡
(6)数据持久化
(7)容错/高可用
(8)日志管理/容器监控
Docker Machine
一条命令,多环境部署
支持列表
VirtualBox  Vmware  Microsoft Hyper-V openstack Microsoft Azure RackSpace
Google Cloud Platform Amazon Web Services DigitalOcean
下载Docker machine
(1)curl -L https://github.com/docker/machine/releases/download/v0.4.0/dockder-machine_linux-amd64 > /user/local/bin/docker-machine
(2)chmod +x /user/local/bin/docker-machine
(3)docker-machine -V
(4)docker-machine create -d virtualbox test
(5)docker-machine ls
Docker machine命令集
 start/stop/restart/kill
active/config/env/inspect/ip/status/url -获取Docker machine信息
ssh 远程登陆Docker Machine
scp 本机与Docker Machine或Docker Machine之间传输文件
(1)docker-machine env test
通过本机的Docker客户端连接远端的Docker Machine
(1)eval “$(docker-machine env test)”
(2)docker run -d -t index.alauda.cn/library/ubuntu bash
(3)docker ps 
(4)docker-machine ssh test
Docker Compose
定义和运行多个Docker容器的工具
一个文件-docker-compose.yml
一条命令-docker-compose up
curl -L https://xxxx
docker-compose.yml
image:ubuntu:latest
build:/path/to/build/dir
dockerfile:使用指定的Dockerfile
command:覆盖默认命令
容器配置:
links:
  -db:database
external_links:
  -project_redis_1
ports:
  -“3000”
  -“8000:80”
expose:
  - “3000”
volumes:
  - /var/lib/mysql:/var/lib/mysql
environment:
  - MYSQL_USER = mysql
docker-compose.yml
web:
  build: .
  ports:
    - “5000:5000”
  volumes:
    - .:/code
  links:
    - redis
redis:
  image:redis
Docker Compoase命令集
管理镜像 -build/pull
管理服务 -up/start/stop/kill/rm/scale
服务状态 -ps/logs/port
一次性命令 -run
Docker Swarm
容器管理技术
Kubernetes
(1)开源Docker容器编排系统
(2)轻量级、简单
(3)公有云、私有云以及混合云中部署
(4)模块化(modular),可插拔化,可挂接,可组合
(5)自动恢复,自动重启,自动复制
kubectl get nodes
kubectl get events
Pods
创建,调度以及管理的最小单元
共存的一组容器的集合
容器共享PID,网络,IPC及UTS命令空间
容器共享存储卷
短暂存在(pending running succeed fail)
kubectl create -f pod.yaml
kubectl get pods
kutectl delete pods nginx
kubectl get pods redis -o yaml
Labels
用以标示对象(如Pod)的key/value对
组织并选择对象子集
Replication Controllers 
确保在任一时刻运行指定数目的Pod
Services
抽象了一系列Pod并定义其访问规则
固定IP地址和DNS域名
通过环境变量和DNS发现服务
负载均衡
外部服务 ClusterIP,NodePort,LoadBalancer
Docker常用命令:
https://www.jianshu.com/p/5caa68150661
常用命令
docker run -p 0.0.0.0:6000:6000 –name “test” -it centos
docker exec -it 4d34fbf944a5 /bin/bash
安装portainer管理平台
1 2 3 4 5 6 7 8 9 10 11
   |  docker search portainer
  docker pull portainer/portainer
 
  docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer
  docker run -d -p 9000:9000 --restart=always --name prtainer portainer/portainer
  http://ip:9000
 
  |