Docker安装

1.较旧版本的Docker被称为docker或docker-engine。如果已安装这些,请卸载它们以及相关的依赖项。
      yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.设置存储库在新主机上首次安装Docker CE之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker。
安装所需的包。yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper存储驱动程序。
  yum -y install yum-utils device-mapper-persistent-data lvm2

3.使用以下命令设置稳定存储库。
  yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.安装最新版本的Docker CE和containerd:
   yum install docker-ce docker-ce-cli containerd.io
或者安装特定版本:
   yum -y install docker-ce-18.06.1.ce
5.启动Docker。
  systemctl start docker    --启动Docker
  systemctl enable docker   --设置Docker开机启动


6. 配置阿里云镜像加速器(国内外网访问慢可配置)
 mkdir -p /etc/docker
 tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://1rz6b9bl.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

7.查看版本号
docker --version

Docker常用命令
帮助命令

docker version   自身验证(版本号等信息)
docker info      比version更全的自身描述
docker  --help   帮助docker常用命令
systemctl enable docker.service docker服务自动重启设置

镜像命令

1.列出本地镜像
docker images [OPTIONS]    
  OPTIONS说明: 
               -a                             列出本地的所有镜像
               -q                             只像是镜像ID
               --digests                      显示镜像的摘要信息
               --no-trunc                     显示完整的镜像信息                                

2.去Hub查询所有镜像(使用docker官方search搜索框)
docker search [OPTIONS]镜像   
  OPTIONS说明: 
               -s                             列出收藏数不小于指定值的镜像
               --no-trunc                     显示完整的镜像描述信息
               --automated                    只列出automated build类型的镜像

3.下载镜像
docker pull [OPTIONS] image:[版本号]     
  OPTIONS说明: 
               docker pull centos 等价于 docker pull centos:latest  没写版本号自动获取最新版本
               docker class Book 等价于 docker class Book extends Object

4.删除镜像
docker rmi [OPTIONS]image       
  OPTIONS说明: 
               docker rmi tomcat 等价于 docker rmi tomcat:latest 不写版本号默认删除latest
               -f 镜像ID                       删除单个镜像 
               -f 镜像名1:TAG 镜像名2:TAG    删除多个镜像
               -f $(dovker images -qa)         删除全部镜像
5.打包镜像
docker commit                               提交容器的副本使之成为一个新的镜像
docker commit -a="hetengfei" -m="del centos docs"      d52498cea537  atguigu/centos6.6.6      
docker commit -a 提交作者信息    -m 提交描述信息           容器ID    要创建的目标镜像名:[标签名]    --目标镜像atguigu/centos6.6.6名字必须为小写     

6.推送到阿里云
    描述:镜像的生成方法:
    DockerFile脚本生成生成新镜像
    从容器打包一个新的镜像 docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
    一:阿里云创建镜像仓库
    二:
    1. 登录阿里云Docker Registry
    $ sudo docker login --username=1139345215@qq.com registry.cn-beijing.aliyuncs.com
    用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
    您可以在产品控制台首页修改登录密码。
    2. 从Registry中拉取镜像
    $ sudo docker pull registry.cn-beijing.aliyuncs.com/htf-hub/test:[镜像版本号]
    3. 将镜像推送到Registry
    $ sudo docker login --username=1139345215@qq.com registry.cn-beijing.aliyuncs.com
    $ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/htf-hub/test:[镜像版本号]
    $ sudo docker push registry.cn-beijing.aliyuncs.com/htf-hub/test:[镜像版本号]
    请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

 容器命令

1.列出当前所有正在运行的容器
docker ps [OPTIONS]   
  OPTIONS说明: 
               -a                             列出当前所有正在运行的容器+历史上运行过的容器
               -l                             显示最新创建的容器
               -n                             显示最近n个创建的容器
               -q                             静默模式,只显示容器编号
               --no-trunc                     不截断输出

2.新建并启动容器
docker run [OPTIONS]image[COMMAND][ARG...]                 
  OPTIONS说明: 
               --name="容器名称"              为容器指定一个名称
           --restart=always               容器开机自动启动
               -d                             后台运行容器,并返回容器ID,也即启动守护式容器
               -i                             以交互模式运行容器,通常与-听同事使用
               -t                             为容器分配一个伪终端,通常与-i同事使用
               -P                             随机端口映射(映射外部访问端口,访问宿主机IP+端口便可访问容器)
               -p                             指定端口映射,有以下四种格式(映射外部访问端口,访问宿主机IP+端口便可访问容器)
                                                  ip:hostPort:containerPort
                              id::containerPort
                                                  hostPort:containerPort
                          containerPort
            
