首页 资讯 社群 我的社区 搜索

docker学习笔记--入门篇

高大上
2018-10-25 20:20:12

      【docker是什么】一种代表性的容器技术,它和VMware最大的区别在于:VMware会虚拟化一个操作系统,包括网卡。打印机等等。每个虚拟机实例这些信息都是独立的。docker允许每个实例共用宿主机上的这些资源。一个完整的centos 7镜像大概4G,但是其内核系统才一百来M。docker实例在启动时只会加载最核心的部分,因此可以做到秒级启动。

       【docker的应用场景】我们在项目交付的时候经常遇到生产环境和开发环境不一致而造成各种问题。docker可以将你的软件,加上软件依赖的环境一起打包。就像它的logo一样。每个应用都放在一个集装箱中,开箱就能用。同时,因为docker中的每个实例都是互相隔离的,启动迅速,消耗很小。所以在测试、集群、弹性扩容等方面都是首选方案。我目前只用到了它的整体交付和测试。其他还没用到。

        【学习docker需要先了解的名词解释】

         容器:在docker上运行的每个实例都是一个独立的容器。相当于Vmware的运行实例

         镜像:启动容器就需要镜像,相当于创建Vmware实例是使用的ios

         仓库:存放镜像的仓库。docker默认使用本地仓库,当本地仓库没有可用镜像时会自动去dockerhub中获取。dockerhub在国外,我们一般会配置阿里的镜像库。类似maven的镜像库。

         数据卷:如果把每个docker实例都看作一个完整的操作系统。数据卷就相当于挂载的移动硬盘。数据卷中的数据都是共享的。

         dockerfile:容器元数据,相当于docker的描述文件。会以json格式记录容器的全部信息。

         CONTAINER:容器,在很多命令语法中都提到了,可以是容器id或者容器name

       【docker的安装】

      没啥好说的,配置阿里云的镜像库,yum安装就好。我后面应该会写个离线的shell。下面的安装命令:

安装前需要注意:1.docker是基于go语言编写,需要linux内核 3.10以上支持;一般centos 6.5以上就可以了,我用的centos 7.2。
2.docker只有linux版本,Windows版本不是官方做的,情况参考redis。一般来说我们建议使用linux版的

移除旧的版本:
 yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-selinux 
                  docker-engine-selinux 
                  docker-engine

安装一些必要的系统工具:
 yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:(这个地方我掉过坑,参考我的上篇帖子)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:(可以不做这一步)
 yum makecache fast
安装 Docker-ce:
yum -y install docker-ce
启动 Docker 后台服务
systemctl start docker
不报错就是安装好了!

       【docker的常用命令】

docker在命令设计上很多都参考了linux,在参数配置上也和linux很想。

docker ps 查看所有在运行中的实例   添加-a 参数,能查看全部实例,包括没运行的

   docker  start/stop/restart  CONTAINER  操作容器的启动,停止和重启,CONTAINER可以是容器ID和也可以是容器name

  docker  rm  -参数   CONTAINER  删除容器,只能删除停止的容器,-f可以强制删除运行中的容器

  docker rmi  镜像名    可以删除镜像

docker search [OPTIONS] TERM 搜索镜像 参数可以忽略,我基本不输入,例如docker search tomcat

结果中的重要参数说明 ;

NAME 镜像名,用于拉去镜像

DESCRIPTION,镜像描述

OFFICIAL 有【ok】的表示是官方发布的

docker pull [OPTIONS] NAME[:TAG|@DIGEST]   拉去镜像,我们一般写成docker pull tomcat,从仓库中拉取tomcat镜像,不知道版本默认获取最新的
docker push [OPTIONS] NAME[:TAG]   推送一个镜像到仓库中,不常用。注意从docker仓库中拉取镜像不用登陆但是推送是需要登录的,可以使用Docker login/logout 命令,不常用略过
docker images 查看本地镜像
docker logs [OPTIONS] CONTAINER    OPTIONS仓用参数 -f 跟踪日志输出,--since :显示某个开始时间的所有日志,--tail :仅列出最新N条容器日志  CONTAINER可以是容器名称或者ID
docker top CONTAINER     显示容器内的进程号,CONTAINER可以是容器名称或者ID
docker export [OPTIONS] CONTAINER    将容器实例打包为tar   例如 docker export cbe3cb7799ed > aaa.tar   将cbe3cb7799ed这个id的容器打包为aaa.tar的压缩包
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]    根据打包的tar创建镜像   例如  docker import - hcyiso < aaa.tar   从aaa.tar创建镜像,镜像名称为hcyiso 
 
 
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]    这个应该是使用最频繁的一个命令了,也是参数最多的。我这里只记录下常用的参数意义:
-d在后台运行容器,类似tomcat的./start.sh;
-i 以交互模式启动容器,一般和t一起使用,类似tomcat中的./catalina.sh run, 这种方式创建的容器在启动后会提供一个交互界面,能看到容器的运行情况
-P 设置端口映射,格式为:主机(宿主)端口:容器端口,注意这个P是大写的,小写报错;不填写时系统自动分配一个。例如3306:5000   意思是外部主机可以通过3306访问到容器中的mysql   5000的docker默认使用的端口
--name 为容器指定一个名称,不指定的情况下docker会随机分配名称。例如--name=“hcy”  指定容器名称为hcy,注意前面是两个-
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
-e username="ritchie": 设置环境变量;  --env-file=[]: 从指定文件读入环境变量; 两个是配套的,我没在实际中用过
举个例子:
docker run --name hcy -d -P training/webapp python app.py   意思是:以 training/webapp这个镜像创建一个实例,不指定端口,由系统自己分配,但是指定名称为hcy;创建实例完成后执行 python app.py命令启动该容器内的项目。当然后面的python app.py 这种命令不是必须的,一般我们通过pull拉下来的镜像Dockerfile里面基本都会帮我们启动,例如tomcat的结尾就会有CMD ["catalina.sh", "run"],当然这个后面会细说。
 
         上面的操作包含了镜像的查找,添加、删除,打包和导入。容器实例的创建,启动,停止,删除等等。常用的基本就这些的。和linux很像,可以参考linux记忆。
还有个docker cp命令,后面会单独写帖子来介绍数据卷和dockerfile。

    【完成一个docker的Demo】

        熟悉完上面的命令我们可以尝试下获取一个tomcat镜像,将自己的项目。或者简单点,将一个静态页面方法webapp下,让后打包。将打包好的镜像还原到另外一台docker上。能正常访问基本就可以算入门了。

       这里补充下几个知识点:

1.修正镜像和生成新的镜像有两种方式:一是通过获取纯净镜像修正后提交,涉及命令为:docker commit -m="镜像描述" -a="镜像作者" 容器id 新的镜像名称。官方是不建议使用这种方式创建镜像的。但是对于入门来说我建议这种方式,因为简单。第二种方式是通过dockerfile来构建镜像,它类似shell脚本编写的一键安装包。我因为linux和shell玩的不熟,如果你们熟练的可以使用dockerfile构建。将来我也会使用这种方式。

2.docker实例中的运行依赖是累加的。例如引入tomcat的镜像文件中默认就下载了jdk。不过他是通过from 表示继承来实现的,例如tomcat的 dockerfile如下:

 

在结尾部分也有这样一句话:CMD ["catalina.sh", "run"]     

cmd 是dockerfile的语法,后面的大家应该能猜到是什么意思了

3.不要在单个容器中运行多个进程。当容器内的进程都结束时docker实例也会结束,他是一个守护进程。反之,容器内部的进程没有死绝它都不会结束!

想到什么明天在加

用户评论 (1)