一、Docker简介
由于在项目部署的时候经常会出现在本机上运行是好使的,但是部署到服务器上时出现各种问题,而这种问题的原因经常是因为环境的问题,所以Docker出现了。
Docker 是基于Go语言实现的开源项目。
Docker是在Linux容器技术的基础上发展出来的。我们可以将应用运行在Docker容器上,而Docker容器在任何操作系统上都是一致的。
Docker主要通过对应用组件的封装、分发、部署、运行等进行管理,来实现用户的app及其运行环境能够做到一次封装,到处运行。
二、Docker的安装
1、安装Docker
1 | ## Ubuntu |
2、配置阿里云镜像加速
1)访问网址获取个人的加速器地址
2)按照下面的操作文档进行操作
1 | sudo mkdir -p /etc/docker |
3、hello,world
1 | 非管理员用户要加sudo |
4、Docker是怎么工作的
Docker是一个CS结构的系统,Docker的守护进程运行在主机上,客户端通过socket连接与守护进程进行传输命令,守护进程接受命令并管理运行在主机上的容器。
一个主机上可能有多个容器,每个中运行着镜像(tomcat、mysql...)的实例。
5、Docker为什么比虚拟机快
(1)由上图可以看出Docker比虚拟机少了抽象层Hypervisor,Docker不需要Hypervisor来实现硬件资源虚拟化,而是直接采用宿主的硬件资源。
(2)而且Docker采用的是宿主机的内核,所以新建一个容器时不需要像虚拟机那样重新加载操作系统内核,从而避免引导、加载系统内核这个耗时的操作。
三、常用命令
1、帮助命令
1 | docker --help |
2、镜像命令
1)查看本地主机中的所有镜像
1 | sudo docker images |
同一个仓库源可以有多个tag,代表这个仓库源的不同版本,所以我们使用REPOSITORY:TAG来定义不同的镜像。
2)从hub上查找镜像
1 | sudo docker search 查找镜像名 |
3)下载镜像
1 | 版本号默认为lastest,最新版本 |
4)删除镜像
1 | sudo docker rmi 某个镜像的id |
3、容器命令
1)新建并启动容器
1 | sudo docker run 镜像id |
启动交互式容器
2)列出Docker中有哪些容器在运行
1 | sudo docker ps |
3)退出交互式容器
1 | 容器停止退出 |
4)其他操作
1 | 启动容器,将已经停止的容器启动 |
5)守护式启动
1 | 上面说过了,使用-d命令启动,下面介绍注意点 |
由上图发现,我们运行的容器已经退出。
这个是Docker机制的问题,由于我们启动的容器中没有前台进程,而是以后台进程的形式运行的,Docker就会以为它没事干,于是就将其杀死。
解决方案:
1 | 1.如果本地镜像只有一个版本,可以直接使用仓库源的名字 |
6)查看容器日志
查看容器内运行的进程
1 | sudo docker logs 容器编号 |
7)查看容器内部细节
1 | 以json格式进行显示 |
8)进入正在运行的容器并以命令行交互
1 | 容器中启动新的终端并执行命令,返回 |
9)拷贝容器中的文件到本地
1 | sudo docker cp 容器id:容器中文件的位置 要copy到本地的位置 |
四、Docker镜像
镜像是一种轻量级、可执行的独立软件包,**用来打包软件运行环境和机基于运行环境开发的软件**,它包括某个软件所需要的所有内容(代码、库、环境变量、配置文件...)
1、UnionFS联合文件系统
联合文件系统是一种分层、轻量级、高性能的文件系统,它可以一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker的镜像基于UnionFS,也是由一层一层的文件系统组成。
就像我们拉镜像的时候,实际上下载了多层。
为啥tomcat会辣么大??
采用这种分层结构的好处
- 最大的一个好处就是——共享资源
比如:有多个进行都是从相同的A镜像构建而来,那么宿主机只需要在磁盘上保存一份A镜像,内存中只需要加载一份A镜像,就可以为所有容器服务了。
2、生成镜像Demo
1.从Hub上下载tomcat镜像到本地并运行
1 | 对外暴露端口 内部使用端口 |
2.故意删除tomcat容器的文档
3.以当前运行的tomcat作为模板,提交生成新的镜像
1 | sudo docker commit -a="作者" -m="描述信息" 容器id 要创建的镜像名:[标签名] |
4.启动我们生成的镜像
五、Docker的数据管理
部分参考于:这里
生产环境中使用Docker的过程中,容器中会产生数据,如果不通过commit命令生成一个新的镜像,当容器删除后,其中数据就没有了,所以我们往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
容器中管理数据主要有两种方式:
- 数据卷(Data Volumes):容器内数据直接映射到本地主机环境;如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中。
- 数据卷容器(Data Volume Containers):使用特定容器维护数据卷。如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。
1、数据卷
1)使用命令添加
1 | sudo docker run -v 宿主机绝对路径:容器内目录 镜像id/镜像名 |
2)采用DockerFile进行添加
1.书写DockerFile文件dockerfile2
1 | FROM centos |
2.使用命令生成镜像
1 | sudo docker build -f dockerfile2 -t x5456/centos . |
3.由于我们上面命令没有指定宿主机的位置,所以我们需要查看容器详细信息
1 | sudo docker inspect 724f7b7a9793 |
2、数据卷容器
如果用户需要在**多个容器之间共享一些持续更新的数据**,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
1.创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata:
1 | docker run -it -v /dbdata --name dbdata centos |
2.查看/dbdata目录:
1 | root@3ed94f279b6f:/# ls |
3.在其他容器中使用–volumes-from来挂载dbdata容器中的数据卷.
例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:
1 | docker run -it --volumes-from dbdata --name db1 ubuntu |
此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。
例如,在dbdata容器中创建一个test文件,如下所示:
1 | root@3ed94f279b6f:/# cd /dbdata |
在db1容器内查看它:
1 | docker run -it --volumes-from dbdata --name db1 ubuntu |
4.数据卷的生命周期一直会持续到没有容器使用他时
六、Dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
1、Dockerfile基础知识:
1)每条保留字指令都必须是大写字母且后面要跟随至少一个参数
2)指令从上到下顺序执行
3)#表示注释
4)==每条指令都会创建一个新的镜像层,并对镜像进行提交==
2、Docker执行Dockerfile的流程
1)Docker从基础镜像运行一个容器
2)执行一条指令就对容器进行修改
3)执行完一条指令就使用类似docker commit的操作提交一个新的==镜像层==
4)docker再基于刚刚提交的==镜像==运行一个新容器
- 由于镜像是由多个镜像层组成的,所以提交一个镜像层 <==> 生成了一个新镜像
5)继续执行下一条指令,直到所有指令都执行完毕
从应用软件的角度上来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段
- Dockerfile:软件原材料,面向开发
- Docker镜像:软件的交付品
- Docker容器:软件运行状态
3、Dockerfile的保留字指令
1)FROM
基础镜像,当前镜像是基于哪个镜像的
2)MAINTAINER
镜像维护者的姓名和邮箱地址
3)RUN
容器构建时需要运行的命令
4)EXPOSE
容器对外暴露的端口
5)WORKDIR
指定创建容器后,终端默认登陆进来的工作目录
6)ENV
在构建镜像过程中设置环境变量
eg:
1 | # 声明一个环境变量,这个变量可以在后续的任何指令中使用 |
7)ADD
将宿主机目录下的文件copy进镜像,而且ADD命令会自动处理URL和解压压缩包
8)COPY
将文件copy到镜像中
9)VOLUME
容器数据卷,用于数据的保存和持久化工作
10)CMD
指定容器启动时要运行的命令
- Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数==替换==
- 类似docker run /bin/sh xxx这种
11)ENTRYPOINT
指定容器启动时要运行的命令
- ENTRYPOINT会==追加==docker run之后的参数
12)ONBUILD
当构建一个被继承的Dockerfile时运行的命令,父镜像在被子镜像继承后触发这个命令
七、将镜像发布到阿里云上
1.创建镜像仓库
2.将镜像推送到阿里云上
1 | sudo docker login --username=1203901753@qq.com registry.cn-hangzhou.aliyuncs.com |
3.在阿里云上查看