Docker的使用

Posted 覃会程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker的使用相关的知识,希望对你有一定的参考价值。

1、简介

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;

Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;

运行中的这个镜像称为容器,容器启动是非常快速的。

2、核心概念

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);

docker客户端(Client):连接docker主机进行操作;

docker仓库(Registry):用来保存各种打包好的软件镜像;

docker镜像(Images):软件打包好的镜像;放在docker仓库中;

docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用

3、在linux虚拟机上安装docker

步骤:

1、检查内核版本,必须是3.10及以上
uname -r
2、安装docker
yum install docker
3、输入y确认安装
4、启动docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker -v
Docker version 1.12.6, build 3e8e77d/1.12.6
5、开机启动docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
6、停止docker
systemctl stop docker

4、镜像操作

操作命令说明
检索docker search 关键字 eg:docker search redis我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。
拉取docker pull 镜像名:tag:tag是可选的,tag表示标签,多为软件的版本,默认是latest
列表docker images查看所有本地镜像
删除docker rmi image-id删除指定的本地镜像

镜像查找网站:
https://hub.docker.com/

5、容器操作

软件镜像(安装程序)----运行镜像----产生一个容器(正在运行的软件);

步骤:

1、搜索镜像
[root@localhost ~]# docker search tomcat

2、拉取镜像
[root@localhost ~]# docker pull tomcat

3、根据镜像启动容器
docker run --name mytomcat -d tomcat:latest

4、docker ps  
查看运行中的容器

5、 停止运行中的容器
docker stop  容器的id

6、查看所有的容器(包括已经停止的)
docker ps -a

7、启动容器
docker start 容器id

8、删除一个容器
 docker rm 容器id
 
9、启动一个做了端口映射的tomcat(一个镜像可以启动多个容器,只要设置的端口不一样就行)
[root@localhost ~]# docker run -d -p 8888:8080 tomcat
-d:后台运行
-p: 将主机的端口映射到容器的一个端口    主机端口:容器内部的端口

10、重启容器
docker restart 容器id

11、强制停止当前容器
docker kill 容器id

12、关闭linux的防火墙
service firewalld status ;查看防火墙状态
service firewalld stop:关闭防火墙
13、查看容器的日志
docker logs container-name/container-id

命令参考:
https://docs.docker.com/engine/reference/commandline/docker/

  • 常见的坑:docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止。比如后台启动centos镜像时。

比较Docker和虚拟机技术的不同:

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
  • 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了。
  • 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。

其他常用命令

查看容器的日志命令
$ docker logs [OPTIONS] CONTAINER
  Options:
        --details        显示更多的信息
    -f, --follow         跟踪实时日志
        --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
        --tail string    从日志末尾显示多少行日志, 默认是all
    -t, --timestamps     显示时间戳
        --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

查看容器中进程信息
docker top 容器id(容器名称也可以)
 
查看镜像的元数据
docker inspect  镜像id(容器id也可以)

进入当前正在运行的容器
docker exec  -it  容器id

从容器内拷贝文件到主机上
docker cp  容器id:容器内路径    目的的主机路径

docker 把容器commit成镜像
docker commit +参数 模板容器 构成的镜像 
主要参数选项包括:
-a ,–author=”” 作者信息
-m,–message=”” 提交信息
-p,–pause=true 提交是暂停容器运行

命令总结图:

6、底层原理

Docker是怎么工作的?

  Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!DockerServer接收到Docker-Client的指令,就会执行这个命令!

Docker为什么比VM快?

  1. Docker有着比虚拟机更少的抽象层。
  2. docker利用的是宿主机的内核,vm 需要是Guest Os。

  所以说,新建一个容器的时候,docker不需要想虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统吗,省略了这个复杂的过程,秒级!

总结:
  容器镜像只是提供了一套文件系统中的各种文件,而各种内核相关的模块或者特性支持,完全依赖于宿主机

docker的宿主系统是centos,为什么可以运行ubuntu的镜像呢?

docker的宿主系统是windows,为什么能运行centos镜像?

  • 因为windows版本的docker虚拟了Linux内核

7、docker镜像加载原理

联合文件系统

  UnionFS(联合文件系统): Union文件系统( UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

加载原理

  • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

  • boots(boot fle system)主要包含bootloader和kernel(内核), bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

  • rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker里的CentOS镜像才200M ?

对于一个精简的OS, rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kerne
,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。

分层理解:


这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。

特点:

  • Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
  • 这一层就是我们通常说的容器层,容器之下的都叫镜像层!
  • 当我们运行镜像后在容器内进行了一些修改,我们可以将改动后的容器commit成新的镜像。这时就会把容器层在原来镜像的基础上叠加进去形成新的镜像。

8、容器数据卷

数据卷简介:

docker将应用和环境打包成一个镜像,如果数据都在容器中,那么我们容器删除,数据就会丢失!比如把mysql容器删了,数据库的数据就会丢失删库跑路!这时需要将容器的数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

总结:容器数据卷是容器的持久化和同步操作!容器间也是可以数据共享的!

数据卷使用方式:

方式一:使用命令进行挂载 -v

docker run -it -v 主机目录:容器内目录

容器启动后,可以通过docker inspect 容器id查看挂载情况


挂载后无论是在主机上修改还是在容器上修改都会进行同步,容器停止再启动时会重新同步主机上的目录。

9、具名挂载和匿名挂载

  • 所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data路径下
  • 我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载

如何确定是具名挂载还是匿名挂载,还是指定路径挂载!

-v 容器内路径             #匿名挂载
-v 卷名:容器内路径        #具名挂载
-v /宿主机路径::容器内路径  #指定路径挂载!

设置数据卷的读写权限

  • ro 只读,只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
  • rw 可读可写
#—旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -p --name nginx02 -v juming-nginx :/etc/nginx:ro nginx
docker run -d -p --name nginx02 -v juming-nginx :/etc/nginx:rw nginx

10、DockerFile

DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都是必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交!

dockerfile是面向开发的,要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!Docker镜像逐渐成为企业交付的标准。

  • DockerFile:构建文件,定义了一切的步骤,源代码
  • DockerImages:通过 DockerFile构建生成的镜像,最终发布和运行的产品!
  • Docker容器:容器就是镜像运行起来提供服务器

DockerFile指令

CMD 和 ENTRYPOINT命令的区别

  • CMD命令,run命令启动镜像时,末尾的命令参数会替换掉CMD的命令参数。
  • ENTRYPOINT命令,run命令启动镜像时,会将末尾的命令参数进行追加到ENTRYPOINT命令中。

11、Docker网络

查看容器的内部网络地址ip addr,发现容器启动的时候会得到一个ethO@if9 ip地址,docker分配的

  • 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!
  • 这个容器带来网卡,都是一对对的
  • evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
  • 正因为有这个特性,evth-pair 充当一个桥粱,连接各种虚拟网络设备的

原理图如下:

  • tomcat01和tomcat02是公用的一个路由器,dockerO。

  • 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP

  • docker容器中所有的网络接口都是虚拟的

  • 如果容器被删除,则对应的网桥就没了,下次会重新分配

以上是关于Docker的使用的主要内容,如果未能解决你的问题,请参考以下文章

markdown docker-compose片段

sh Docker片段

《Docker 源码分析》全球首发啦!

docker 部署 coredns(内部域名解析)

docker 部署 coredns(内部域名解析)

将 Docker 容器限制为单个 cpu 核心