docker入门

author author     2022-08-03     534

关键词:

一、介绍

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. [email protected] 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. [[email protected] dockerapp]# ^C
  10. [[email protected] 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. [[email protected] 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 " |nc -U /var/run/docker.sock


docker ps 可以等级与:
echo -e "GET /containers/json HTTP/1.0 " |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

docker入门:容器(containers)

        这个《Docker入门系列》文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成。主要是作为个人学习记录。有错误的地方,Robin欢迎大家指正。分为如下几个部分:1Docker入门:... 查看详情

docker入门

Docker在Windows下的安装 Windows安装Docker官方指南 在Windows平台上搭建Docker开发环境 查看详情

docker入门教程命令

 Docker入门教程(二)命令【编者的话】DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能。在Docker系列教程的第一篇文章中,我们了解了Docker的基础知识,... 查看详情

docker入门

一、Docker简介Docker两个主要部件:Docker:开源的容器虚拟化平台DockerHub:用于分享、管理Docker容器的DockerSaaS平台-- DockerHubDocker使用客户端-服务器(C/S)架构模式。Docker客户端会与Docker守护进程进行通信。Docker守护进程会处理复杂... 查看详情

docker入门到精通

在这些博文中,我学会了docker*[docker官网](https://www.docker.com/)   这里也是最权威的docker知识*[docker安装源地址](https://www.docker.com/)*[dockerhub](https://hub.docker.com/)*[docker中文社区](https://hub.docker.com/ 查看详情

docker入门

最近接手新的项目,用到了docker,所以花了两个晚上入了个门。慕课网上有简单的入门视频,有兴趣的坎坷可以去入个门.好了,进入正题,首先简单介绍下docker和虚拟机的区别:docker区别于虚拟机的地方在于,docker容器并不是... 查看详情

docker快速入门——docker常用命令(代码片段)

Docker快速入门——Docker常用命令一、Docker命令简介1、Docker命令简介Docker的命令清单可以通过运行sudodocker或者sudodockerhelp命令查看。Docker容器技术在不断演化过程中,Docker的子命令已经达到41个,其中核心子命令(例如:run)还会... 查看详情

docker入门基础

目录六、杂项六、杂项Docker组件:docker程序环境:环境配置文件:/etc/sysconfig/docker-network/etc/sysconfig/docker-storage/etc/sysconfig/dockerUnitFile:/usr/lib/systemd/system/docker.serviceDockerRegistry配置文件:/etc/containers/re 查看详情

docker入门

一、Docker原理介绍点击查看:https://www.cnblogs.com/hwlong/articles/9060557.html二、Docker安装点击查看:https://www.cnblogs.com/hwlong/articles/9095852.html  查看详情

docker入门指南

地址:docker入门指南更换国内镜像源dockerstore地址默认是在国外,下载速度很慢,自行更换国内docker加速地址。名词解释image:镜像containers:容器docker-machine:docker虚拟主机dockerstore:docker存储云术语Image和ContainerImage可以理解为一个系... 查看详情

docker基础入门

docker概念docker是基于go语言实现的容器项目,docker构建思想:build,shipandrunanyapp,anywhere,即一次封装,到处运行。docker在linux容器基础上进行了进一步的优化。使得docker容器更像是一种轻量级的沙盒。docker优势●更快的交付和部... 查看详情

docker入门

一、Docker相关概念1.Docker: namespace,cgroup: 解决方案: lxc,openvz lxc:linuxcontainers docker最初就是lxc的封装版本。 dockerengine/dockerserver:输出一个api,用于接受外部请求 接受到client请求,借助于lxc虚拟化技术,在lxc上创建一个虚拟机... 查看详情

宋宝华:docker最初的2小时(docker从入门到入门)

最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料。本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学习高级用... 查看详情

docker快速入门——docker简介(代码片段)

Docker快速入门——Docker简介一、Docker简介1、Docker简介Docker是DockerInc公司开源的一项基于UbuntuLXC技术构建的应用容器引擎,源代码托管在GitHub上,完全基于go语言开发并遵守Apache2.0协议开源。Docker可以让开发者打包应用以及依赖包... 查看详情

docker入门之三:docker构建私有镜像入门到实践(代码片段)

docker的简单使用1.docker构建私有镜像1.1.使用Dockerfile定制镜像1.2.构建镜像1.docker构建私有镜像1.1.使用Dockerfile定制镜像在空目录创建文件,命名为Dockerfile[hadoop@hadoop101file]$cddocker/[hadoop@hadoop101docker]$mkdirmydockerfile[hadoop@hadoop101docker]$to... 查看详情

docker快速入门——docker-compose(代码片段)

Docker快速入门——Docker-Compose一、Docker-Compose简介1、Docker-Compose简介Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及... 查看详情

docker入门基础(代码片段)

目录一、简介1、docker架构2、docker的概念二、docker的安装和管理1、docker安装2、docker配置阿里云镜像加速3、基础命令一、简介参考https://www.cnblogs.com/linuxk/p/8984242.html1、docker架构Docker使用客户端-服务器(C/S)架构模式,使用远程API来... 查看详情

docker入门(代码片段)

1.Mac安装Dockerbrewcaskinstalldocker2.核心概念docker镜像(Images):用于创建Docker容器的模板;docker容器(Container):是独立运行的一个或一组应用,即镜像启动后的实例;docker客户端(Client):客户端通过命令行或者其他工具使用Docker;docker主机(Host):一... 查看详情