Bootstrap

Docker知识点整理

Docker
比较Docker和虚拟机技术的不同:
1.传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
2.容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
3.每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
镜像
docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux系统。
仓库
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似git)
Docker Hub是国外的。
阿里云…都有容器服务器(配置镜像加速!)
docker安装
#1.卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#2.需要的安装包
yum install -y yum-utils

#3.设置镜像的仓库
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
#上述方法默认是从国外的,不推荐

#推荐使用国内的
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
#更新yum软件包索引
yum makecache fast

#4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可

#5.启动docker
systemctl start docker

#6. 使用docker version查看是否按照成功
docker version

#7. 测试
docker run hello-world
卸载docker
1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!
docker加速器的配置
#1.创建一个目录
sudo mkdir -p /etc/docker

#2.编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://t2wwyxhb.mirror.aliyuncs.com"]
}
EOF

#3.重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
docker镜像常用命令
帮助命令:
docker version    #显示docker的版本信息。
docker info       #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
  
镜像命令:
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替

docker search #搜索镜像
  -- docker search mysql --filter=STARS=3000

docker pull #下载镜像 docker image pull

docker rmi #删除镜像 docker image rm

docker images -a  #列出所有镜像详细信息

docker images -aq #列出所有镜像的id 
  
  
镜像下载 docker pull
     docker pull 镜像名[:tag]
镜像删除  
     docker rmi -f 镜像id #删除指定id的镜像
     docker rmi -f $(docker images -aq) #删除全部的镜像  
  
容器常用命令
#docker中下载centos
docker pull centos
  
docker run 镜像id #新建容器并启动
  -- docker run [可选参数] image
     #参数说明
  		--name="name" 容器名称
      -d 后台方式运行
      -it 使用交互方式运行,进入容器查看内容
      -p 制定容器的端口 -p 8080:8080(主机端口:容器端口)
      -P(大写P)随机指定端口
        
测试:
	docker run -it centos /bin/bash
    
    docker run -p 6379:6379 --name redis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes


docker ps 列出所有运行的容器 docker container list
    -- docker ps 命令  		#列出当前正在运行的容器
  -a, --all     	 #列出当前正在运行的容器 + 带出历史运行过的容器
  -n=?, --last int   #列出最近创建的?个容器 ?1则只列出最近创建的一个容器,2则列出2-q, --quiet        #只列出容器的编号


docker rm 容器id #删除指定容器

docker start 容器id	#启动容器
docker restart 容器id	#重启容器
docker stop 容器id	#停止当前正在运行的容器
docker kill 容器id	#强制停止当前容器
    
退出容器:
    exit 		#容器直接退出
    ctrl +P +Q  #容器不停止退出 	---注意:这个很有用的操作
    
删除容器:
docker rm 容器id   				#删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq)  	 #删除所有的容器
docker ps -a -q|xargs docker rm  #删除所有的容器
    
启动和停止容器的操作:
docker start 容器id	#启动容器
docker restart 容器id	#重启容器
docker stop 容器id	#停止当前正在运行的容器
docker kill 容器id	#强制停止当前容器
    
    
查看日志:
    docker logs --help
Options:
      --details        Show extra details provided to logs 
*  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
*      --tail string    Number of lines to show from the end of the logs (default "all")
*  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模拟日志      
#显示日志
-tf		#显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志

        
查看容器中的进程信息:
 # 命令 docker top 容器id
        
        
查看容器的中的元数据
 docker inspect 容器id
        
进入当前正在运行的容器
        docker exec -it 容器id
        docker attach 容器id

区别
#docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
#docker attach # 进入容器正在执行的终端
        
        
从容器拷贝到主机上
   docker cp 容器id:容器内路径  主机目的路径
镜像原理之联合文件系统
镜像是什么?
  镜像是一种轻量级、可执行的独立软件包、用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置环境。
所有应用,直接打包docker镜像,就可以直接跑起来。
  
  
 UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFSboots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel, Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。这一层与我们典型的Linux/Unix系统是一样的,包含boot加載器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos等等。
commit镜像
docker commit提交容器成为一个新的副本
  -- docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[版本tag]  
#案例操作的是tomcat(webapps)
容器数据卷
将应用于运行的环境打包形成容器运行,伴随着运行着的容器,我们队数据的要求希望是持久化的。
容器之间希望有可能共享数据 
  
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据,在docker中我们使用容器数据卷  

**总结: **容器的持久化和同步操作!容器间数据也是可以共享的!
         数据卷能做什么:能干嘛
          1.容器的持久化
          2.容器间继承+共享数据
  

  
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Uniin File System提供一些用于持续存储或共享数据的特性:

*** 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:
 1:数据卷可在容器之间共享或重用数据
 2:卷中的更改可以直接生效
 3:数据卷中的更改不会包含在镜像的更新中
 4:数据卷的生命周期一直持续到没有容器使用它为止
  

  方式一:直接使用命令来挂载 -v
     -- docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
          -d 后台运行
          -p 端口映射
          -v 卷挂载
          -e 环境配置
          --name 容器名字
  # docker run -it -v /myDataVolume:/dataVolumeContainer centos     
    
