docker 学习笔记(一)

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连接ES

portainer可视化安装
他是个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    fe540f32fe13

link 改变了/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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值