代码改变世界

docker入门

2016-09-06 09:42  雪霁  阅读(4869)  评论(4编辑  收藏  举报

一、介绍

1、 Docker的特性:

  • 文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。
  • 资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup。
  • 网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址。
  • 日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
  • 变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
  • 交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上。


2、docker 应用场景

  • 加速本地开发:快速搭建好开发环境和运行环境。
  • 自动打包和部署应用。
  • 创建轻量级的私有Paas环境。
  • 自动化测试和持续集成。
  • 创建安全沙盒。


二、环境搭建:
Docker对Linux环境有两个要求,一是64位系统,二是内核在3.8以上。 下面以centos 上搭建为例:
docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push、pull命令从公有或者私有仓库下载、上传镜像;Docker Registry私有服务器用于保存管理我们的私有镜像。
需要注意的是CentOS 6.X与7.0的安装是有一点点不同的,CentOS-6上docker的安装包叫docker-io,并且来源于Fedora epel库,这个仓库维护了大量的没有包含在发行版中的软件,所以先要安装EPEL,而CentOS-7的docker直接包含在官方镜像源的Extras仓库(CentOS-Base.repo下的[extras]节enable=1启用)。前提是都需要联网。


centos 6.8 的具体安装启动过程如下。

  • yum -y install docker-io
  • service docker start
  • chkconfig docker on

centos 7 的安装启动过程如下

  • yum -y install docker
  • systemctl start docker.service
  • systemctl enable docker.service


三、基本操作&命令

简单查询:

  •    docker info
  •    docker search imangeName 从长款查询容器。
  •    docker inspect imageName:version  查看镜像设置

镜像相关:

  • docker images 查看所有本地镜像。
  • docker pull NAME[:TAG|@DIGEST]    下载镜像:eg: docker pull centos  等级   docker pull centos:latest
  • docker imi imageId  删除镜像(前提:镜像启动的容器都已经被删除。)
  • 本地镜像的总描述文件

       centos6.8: /var/lib/docker/repositories-devicemapper.json ( 注意centos 6.8 没有var/lib/docker/image/文件夹, 在docker 1.10 后,容器的所有配置文件同意移动到了 /var/lib/docker/image文件夹中)

       centos7.X: /var/lib/docker/image/devicemapper/repositories.json

  • 本地单个镜像的文件:

           centos  /var/lib/docker/graph/{imageid}/
           json -保存着关于这个镜像的元数据
           layersize – 一个整数,表示layer的大小。
           存储: 一个镜像就是的基础是一系列的layers,   一个docker 镜像就是一组制度的layer组成,

           docker 1.7之前: docker images --tree  可以查看一个镜像包含的所有layers         

                      1.7之后: dockviz images -d |dog -Tpng -o images.png

  •   容器储存储位置 centos 6.8/7 :

            由于目Docker支持AUFS,Btrfs,Device mapper,OverlayFS,ZFS五种存储驱动,所有各自存储的位置是不一样的

  • 命令查看 docker image   结构 :

            centos 6.8 &docker1.7:       docker daemon -D -s overlay  -g /varlib/docker  首先会提示内核版本过低

  1. root@ssdpc admin]# docker -d 
  2. WARN[0000] You are running linux kernel version 2.6.32-642.1.1.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0. 
  3. INFO[0000] Listening for HTTP on unix (/var/run/docker.sock) 
  4. INFO[0000] [graphdriver] using prior storage driver "devicemapper" 
  5. WARN[0000] Running modprobe bridge nf_nat failed with message: , error: exit status 1 
  6. INFO[0000] Loading containers: start.                   
  7. INFO[0000] Loading containers: done.                    
  8. INFO[0000] Daemon has completed initialization          
  9. INFO[0000] Docker daemon                                 commit=786b29d/1.7.1 execdriver=native-0.2 graphdriver=devicemapper version=1.7.1