查看数据卷是否挂载成功:
    docker inspect 镜像ID
    
容器和宿主机之间数据共享
   1.可以在宿主机的myDataVolume目录和生成的容器的dataVolumeContainer目录里创建文件,并读写文件。
   2.可以看到俩目录里的文件和数据是同步共享的。  
    
容器停止退出后,主机修改后数据是否同步
    测试步骤
     1: exit 停止运行中的容器
     2: 修改主机目录myDataVolume下的文件内容
     3: 启动关闭的容器
     4: 查看容器dataVolumeContainer目录下的文件内容
     5: 结果已同步
  
 注: 容器停止退出候,主机修改后数据是否同步:同步 
  
       
       mysql:
  docker run -d -p 3306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name centos/mysql-57-centos7  mysql:latest
    
    redis:
docker run -p 6379:6379 --name redis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
    
    
    
    
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
如果确定是具名挂载还是匿名挂载,还是指定路径挂载
    -v 容器内路径  # 匿名挂载
    -v 卷名:容器内路径  #具名挂载
    -v /宿主机路径:容器内路径 #指定路径挂载
    
扩展:
	通过 -v容器内路径: ro 、rw改变读写权限
  ro (readonly) #只读
  rw (readwrite) #可读可写  
    # docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    
    
方式二: DockerFile方式
     1.根目录下新建myDocker文件夹并进入
        -- mkdir myDocker; cd myDocker
     2.可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷 
       -- VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
          
注: 
   1.出于可移植性和分享的考虑,用-v主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
   2.由于宿主机目录是依赖于特定宿主机的,并不能够保证所有的宿主机上都存在这样的特定目录。  
     
编写dockerFile  -- vi dockerFile
     
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished, ---------success1"
CMD /bin/bash
  
等同于:docker run -it -v /主机目录1:/dataVolumeContainer1 -v /主机目录2:/dataVolumeContainer2 centos /bin/bash
  
build编写的dockerfile,生成新的镜像
  docker build -f {dockerfile} -t 要创建的目标镜像名:[标签名] .
     -- docker build -f /myDocker/Dockerfile -t ppjj/centos .
  注: /myDocker/Dockerfile  -- dockerfile
      ppjj/centos -- 新的镜像名称
 
运行镜像:
  docker run -it ppjj/centos
  
查找容器对应的主机目录
  docker inspect 镜像ID
           
数据卷容器:
   命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
dockerFile
dockerFile就是用来构建docker镜像的构建文件!  命令脚本! 通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
  
FROM		#基础镜像,一切从这里开始构建
MAINTAINER	#镜像是谁写的,姓名+邮箱
RUN			#镜像构建的时候需要运行的命令
ADD			#步骤,tomcat镜像,这个tomcat的压缩包!添加内容
WORKDIR		#镜像的工作目录	
VOLUME		#挂载的目录
EXPOSE		#暴露端口配置
CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD		#当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
COPY 		#类似ADD,将我们文件拷贝到镜像中
ENV			#构建的时候设置环境遍量
 
dockerFile实战测试
Docker Hub99% 镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建的
  
#创建一个自己的centos 
#编写Dockerfile 文件
[root@root dockerfile01]# cat mydockerfile 
FROM centos
MAINTAINER Hang<1754808@qq.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
RUN yum -y install vim
RUN yum -y install net-tools
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "----END----"
CMD /bin/bash
 
 
#通过这个文件构建镜像
#docker build -f dockerfile文件路径 -t 镜像名:[tag] . (注: 别忘了最后的一个点)
 
[root@root dockerfile]# docker build -f mydockerfile -t mycentos1.0 .
Removing intermediate container 59cd03ecce3f
 ---> 89ba49a34e1e
Step 7/10 : EXPOSE 80
 ---> Running in a1efee3b0fe2
Removing intermediate container a1efee3b0fe2
 ---> e58f7bcccc27
Step 8/10 : CMD echo $MYPATH
 ---> Running in e882afef45eb
Removing intermediate container e882afef45eb
 ---> 906c0671d05c
Step 9/10 : CMD echo "----END----"
 ---> Running in f4ecc2caf6af
Removing intermediate container f4ecc2caf6af
 ---> 6f4bef42e0fc
Step 10/10 : CMD /bin/bash
 ---> Running in 44f884f709c9
Removing intermediate container 44f884f709c9
 ---> e6062ccf13fd
Successfully built e6062ccf13fd
Successfully tagged mycentos1.0:latest
 
 
#测试运行
[root@root dockerfile]# docker run -it mycentos1.0 /bin/bash
[root@f408b8773605 local]# pwd
/usr/local
  
  
列出本地镜像的变更历史:
  docker history mycentos1.0(镜像名)
  

CMD 和 ENTRYPOINT 区别
CMD            #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT    #指定这个容器启动的时候要运行的命令,可以追加命令
;