3.创建不启动容器
docker create [OPTIONS]image[COMMAND][ARG...] 

4.启动容器
docker start 容器ID或容器名称       

5.重启容器
docker restart 容器ID或容器名称 
设置自动重启:
docker run --restart=always <IMAGES>           运行容器时添加自动重启参数--restart=always
docker update --restart=always <CONTAINER ID>  设置已经启动容器自动重启

6.暂停容器
docker pause 容器ID或容器名称

7.恢复暂停容器
docker pause 容器ID或容器名称  

8.停止容器
docker [OPTIONS] stop  容器ID或容器名称       温柔停止容器(容器自身有一个关闭的过程)
docker kill stop       容器ID或容器名称       强制停止容器(相当于拔掉电源插头)                           

9.退出容器
exit                          停止并退出容器
Ctrl+P+Q                                      容器不停止退出

10.删除容器
docker rm [OPTIONS] 容器ID              删除已经停止的容器
  OPTIONS说明: 
               -f 容器ID                      关闭并删除单个容器
               -f 容器名1:TAG 镜像名2:TAG   关闭并删除多个容器
               -f $(dovker images -qa)        关闭并删除全部容器
docker ps -a -q | xargs docker rm
docker  container  rm  $(docker  container  ls   -a  -q) 删除全部容器

11.启动守护式容器(启动守护容器没有进程执行则会自杀)
docker run -d  容器名                         守护式容器(启动守护容器没有进程执行则会自杀)   
docker run -it 容器名                         交互式容器

12.查看容器日志
docker logs [OPTIONS]
  OPTIONS说明: 
               -t                                是加入时间戳
               -f                  跟随最新日志打印
               -rail                          数字显示多少条
  docker run -d centos /bin/sh -c"while true;do echo hello zzyy ;sheep 2;done"(每过两秒打印hello zzyy)

13.查看容器内运行的进程
docker top 容器ID

14.查看容器内部的细节
docker inspect [OPTIONS] 容器ID或容器名称 
OPTIONS说明:
             -f :指定返回值的模板文件。
             -s :显示总的文件大小。
             --type :为指定类型返回JSON。

15.从宿主机直接进入正在运行的容器并以命令进行交互
docker exec -i-t 容器ID                       
docker attach    容器ID                       直接进入容器启动命令终端,不会启动新的进程
docker exec      容器ID                       是在容器中打开新的终端,并且可以启动新的进程
      列子:
        docker exec -it  容器ID  /bin/bash             进入到容器命令行终端中(类似attach)
        docker exec -it  容器ID  ls -l /tmp            进入centos容器执行ls -l /tmp命令,并返回结果

16.主机容器相互内拷贝文件 
docker cp 10b9a3588ab9:/tmp/yum      /root                     从10b9a3588ab9容器拷贝/tmp目录(或目录下文件)到主机/root目录
 
docker cp  /root     10b9a3588ab9:/tmp/yum               将主机/root目录拷贝到容器10b9a3588ab9的/home/cloudera目录下。

Docker容器数据卷

是什么:一句话,类似我们Redis里面的Rdb和aof文件
能干嘛:1.容器持久化    2.容器间继承+共享数据
特点:
     1.容器之间共享或重用数据
     2.卷中的更改可以直接生效
     3.数据卷中的更改不会包含在镜像的更新中
     4.数据卷的生命周期一直持续到没有容器使用它为止   
