docker学习笔记

docker为什么会出现?
--因为开发环境和运维环境的不同,有时候导致开发后的服务不可用或有缺陷,为了统一环境,一次配置到处运行(只需拷贝多份,即可到多个环境)
docker理念
--构建,运行在any app any where
docker是什么,能干什么
--简易版的虚拟机,和宿机共享内核,例如linux虚拟机是模拟一整套软硬件系统,docker容器去除了业务无关的服务,更轻便,相对于虚拟机的几个G,docker只有100多M,合理利用资源。   启动docker也快
docker三要素
--镜像(image) 已经配置好的环境,例如安装好redis服务的环境,在docker上运行
--容器(container) 镜像运行后的实例,一个镜像可以创建多个实例,类似java的对象,而镜像即类
--仓库(repository) 用于存放镜像的远程仓库,类似github,托管代码。国内有阿里云、网易云

2、
docker的原理
docker与虚拟机的区别
--docker不是虚拟机,只是运行在操作系统上的一个进程,复用了宿机的内核,不用自己去虚拟一个操作系统,去除了一些虚拟硬件,轻量级,启动快,面向的是软件开发人员
--docker可以说无CPU和内存损耗,而虚拟机会消耗很多的CPU和内存损耗
--可复用
docker的帮助命令
--docker version 
--docker info
--docker --help

-----------------------------------------------------------------
docker镜像(联合文件系统构成):像千层饼一样,一层层的叠加上去,相同的基础层是所有镜像共享,共享宿主机的内核(kernel)
----在下载的时候,因为相同的层有缓存,所以下载快,在运行的时候,共享了内存中的基础层
---例如 tomcat镜像 -->  kernel -- centos -- jdk --tomcat  
---下载一个tomcat镜像,会把关联的基础层下载,所以一个镜像才会那么大
提交镜像:将镜像改造后,进行提交,保存改造后的状态,可用docker images 查看所有镜像,查看该镜像
docker commit -a="作者名" -m="提交说明" 容器id 镜像名称:版本
eg: docker commit -a="cwq" -m="测试commit" 21a24aae8c49 cwq/tomcat:1.1    提交后,可用docker images 查看

--------------------------------------------------------
容器数据卷:为了 数据持久化 和 容器之间的数据共享
---容器在关闭后,数据会消失。如同redis一样,内存数据库一关闭,内存中的数据都没了,所以必须做持久化,这样在重新启动后,重新加载硬盘的数据进行缓存

1、docker run -it -v /主机路径:/容器路径 centos   --路径会自动创建,相当于mkdir,这样创建出来容器是有读写权限的  v --> volume 卷的意思
2、docker run -it -v /主机路径:/容器路径:ro centos  --加上ro,代表了 read only,只有读的权限,不能创建文件也不能修改文件
--挂载同个目录达到数据共享的目的
--查看是否挂载  1、通过查看宿主机和容器是否生成对应的目录 2、通过命令 docker inspect 容器id 查看容器的json串,查看volume的绑定情况

1、docker run -it -v /myVolume:/myVolumeContainer centos
2、docker run -it -v /myVolume:/myVolumeContainer:ro centos

-----------------------------------------------------
DockerFile:镜像的源码,通过build命令生成镜像,相当于一个java应用中的java代码

挂载数据卷小例子
--编写生成DockerFile
--mkdir /myDocker
--cd /myDocker
--vim DockerFile
# volume test
FROM centos  --引入其他需要的父层docker,FROM相当于java的extends,获取父类的属性方法
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]  --挂载数据卷,会映射到宿主机的默认目录下
CMD echo "successs final!!!"  --CMD执行Linux的命令
CMD /bin/bash

--在当前目录下构建DockerFile,生成镜像xxx/centos
docker build -f /myDocker/DockerFile -t xxx/centos .
--用 docker images 可以查看生成的镜像
--docker run -it xxx/centos 运行后,使用docker inspect 镜像id 可以查看容器json,继而发现挂载的默认目录
--如果不知道,也可以进入centos容器中,在目录创建一个文件,使用find命令查这个文件,继而发现目录
[root@rocketmq-nameserver1 ~]# find / -name goods.txt
/var/lib/docker/volumes/542a6c5411392bff734cb38a38f21b251a691c57b9d867f869973dbff374c6c5/_data/goods.txt
--------------------------------------------
容器间的数据共享
--volumes-from

如上 挂载数据卷小例子,docker run 启动容器时数据卷都会挂载在宿主机上
但是同个镜像生成的多个容器实例,随机挂载的目录不一样,无法达到容器间的数据共享
--解决方法:--volume-from 命令用来指定共享哪个容器的数据卷
eg:
--docker run -it --name 容器名 -volume-from 需要共享数据卷的容器名 镜像id
--docker run -it --name dc02 -volume-from dc01 553e3f28a193  --在启动dc02容器时,共享dc01的数据卷,这样dc02就可以看到dc01存储的数据了
--dc01是父容器,但是dc02并不依赖dc01,如果dc01挂了,dc02并不会受到影响,数据以及访问都是没有问题的(应该是获取dc01的数据卷的路径,然后映射到dc02的数据卷,才不会有依赖关系)
--ctrl+q+p 以后台进程运行容器,重新进入容器中, docker attach 容器名 即可

-------------------------------------------------------------
-------------------------------------------------------------
1、DockerFile是什么?
DockerFile是镜像的构建文件,步骤(构建)如下
1)、编写DockerFile文件
2)、build 构建 镜像
3)、run 运行 镜像

centos6.8镜像 DockerFile文件示例:

FROM scratch  --基础镜像,所有镜像都是基于它构建的
MAINTAINER The CentOS Project 
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \
    vendor="CentOS" \
    license="GPLv2" \
    build-date="2016-06-02"

# Default command
CMD ["/bin/bash"]
2、保留字命令
FROM
--基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER
--镜像维护者的姓名和邮箱地址
RUN
--容器构建时需要运行的命令(例如redis镜像中 RUN groupadd -r redis && useradd -r -g redis redis,用于执行额外的Linux命令,这儿是创建一个redis组,并把redis用户添加进去)
EXPOSE
--当前容器对外暴露出的端口
WORKDIR
--指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点(当你使用docker run -it 镜像id 进入容器中时,进入到指定的目录底下,centos镜像是直接到根目录/)
ENV
--用来在构建镜像过程中设置环境变量
--ENV MY_PATH/usr/mytest
--这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量
--例如:WORKDIR $MY_PATH
ADD
--将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包(ADD c68-docker.tar.xz /)
COPY
--类似ADD,拷贝文件和目录到镜像中(功能没有ADD强大,没有解压缩的功能)
--将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
--两种方式: 1)、 COPY src dest  2)、COPY ["src","dest"]
VOLUME
--容器数据卷,用于数据保存和持久化工作
CMD
--指定一个容器启动时(docker run)要运行的命令
----CMD指令的格式和 RUN 相似,也是两种格式
----1)、shell格式: CMD <命令>
----2)、exec格式:CMD ["可执行文件","参数1","参数2"...]
----参数列表格式:CMD ["参数1","参数2"...],在指定了ENTRYPOINT 指定后,用 CMD 指定具体参数
--DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
ENTRYPOINT
--指定一个容器启动时(docker run)要运行的命令
--ENTRYPOINT的目的和 CMD一样,都是在指定容器启动程序及参数(与CMD的区别在于 不会被docker run 之后的参数替换,会**采用追加的方式**)
ONBUILD
--当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

---------

你可能感兴趣的:(虚拟机容器)