复制代码

             
容器相关:

  • docker ps  :  查询当前启动的容器,   docker ps -a  (所有的包含停止的)
  • docker stop  xxx: 停止容器
  • docker start  containId 可以启动一个已经停止的容器
  • docker rm   xxx:   删除停止的容器
  • ducker run 启动一个容器 , 参数说明

        -d  后台运行
        -t -i 合用, 交互模式运行
        -net 指定网络, 默认bridge (会使用172段的ip依次分配给启动的docker 容器), host  模式为共享主机的网络配置和端口。
        -p 当net不为host 模式时, 将容器的端口 映射到宿主机器的端口上。
        --ip  指定容器的ip 
        -e 环境变量设置

  • docker cp container:path hostpath  这个命令是从容器内复制文件到指定的路径上
  • 镜像保存1: 导入导出容器为镜像 export & import :

           docker export containId  >mycontain.tar  注意导出只是容器的静态文件快照,docker file 描述将会丢失。
           cat mycontain.tar |docker import - tqcommontomcat:0.01   导入发布为本地的一个镜像。

  • 镜像保存2:导入导出镜像为镜像 2 save & load:

           docker  save imageName:version > save.tar  或者   docker save -o save.tar imageName:version保存镜像,包含layers ,和dockerfile
            docker  load < /home/save.tar 或  docker load -i save.tar

  • 镜像保存3:   commit ,提交当前容器为一个镜像

         docker commit contarinId  imageName:version


docker daemon 

所谓docker damemon 即为docker server 主进程, centos 6.8 : /etc/init.d/docker start ,  centos 7 :  systemctl start docker.service

