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快?
- Docker有着比虚拟机更少的抽象层。
- 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构建过程
基础知识:
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
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的使用的主要内容,如果未能解决你的问题,请参考以下文章