docker run -it                                          contos    在镜像contos创建新的容器
docker run -it -v   /宿主机绝对路径目录:/容器目录       contos    在镜像contos创建新的容器,并主机创建'宿主机绝对路径目录'、容器'容器目录'两个文件,文件内内容共享
docker run -it -v   /宿主机绝对路径目录:/容器目录:ro   contos    在镜像contos创建新的容器,并主机创建'宿主机绝对路径目录'、容器'容器目录'两个文件,文件内内容共享,ro代表容器文件夹只读
列入:
    docker run -it -v /host1:/tataVolumeContainer1  -v /host2:/tataVolumeContainer1 contos  /bin/bash
    如果不指定/host1、/host2宿主机目录,docker会自动在宿主机下生成目录
    查看宿主机生成路径:
        1、docker inspect 查看宿主机详细信息 
        2、去Json详细信息"Volumes":{ }节点查看路径信息
        3、默认生成容器卷,Docker挂在主机目录Docker访问出现'cannot open directory.:Permission denied'错误
            解决办法:在挂在目录后多加一个--privileged=true参数即可
            列入:docker run -it -v   /宿主机绝对路径目录:/容器目录 --privileged=true     contos
查看Docker容器卷挂目录
docker inspect 容器ID  --查看下面Mounts节点
例如:
"Mounts": [
            {
                "Type": "bind",
                "Source": "/opt/java/apache-tomcat-7.7.84",
                "Destination": "/usr/local/tomcat/webapps",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

运行DockerFile文件生成新镜像

DockerFile文件
File构建模板(命令是在镜像下容器中执行)
FROM centos  --FROM当前要做的镜像,类似于父类镜像centos
MAINTAINER minmmis<htf@0311lhkj.com>  --MAINTAINER作者信息,由那个人维护的镜像
ENV  DEBIAM_FRONTEND noninteractive   --ENV增加环境变量
RUN  mkdir aaa                  --RUN运行需要的指令
VOLUME ["/dataVolumeContainer1","dataVolumeContainer2"]   --说明在当前centos里面,根目录下新建两个容器卷'tataVolumeContainer1'、'tataVolumeContainer2'
CMD echo  "finishen,------success1"   --在centos里面打印出'finishen,------success1'一句话
CMD /bin/bash

docker build -f /mydocker/DockerFile -t hetengfei/centos .   --运行DockerFile文件,根据centos父镜像,执行DockerFile内容生成新镜像hetengfei/centos,供人运行(千层饼概念)

保存镜像为本地文件

1.使用Docker save命令。
命令格式:
docker save -o 要保存的文件名  要保存的镜像
     比如这里,我们将java8的镜像保存为文件:
    docker save -o java8.tar lwieske/java-8

2、从文件载入镜像
使用Docker load命令。
命令格式:
docker load --input 文件
或者
docker load < 文件名
使用SSH工具将文件上传到另一台服务器。
然后通过命令载入镜像:
docker load < java8.tar
导入后可以使用docker images命令查看

防火墙设置(开启可能导致端口不通)

查看防火墙状态  # systemctl status firewalld
 
running 状态即防火墙已经开启
 
dead 状态即防火墙未开启
 
开启防火墙,# systemctl start firewalld  没有任何提示即开启成功
 
开启防火墙 # service firewalld start  
   
关闭防火墙 # systemctl stop firewalld
   
centos7.3 上述方式可能无法开启,可以先#systemctl unmask firewalld.service 然后 # systemctl start firewalld.service

设置端口

查看已打开的端口   netstat -anp

查看想开的端口是否已开 # firewall-cmd --query-port=8888/tcp    提示no表示未开
 
开永久端口号 firewall-cmd --add-port=8888/tcp --permanent   提示    success 表示成功
 
重新载入配置  # firewall-cmd --reload    比如添加规则之后,需要执行此命令
 
再次查看想开的端口是否已开  # firewall-cmd --query-port=8888/tcp  提示yes表示成功
 
若移除端口 # firewall-cmd --permanent --remove-port=8888/tcp

 测试运行mysql、tomcat

运行mysql
docker run --name mysql  -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.21
运行mysql并挂在容器卷
docker run --restart=always --name mysql  -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306  -v /opt/java/mysql/config/my.cnf:/etc/my.cnf  -v /opt/java/mysql/data:/var/lib/mysql  -d mysql:5.7.21

运行tomcat并挂载容器卷
docker run -d --restart=always -p 8080:8080 --name tomcat -v /opt/java/apache-tomcat-7.7.84:/usr/local/tomcat/webapps  tomcat:7.0.84

从宿主机拷贝文件到镜像
docker cp /opt/java/apache-tomcat-7.7.84/aa.html     tomcat:/usr/local/tomcat/webapps

从镜像拷贝文件到宿主机
docker cp  tomcat:/usr/local/tomcat/webapps     /opt/java/apache-tomcat-7.7.84