目录:
注:本随笔绝大部分摘抄尚硅谷docker教程,本随笔仅仅是做记录所用,请勿当作教程查看!尚硅谷官网:http://www.atguigu.com/
1、Docker简介
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
例如以前我们在linux上安装MySQL,那么我们需要考虑很多情况,比如说缺什么库,缺什么依赖,然后配置一系列东西。
当我们使用Docker以后,直接在docker中拉取MySQL的镜像,然后直接启动后就可以使用,不需要我们手动的配置什么东西。
从上面的话可以猜出来,docker的作用就是可以直接安装软件环境+软件,我们安装软件的时候直接带着软件的环境一起安装了。
docker官网:http://www.docker.com
docker中文网站:https://www.docker-cn.com/
Docker Hub(Docker的软件仓库)官网: https://hub.docker.com/
2、Docker安装
Docker支持的Centos环境:
Docker支持以下的CentOS版本:
CentOS 7 (64-bit)
CentOS 6.5 (64-bit) 或更高的版本
Docker的组成:
1、镜像(Image)
Docker镜像(Image)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
我们可以用Java中类和对象来举例:
类====镜像
对象====容器
所以我们就可以看出来,镜像就跟类一样,是模板,而类创建的实际的对象/实例,就是容器。
2、容器(Container)
Docker利用容器(Container)独立运行一个或一组应用。容器时用镜像创建的运行实例。
容器可以被启动、开始、停止、删除。每个容器之间都是相互隔离的。
可以把容器看作是一个简易版的Linux环境,这个简易版Linux环境包括root权限、进程、用户、网络等和运行在其中的软件/应用程序。
3、仓库(Repository)
仓库(Repository)是集中存放镜像文件的地方。
仓库和仓库注册服务器是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag:就是版本号)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
公开仓库就是那种阿里、网易、docker官网提供的公开的仓库。
私有仓库就是那种你自己搞的仓库,或者说是你公司内部使用的仓库。
最大的公开仓库是docker官方的仓库:https://hub.docker.com/
4、总结
需要正确的理解仓库/镜像/容器这几个概念,下面给一张图:
安装步骤:
centos6.8:
1、yum install -y epel -release:docker使用epel发布,phel系统的os首先要确保已经持有epel仓库,否则先检查os的版本,然后安装相应的epel包。
2、yum install -y docker-io
3、安装后的配置文件在:/etc/sysconfig/docker
4、启动docker服务:serivce docker start
5、docker version:验证是否安装成功(出现版本号则成功)
centos7:
官方安装文档:https://docs.docker.com/install/linux/docker-ce/centos/
1、确保是centos7以上版本:
cat /etc/redhat-release
2、安装gcc相关:
yum -y install gcc
yum -y install gcc-c++
3、卸载旧版本(第一行是一个命令,后面的是一个命令):
yum -y remove docker docker-common docker-selinux docker-engine
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine
4、安装需要的软件包:
yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置stable仓库镜像:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6、更新yum软件包索引:
yum makecache fast
7、安装dokcer ce:
yum -y install docker-ce
8、启动Docker:
systemctl start docker
9、测试:
docker version
dokcer run hello-world
hello-world那个只要有以下的文件就说明成功:
10、配置镜像加速:
mkdir -p /etc/docker
vim /etc/docker/daemon.json
#网易云
{"registry-mirrors": ["http://hub-mirror.c.163.com"] }
#阿里云
{
"registry-mirrors": ["https://{自已的编码}.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
注:配置阿里云镜像加速的那个编码,自己去阿里云注册开发者,然后就会有你的专属加速编码。
11、如果你要卸载docker:
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
HelloWorld:
docker run hello-world。
可以看到输出了Hello from Docker!
那么我们执行docker run hello-world命令后docker做了些什么???
底层原理:
Dokcer是如何工作的:
docker是一个cs(client-server)结构的系统。docker守护进程运行在主机上,守护进程接收客户端传来的命令,然后用这种方式来管理Docker。
Docker是虚拟环境,VMware也是虚拟环境,他们有啥不同?为什么Docker比VMWare快?
不同:
Docker只是为了提供软件+软件运行所需的环境,VM是虚拟整套系统,包括硬件系统。
为什么Docker比VM快:
VM是虚拟整套系统,比如centos,VM是虚拟完整的centos,而Docker则是虚拟精简版的centos,并没有硬件系统、一些不必要的软件等。
Docker虚拟centos的话,内核仍然是使用的宿主机的内核,所以它运行会更快!
可能我表达不好,从网上摘抄一张图:
3、Docker常用命令
帮助命令:
docker version:
docker info:
docker -help:
镜像命令:
docker images:列出所有本地的镜像
REPOSITORY:镜像名
TAG:镜像标签,说白了就是版本号,latest就是最新版
IMAGE ID:镜像ID,唯一的标识符
CREATED:镜像创建时间
SIZE:镜像大小
docker images还可以加参数:
-a:列出本地所有的镜像(含中间镜像层)。docker images -a
-q:只显示所有镜像ID。docker images -q
--digests:显示镜像的摘要信息。docker images --digests 注:两个“-”
--no-trunc:显示完整的镜像信息。docker images --no-trunc
docker search:查找某个xxx镜像的名
查找是在仓库查找,官网仓库地址:https://hub.docker.com
docker search 镜像名[:版本号]:如果版本号不写,则默认最新版
NAME:镜像名
DESCRIPTION:镜像简介
STARTS:收藏数
OFFICIAL:是否为官方镜
AUTOMATED:是否是自动化构建的镜像
当然该命令也可以加参数:
--no-trunc:显示完整的镜像描述。docker search tomcat --no-trunc
-f stars=xxx:列出收藏数不小于xxx指定值的镜像。docker search redis -f stars=100
docker pull 某个镜像名:下载某个镜像
docker pull 镜像名:版本号:如果版本号不写,那么默认为latest(最新版)。
docker rmi 某个镜像名:删除本地某个镜像
删除镜像:docker rmi centos:latest/docker rmi 831691599b88,可以填写镜像名[:版本号](如果不填则为最新版)或者镜像ID
删除单个:docker rmi -f 镜像名/镜像ID
删除多个:docker rmi -f 镜像名1:版本 镜像2:版本
删除全部:docker rmi -f $(docker images -qa),解释:docker images -qa:-q是列出历史的镜像,-a是只显示镜像ID。那么这命令的意思就是列出历史所有镜像的ID
容器命令:
(先去下载一个centos镜像,这样你才能尝试后面的命令(docker pull centos)):
docker run [options]:从镜像中新建并启动容器:
docker run [options] 镜像名:版本号/镜像ID [参数(这个参数会在容器中被运行)]:
例如:
docker run centos:从容其中查找centos镜像并新建一个容器实例后运行。
options:有些是一个减号,有些是两个减号
--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
例如:
docker run -it centos /bin/bash:新建并运行centos容器/实例,并以前台交互的方式运行,然后在容器内执行/bin/bash的命令。
docker ps:列出当前所有正在运行的容器/实例
当然它也有参数:
-a:列出当前正在运行+历史运行的容器。docker ps -a
-l:显示最近创建的容器。docker ps -l
-n:显示最近创建的容器。docker ps -n5
-q:显示容器编号。docker ps -q
--no-trunc:不截断输出。
exit:停止并退出容器
ctrl+P+Q:容器退出但是不停止。
docker start 容器ID或者容器名:启动已经创建好了的容器。
docker restart 容器ID或荣容器名:重启容器
docker stop 容器ID或容器名:停止容器
docker kill 容器ID或荣启铭:强制停止容器
docker rm 容器ID:删除已停止的容器。
一次性删除多个容器:docker rm -f $(docker -a -q)或者docker ps -a -q | xargs docker rm
其他重要命令:
docker run -d 容器名:
以后台模式启动一个容器。
但是你运行后会发现,容器退出了,其实这是因为docker容器中的程序必须有一个前台进程,如果当前docker容器的程序中没有前台进程,那么就会自动退出。
docker logs -f -t --tail 容器名:
查看容器日志。
-t 是加入时间戳
-f 跟随最新的日志打印
--tail 显示最后多少条
docker top 容器名:
查看容器内运行的进程。
docker inspect 容器名:
查看容器内部细节。
docker exec -it 容器ID /bin/bash或docker attach 容器ID:
进入正在运行的容器并以命令交互。
这两个命令的区别:
attach:直接进入容器启动的时候的终端,不会开启新的线程。
exec:在容器中打开新的终端,是新开启的进程。
docker cp 容器ID:容器内路径 宿主机路径:复制容器文件到宿主机内
总结:
4、Docker镜像
是什么?
前面我们说过,镜像可以看成类,而容器就是通过类这个模板创建的实际的对象。
docker镜像是分层的,比如下面这种情况:
看我们这里,我们pull了一个redis,而他下载的不止一个镜像,下载了很多,这能看出来docker镜像并不是一整个一整个的,一个完整的可供我们使用的镜像是由多个小镜像组成的。
那为什么docker要使用这种分层的镜像呢?
最大的一个好处就是:资源共享。
比如我们现在需要MySQL和tomcat,这两个镜像都需要centos作为基础镜像。
那我们现在安装MySQL以后,centos这个基础镜像已经被下载好了,然后我们安装tomcat的时候,已经不需要再去下载centos这个基础镜像了。
我们来组织一下语言:
有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
镜像的特点:
Docker镜像都是只读的。
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
docker镜像的提交/commit操作:
docker commit 提交容器副本使之成为一个新镜像。
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
来一个案例演示:
1、下载一个tomcat镜像。docker pull tomcat
2、后台方式运行tomcat,docker run -d -p 8080:8080 tomcat
3、进入tomcat,在webapps下创建test文件夹,然后创建hello.html(注意,最新版的tomcat的webapps下啥也没有)。docker exec -it 容器id /bin/bash,然后mkdir文件夹,touch文件
4、然后根据这个容器创建一个镜像,docker commit -m="test tomcat image" -a="you author" 运行的tomcat的容器ID tomcat:test
5、然后停止并删除我们运行的容器。
6、然后我们会发现,原tomcat镜像中的webapps下是没有任何文件的,但是我们根据容器创建的镜像中,webapps下是有文件的,然后我们运行我们创建的镜像,就会发现,其webapps下是有文件的。
5、Docker容器数据卷
例如MySQL,它是一个数据库,而它会存储数据,这个数据是存放在容器中的,当我们删除容器以后,数据就没了,而我们希望将这个数据持久化到我们宿主机的某个位置(它类似于redis的持久化,而这里持久化是到宿主机,而不是redis的rdb或者aof这种文件),那么这个时候容器数据卷就派上了用场。说白了,就是和宿主机共享莫格文件夹。
不仅如此,docker中还可以继承容器数据卷,就比如c1这个容器它搞了一个数据卷,是在/usr/volume下,然后我们创建容器c2,继承于c1的数据卷,那么c2也可以共享/usr/volume这个目录。
使用方法:
直接命令添加:
使用命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
查看数据卷是否成功:docker inspect 容器ID
带权限: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名。注意一下,这个ro代表着read only,容器中只能进行读取操作,那么上图中RW的值就为false。
DockerFile添加:
命令:VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
我们来测试一下:
1、创建一个文件,touch mydockerfile
2、编辑文件的内容
1 # volume test 2 3 FROM centos 4 5 VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] 6 7 CMD echo "finished,--------success1" 8 9 CMD /bin/bash
3、根据文件构建镜像:docker build -f /root/dockerFileTestDir/myDockerFile -t dhcentos . 注意,最后的那个点一定要加
4、创建容器并运行,看其/下是否含有dataVolumeContainer1和dataVolumeContainer2这两个目录。
5、然后我们会发现,我们的容器内路径,并没有指定映射到宿主机哪个位置上,那么这种情况,我们该如何得知其宿主机的路径在哪呢?
6、使用docker inspect 容器ID,可以查看其对应宿主机路径
注意:
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied 解决办法:在挂载目录后多加一个--privileged=true参数即可
Docker通过dockerfile文件构建镜像的时候,不要忘记最后的点!!!
6、DockerFile解析
是什么?
DockerFile是用来构建镜像的构建文件,有一系列命令和参数组成。
构建镜像有三个步骤:编写dockerfile文件--编译构建镜像(docker build)--创建容器并运行(docker run)
docker文件什么样的:我们前面看容器数据卷的时候,dockerfile这种方式也涉及到了dockerfile,只是比较简单,我们可以看看docker hub上,centos的dockerfile:
Docker构建过程解析?
Docker基础内容:
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
2、指令按照从上到下,顺序执行。
3、#表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交。
Docker执行DockerFile的大致流程:
1、docker从基础镜像运行一个容器。
2、执行一条指令并对容器作出修改。
3、执行类似于Docker Commit的操作提交一个新的镜像层。
4、docker再基于刚提交的镜像运行一个新的容器。
5、执行dockerfile中的下一条指令知道所有指令都执行完成。
DockerFile体系结构(保留字指令):
FROM:基础镜像,当前新镜像是属于哪个镜像的。
MAINTAINER:镜像维护者的姓名和邮箱地址。
RUN:容器构建时需要运行的命令。
EXPOSE:当前容器对外暴露出的端口。
WORKDIR:指定在创建容器以后,终端默认登陆的进来工作目录,一个落脚点。
ENV:用来在构建镜像过程中设置环境变量。
例如:ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,就如同在命令前制定了环境变量前缀一样;也可以在其他指令中直接使用这些变量。
比如:WORKDIR $MY_PATH
ADD:将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置:
例如:
COPY src dest
COPY ["src","dest"]
VOLUME:容器数据卷,用于数据保存和持久化
CMD:指定一个容器启动时要运行的命令。
注意:
1、DockerFile中如果有多个CMD命令,那么只有最后一个CMD命令生效。
2、CMD命令会在被docker run之后的参数替换。
ENTRYPOINT:指定一个容器启动时要运行的命令。它和CMD一样,都是在指定容器启动程序及参数
ONBUILD:当构建一个被继承的Dockerfile时运行的命令,例如我现在dockerfile是A,我写了一个ONBUILD命令,然后我dockerfileB继承于dockerfileA,你们当我们B在构建的时候,父镜像A中的ONBUILD就会被执行
小总结:
案例:
完成内容:自定义一个Centos,登录终端后默认当前路径为/usr/local、自带VIM编辑器、自带ifconfig指令。
1、编写DockerFile,注意文件名为:Dockerfile
1 FROM centos 2 # 作者 3 MAINTAINER dh<2366567504@qq.com> 4 # 定义环境变量 5 ENV MYPATH /usr/local 6 # 定义登陆后的默认工作路径/usr/local 7 WORKDIR $MYPATH 8 # 运行命令 9 RUN yum -y install vim 10 RUN yum -y install net-tools 11 12 # 定义暴露对外的端口 13 EXPOSE 80 14 15 # CMD命令 16 CMD echo $MYPATH 17 CMD echo "success" 18 CMD /bin/bash
2、构建镜像:docker build -t mycentos:latest .
3、运行镜像dockerfile中的命令是否生效。docker run -it mycentos
4、查看镜像的变更历史。docker history mycentos