Docker 1.10增加了新功能(http://geek.csdn.net/news/detail/54953),从这个版本以后,用户在Linux上跑Docker时都不必再以root权限运行了。
  1.10之前所有容器都只能在Docker daemon下以root权限运行。
  安全的命名空间. 通过命名空间,Docker 1.10将Docker daemon和容器区别开来,对二者的权限分别加以处理,同时为各个容器分配相应的权限等级。在1.10下,Docker daemon仍然要取得主机的root权限,但容器就可以不用了。
传统的容器管理工具 LXC 即将退出 Docker 的舞台,
在 Linux 内核版本 3.10+ 上,使用内嵌的 overlay 驱动来完成跨主机的网络互联

在docker 1.10以前: 启动dokcer server 实际执行命令为:docker   -d $other_args 
    设置dns使用 docker -d --dns 8.8.8.8
    设置dns搜索域 docker -d --dns-search example.com
    输出调试log   docker -d -D

在docker 1.10 后:   docker daemon $other_args 
    docker daemon -D -s overlay -g /var/lib/docker

进入容器内部: 

  •   docker attach 老方式
  • docker exec -ti   containId  /bin/bash


容器网络
docker network  ls 列出所有容器的网络id ,和网络模式

docker network inspect networkId 列出网络的详细信息

docker network connect  --option  containId 为运行中容器创建网络

dockerfile 相关

  • FROM imagename:version   时以每个镜像为基础 layer
  • ENV  key  value 设置环境变量
  • ADD hostFIle  imagePath   把宿主机器上的文件添加的镜像中, 请使用绝对路径
  • WORKDIR  xxx  容器启动时默认工作目录
  • RUN  commond   是指build 过程中随便执行的命令, 例如在镜像中创建文件等。
  • VOLUME  讲宿主本地目录挂载到容器上
  • CMD  设置容器启动的时候执行的命令
  • ENTRYPOINT   container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条ENTRYPOINT没有CMD的可替换特性


四、example
镜像tqtestjava:2.0 制作,tqtestjava:2.0 是一个userauth 和userauthweb的运行环境, 

容器启动的功能包括:   

1、能够在容器内部自动更新svn代码.

2、自动mvn install ,自动启动两个java .

3、容器的端口自动映射.


4、容器打包
   下载一个基础的centos 镜像,docker pull centos 
   以交互模式启动centos 容器:  docker run -d -ti  centos /bin/bash, 
   进入容器bash后,安装yum , net ,  jdk, svn ,maven , svn co 社管代码到 /usr/local/project/zhejiange 下, 编写启动脚本/usr/local/start_zhejiang.sh
  (这里需要注意的是我一开始讲许多环境变量设置在/etc/profile 中,其实对docker 来说,这可能是无效的,因为docker 的许多镜像,都市linux 精简版本 ,系统启动也仅仅加载必要的资源),所以需要我们在docke run 是指定环境变量,或者在dockerfile 中指定(固定不变的话)。
   提交镜像: docker cmmoit   mycontainId     tqtestjava:1.0




5、tqtestjava:1.0 虽然有了我们需要自行的环境, 我们也可以以交互模式进入,启动我们的应用,但是如果要让我们的应用在容器启动的时候自动启动应用, 需要 在docker run 命令后面拼接以系列的环境变量, 换需要手动指定docker 启动的时自行的脚本, 工作目录等。
例如:

  1. docker run -d  --net=host  -ti  -e MAVEN_HOME=/opt/maven  -e JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64 -e PATH=$PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/      tqtestjava:1.0  /usr/local/project/start_zhejiang.sh
复制代码


这对使用人员来说不太方面。
所以我们编写dockeFile : dockerUseranthTest.txt

  1. FROM tqtestjava:1.0
  2. ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64
  3. ENV MAVEN_HOME /opt/maven
  4. ENV PATH $PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/
  5. WORKDIR /usr/local/project/
  6. RUN date;sleep 100;date
  7. RUN echo "============end==="
  8. CMD ["/usr/local/project/start_zhejiang.sh", " start " , "start"]
  9. [root@ssdpc dockerapp]# ^C
  10. [root@ssdpc dockerapp]# ll
  11. total 8
  12. -rw-r--r--. 1 root root 335 Aug 31 15:48 dockerCommonTomcat
  13. -rw-r--r--. 1 root root 340 Aug 31 08:45 dockerUseranthTest
  14. [root@ssdpc dockerapp]# more dockerUseranthTest 
  15. FROM tqtestjava:0.04
  16. ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64
  17. ENV MAVEN_HOME /opt/maven
  18. ENV PATH=$PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/
  19. WORKDIR /usr/local/project/
  20. RUN date;sleep 100;date
  21. RUN echo "============end==="
  22. CMD ["/usr/local/project/start_zhejiang.sh", " start " , "start"]
复制代码


然后执行: docker build -f dockerUseranthTest.txt  -t tqtestjave:2.0 . 
这样我们就新生成了一个 tqtestjave:2.0 镜像。
最后执行: docker -d  --net=host  tqtestjave:2.0   就可以实现启动容器时应用自启动了

6、网络选择: 这里我们选择host 模式, 不是说host 模式好,而且线上也不建议使用host模式。  而且因为如果我们选择bridge 模式,需要在路由器上设置一个172段的路由网关,同时固定宿主机器上分配的docker 容器的ip 段。   这适合于有网络经验的人来搞。

五、docker REST API

docker的所有命令可以通过一系列的restful 的API , 这对生产环境编写漂亮发布,部署脚本十分有效

docker images  可以等级与:
echo -e "GET /images/tomcat/json HTTP/1.0\r\n" |nc -U /var/run/docker.sock


docker ps 可以等级与:
echo -e "GET /containers/json HTTP/1.0\r\n" |nc -U /var/run/docker.sock

默认情况下 Docker 的守护进程启动会生成一个 socket (/var/run/docker.sock)进程通信文件,而并没有监听端口,只能在本机操作 Docker。如果想在其它地方操作 Docker 主机,就需要让 Docker 主机监听一个端口号,这样可以通过端口号就能实现远程操作。


1、对于手动启动的docker daemon :可以这样配置
docker -d -H unix:///var/run/docker.sock -Htcp://0.0.0.0:5678
2、ubuntu :
   vim /etc/default/docker.io :  
   DOCKER_OPTS=" -H unix:///var/run/docker.sock" =====修改为====>DOCKER_OPTS=" -H tcp://0.0.0.0:5678 -H unix:///var/run/docker.sock"
   service docker.io restart
3、Red Hat 7系列
     systemctl stop  docker 
     vim /etc/sysconfig/docker 
      #修改other_args 的值
      other_args=" -H tcp://0.0.0.0:5678 -H unix:///var/run/docker.sock"
     systemctl start docker 



配置验证: 
docker -H localhost:5678 version


六、相关资源
https://github.com/docker

 

QQ交流群:534368042