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