docker命令
帮助命令

docker version docker版本信息
 docker info
 docker 命令 --help 命令解释
 docker --help所有命令解释
 镜像命令
 docker images 查看所有镜像
 docker images -a
 docker images -q显示镜像ID
 docker search 软件名 搜索镜像 docker search mysql搜索mysql镜像
 下载镜像
 docker pull softwarename【:版本】可选
 docker pull mysql 下载mysql
 docker pull tomcat 下载tomcat
 删除镜像
 docker rmi -f 镜像ID 删除指定镜像
 dcoker rmi -f 镜像ID 镜像ID 删除多个镜像
 容器命令
 docker pull centos下载centos镜像
 容器启动
 docker run [可选参数] image(镜像名)
 --name 新的容器名字 容器名字
 -d 后台运行
 -it 使用交互方式运行 进入容器查看内容
 -p 指定容器端口 -p 8080:8080 把主机端口 8080映射到容器8080
     -p 主机端口:容器端口
 退出容器
 exit 退出并停止容器
 ctrl+P+Q 退出并不停止容器运行
 列出正在运行的容器
 docker ps
 列出所有容器
 docker ps -a
 docker container ls
 显示最近创建的容器
 docker pa -a n=?
 列出所有容器ID
 docker ps -aq
 删除容器
 docker rm 容器ID 不能删除正在运行的容器 若强制删除用 docker rm -f 容器ID
 docker rm -f $(docker ps -aq)删除所有容器
 docker ps -a | xargs docker rm 删除所有容器
 启动和停止容器
 docker start 容器ID 启动容器
 docker restart 容器ID 重启容器
 docker stop 容器ID 停止容器
 docker kill 容器ID 强制停止容器
 后台启动容器
 docker run -d 镜像名
 docker 容器后台运行 就必须有个前台进程 docker发现没有服务 就会停止
 查看日志
 docker logs -ft  --tail 10 容器ID 查看10条日志
 查看容器内部进程
 docker top 容器ID
 查看容器信息 (有来源 是否运行 父进程 来源镜像)
 docker inspect 容器ID
 进入当前正在运行的容器
 docker exec -it 容器ID /bin/bash(常用) 进入容器后开启新的终端
 dooker attach 容器ID 
 从容器内拷贝文件到主机
 docker cp 容器id:容器路径 目的主机路径 
 以后通过-v达到容器和主机同步
 查看cpu使用情况
 docker stats
 部署nginx
 docker pull nginx
 docker run -d --name mynginx -p 3344:8080 nginx
 部署tomcat
 docker pull tomcat
 docker run -d --name mytomcat -p 3366:8080 tomcat
 发现访问不到 原因阿里云默认的是最小的镜像可运行的
 需要以交互的方式进入正在运行的容器
 docker exec -it mytomcat /bin/bash
 将webapps.dist下的所有内容移到 webapps目录下
 cp -r ./webapps.dist/* webapps
 然后访问
 就是说之后的网站目录放在webapps下
 部署ES+Kibana
 ES暴露的端口多 十分耗内存
 docker pull elasticsearch:7.6.2
 docker run --name myes -d -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.2
 测试es是否成功
 关闭es修改配置文件es使占用的内存限制在64到521M之间 -e ES_JAVA_OPTS="-Xms64m -Xmx521m"
 docker run --name myes2 -d -p 9200:9200 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx521m" elasticsearch:7.6.2
 使用kibana连接ESportainer可视化安装
 他是个Docker图形化界面管理工具 提供一个面板供我们操作
 里面有container的状态进入里面点local 一般不用
 安装portainer
 docker run -d  -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
 访问测试
 在虚拟机 http://127.0.0.1:8088
 生成自己的镜像 docker commit
 docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[TAG]
 自己拷贝进去新的文件生成新的镜像 
 docker commit -a="lhx" -m="add wedapps app" ef22cc4777c1 tomcat02:1.0 容器数据卷
 将容器中的目录挂在到Linux上(双向同步技术):把容器内指定目录下的数据同步到Linux上的目录下或若linux指定目录下数据改变 则容器内部也发生改变和linux指定目录下保持一样 使得数据内外保持一致 是一个双向过程
 使用数据卷-v
 docker run -it -v 主机目录:容器内目录
 实战部署mysql
 docker search mysql
 docker pull mysql:5.7
 docker run -d -p 3310:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7(-e 配置密码)
 dockerfile文件说明
 FROM 基础镜像,一切从这里开始构建
 MAINATINER 镜像是谁写的 姓名+邮箱
 RUN 镜像运行的时候需要命令
 ADD 需要添加软件的安装目录
 WORKDIR 镜像的工作目录
 VOLUME 挂在目录
 EXPORT 端口配置
 CMD 指定容器启动时需要运行的命令,只有最后一个生效
 ONBUILD 当创建一个被继承的DocfileFile 这时候会执行
 COPY 类似ADD 将我们文件拷贝到系统
 ENV 构建的时候设置环境变量
 实战测试
 FROM centos
 MAINTAINER lhx<1157550085@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] .
 docker build -f mydockerfile -t mycentos:0.1 .
 实战Tomcat 基于x86架构
 FROM centos
 MAINTAINER lhx
 ADD jdk-8u171-linux-x64.tar.gz /usr/local/
 ADD apache-tomcat-9.0.37.tar.gz /usr/local
 ENV MYPATH /usr/local
 WORKDIR $MYPATH
 ENV JAVA_HOME /usr/local/jdk1.8.0_171
 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 EXPOSE 8080
 CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/logs/catalina.out
 容器互联 --link
 docker run --name mytomcat03 -d --link mytomcat02 ac570e4c47a6
 一个容器ping另一个容器的名字即可ping通
 docker exec -it fe540f32f ping mytomcat02
 底层原理 改变容器里的 hosts文件 mytomcat02IP 容器名字 和windows/etc/hosts一样 172.17.03 mytomcat02
 [root@ecs-a596 ~]# docker exec -it mytomcat03 cat /etc/hosts
 127.0.0.1    localhost
 ::1    localhost ip6-localhost ip6-loopback
 fe00::0    ip6-localnet
 ff00::0    ip6-mcastprefix
 ff02::1    ip6-allnodes
 ff02::2    ip6-allrouters
 172.17.0.3    mytomcat02 dfeef509feaa
 172.17.0.4    fe540f32fe13link 改变了/etc/hosts的映射 不常用
自定义网络
 查看所有docker 网络
 docker network ls
 [root@ecs-a596 ~]# docker network ls
 NETWORK ID          NAME                DRIVER              SCOPE
 22de018b83ab        bridge              bridge              local
 a8712a0383bc        host                host                local
 2444b4ada27a        none                null                local
 网络模式
 桥接 bridge
 none: 不配置网路
 host(主机):和主句共享
 container: 容器网络连通(很少用)
 docker run --name mytomcat -d -p 8080:8080  ac570e4c47a6
 等价于 docker run --name mytomcat -d -p 8080:8080 (--net bridge) ac570e4c47a6
 创建自己的网络 等同于docker0
 docker network create --driver 网络模式 --subnet 子网 --gateway 网关 网络名字
 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
 [root@ecs-a596 ~]# docker network ls
 NETWORK ID          NAME                DRIVER              SCOPE
 22de018b83ab        bridge              bridge              local
 a8712a0383bc        host                host                local
 72d623bd3bf5        mynet               bridge              local
 2444b4ada27a        none                null                local
 查看自己配置网络的所有信息
 docker network inspect mynet
 [root@ecs-a596 ~]# docker network inspect mynet
 [
     {
         "Name": "mynet",
         "Id": "72d623bd3bf5e47eeda5286be8538c63ba46e217e226f80eb2317798b16d52b2",
         "Created": "2020-07-29T16:55:59.704480007+08:00",
         "Scope": "local",
         "Driver": "bridge",
         "EnableIPv6": false,
         "IPAM": {
             "Driver": "default",
             "Options": {},
             "Config": [
                 {
                     "Subnet": "192.168.0.0/16",
                     "Gateway": "192.168.0.1"
                 }
             ]
         },
         "Internal": false,
         "Attachable": false,
         "Ingress": false,
         "ConfigFrom": {
             "Network": ""
         },
         "ConfigOnly": false,
         "Containers": {},
         "Options": {},
         "Labels": {}
     }
 ]


创建一个容器实例 用自己创建的网络通信
docker run -d -p 8090:8080 --name mytomcat01 --net mynet ac570e4c47a6
查看容器的详细信息
docker inspect d169dab628c0a
主要信息:
 

"Gateway": "192.168.0.1",
                     "IPAddress": "192.168.0.2",
                     "IPPrefixLen": 16,
                     "IPv6Gateway": "",
                     "GlobalIPv6Address": "",
                     "GlobalIPv6PrefixLen": 0,
                     "MacAddress": "02:42:c0:a8:00:02",
                     "DriverOpts": null
 创建第二个实例并连接自己定义的网络mynet
 docker run -d -p 8070:8080 --name mytomcat02 --net mynet ac570e4c47a6
 [root@ecs-a596 ~]# docker run -d -p 8070:8080 --name mytomcat02 --net mynet ac570e4c47a6 
 8aae46d1330287101ad021d4a774309012ef435a18381cd207f6f0cef8e96809在第一个实例中直接ping第二个实例名字
 [root@ecs-a596 ~]# docker exec -it d169dab628c0 ping mytomcat02
 PING mytomcat02 (192.168.0.3) 56(84) bytes of data.
 64 bytes from mytomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.110 ms
 64 bytes from mytomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.057 ms
 64 bytes from mytomcat02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.062 ms

总结
在创建容器实例时如果不指定--net指定网络则默认为是docker0(默认网关)这样的网络在一个容器ping 一个容器名字时需要使用--link 所要ping的容器名来实现
而自己创建的网络修复了这个问题 可以直接ping
网络联通
连接一个容器到一个网络
docker network connect 网络名字 容器名
将mytomcat连接到mynet网络
docker network connect mynet mytomcat
 底层原理是在容器上直接加个网卡直接连上另一个网络
查看mytomcat的详细信息

"Networks": {
                 "bridge": {
                     "IPAMConfig": null,
                     "Links": null,
                     "Aliases": null,
                     "NetworkID": "22de018b83abb81bbdce556948f3a60155b5c2625080b82d7037a73841b97dfa",
                     "EndpointID": "05ddad2db6636e56fa1c81b880a38a3d2f2765c3b9be78d9dbdc24343fbebcc3",
                     "Gateway": "172.17.0.1",
                     "IPAddress": "172.17.0.2",
                     "IPPrefixLen": 16,
                     "IPv6Gateway": "",
                     "GlobalIPv6Address": "",
                     "GlobalIPv6PrefixLen": 0,
                     "MacAddress": "02:42:ac:11:00:02",
                     "DriverOpts": null
                 },
                 "mynet": {
                     "IPAMConfig": {},
                     "Links": null,
                     "Aliases": [
                         "ab363bd994bb"
                     ],
                     "NetworkID": "72d623bd3bf5e47eeda5286be8538c63ba46e217e226f80eb2317798b16d52b2",
                     "EndpointID": "07b210e24cf6ccd1df5b3a6471befaf4bbaeeeb17b7d10d5b2bd4a2afa76e694",
                     "Gateway": "192.168.0.1",
                     "IPAddress": "192.168.0.4",
                     "IPPrefixLen": 16,
                     "IPv6Gateway": "",
                     "GlobalIPv6Address": "",
                     "GlobalIPv6PrefixLen": 0,
                     "MacAddress": "02:42:c0:a8:00:04",
                     "DriverOpts": {}
                 }
             }
         }
     }
 ]
 发现有两个网关 一个是docker0(docker0的网关是172.17.0.1) 另一个是mynet(自定义网络mynet的网关是192.168.0.1)
 使用mytomcat ping mytomcat01
 [root@ecs-a596 ~]# docker exec -it mytomcat ping mytomcat01
 \PING mytomcat01 (192.168.0.2) 56(84) bytes of data.
 \64 bytes from mytomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.087 ms
 64 bytes from mytomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.058 ms
 64 bytes from mytomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.058 ms