Docker常用命令
查看已有的镜像:docker images
docker容器增加tag:docker tag 容器名:版本号
运行容器:docker run 容器id
当前正在运行的容器:docker ps
退出交互模式但容器不关闭:ctrl+p+q
进入当前正在运行的容器: docker exec -it 容器id bashShell 或者 docker attach 容器id
删除全部的容器:docker rm -f $(docker ps -aq)
删除所有的镜像:docker rmi -f $(docker images -aq)
删除指定的容器:docker rm -f 容器id
删除指定镜像:docker rmi 容器id
停止正在运行的容器:docker stop 容器id
启动已经存在的容器:docker start 容器id
查看所有的容器:docker ps -a
从容器内拷贝文件到主机:docker cp 容器id: 容器内路径 目的主机路径
下载镜像:docker pull 软件名
后台启动镜像:docker run -d --name 容器名 -p 外部访问端口号:内部端口号 容器名
查看容器cpu使用情况:docker stats
可视化面板
portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Commit镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
1.启动tomcat ,默认的tomcat是没有webapps应用,镜像的原因,官方默认的webapps下面是没有文件的!需要自己拷贝一些文件。
将修改过的tomcat提交为一个·1新的镜像
docker commit -a="zxw" -m="zxwtest" 12641b3a42ce tomcat01:1.0
容器数据卷
数据如果都在容器中,那么容器删除,数据就会消失。比如说mysql,所以说容器的数据需要持久化。
容器之间需要一个数据共享的技术!Docker容器产生的数据,同步到本地!这就是卷技术,目录的挂载,将我们容器内的目录,挂载到Linux上面。
方式一:直接使用命令挂载
docker run -it -v 主机目录:容器目录
容器挂载信息查看
docker inspect 容器id
是双向绑定在服务器中修改文件也会同步到容器中;
实战:mysql
运行容器的时候,需要做容器挂载,mysql登录时需要登录密码
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
容器删除后,本地已保存的数据不会消失。
具名和匿名挂载
匿名挂载,不指定容器外位置
docker run -d -P --name nginx01 -v /etc/nginx nginx
查看挂载情况:docker volume ls
具名挂载 -v 卷名:容器内路径
查看具名所在位置 docker volume inspect juming
如何确认是具名挂载还是匿名挂载或者制定路径挂载;
匿名挂载:-v 容器路径
具名挂载:-v 卷名:容器路径
制定路径挂载: -v /宿主机路径:容器内路径
docker run -d -P --name nginx01 -v /etc/nginx:ro nginx 容器内文件只读
docker run -d -P --name nginx01 -v /etc/nginx:rw nginx 容器内文件只写
数据卷容器
多个容器之间共享数据
先运行一个容器然后查看它的挂载目录
然后再创建一个容器,让两个容器之间共享挂载目录
docker run -it --name nginx04 --volumes-from nginx02 nginx
通过查看容器信息可以发现新创建的容器实例挂载目录和父目录是相同的。
在新建的容器中添加文件观察父容器和宿主机文件是否同步
文件同步完成
DockerFile
dockerfile 是用来构建docker镜像的文件!命令参数脚本;
构建步骤
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(Docker、阿里云镜像仓库)
Dockerfile构建过程
基础知识
1、每个保留关键字(指令)都必须是大写字母
2、执行顺序从上到下顺序执行
3、#表示注释
4、每一个指令都会创建一个新的镜像层,并提交
dockerfile是面向开发的,我们以后要发布项目,做镜像,就要编写dockerfile文件,这个文件十分的简单;
DockerFile的指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat的压缩包,添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令。可以追加命令
ONBUILD #当构建一个被继承 DockerFile这个时候就会运行ONBUILD 的指令,触发指令。
COPY #类似ADD,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
实战创建自己的镜像centos
这是官方版,是属于阉割版缺少了一些命令
创建自己的dockerfile
FROM centos:7
MAINTAINER zxw<test@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 "-------ok-----"
CMD /bin/bash
构建镜像
验证成功
查看镜像变更历史:docker history 容器id
CMD和ENTRYPOINT区别
cmd #指定这个容器启动的时候要运行的命令,只有最后一个生效,可被替代
测试cmd,编写dockerfile
FROM centos:7
CMD ["ls","-a"]
构建镜像 docker build -f cmd.txt -t cmdtest:0.1 .
运行镜像 :容器启动后自动执行cmd命令
如下图所示命令被替换,不会在执行cmd中的命令
ENTRYPOINT #指定这个容器启动的时候要运行的命令。可以追加命令
测试entrypoint,编写dockerfile
FROM centos:7
ENTRYPOINT["ls","-a"]
运行镜像 :容器启动后自动执行entrypoint命令
ENTRYPOINT ["ls","-a"]docker run 命令之后的参数,会被当做参数传递给ENTRYPOINT,之后形成新的命令组合。
实战tomcat镜像
编辑dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了
FROM centos:7
MAINTAINT zxw<123456@qq.com>
COPY readme.txt /usr/local/readme.txt
#ADD命令会自动解压压缩包
ADD jdk-8u351-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.0.11.tar.gz /usr/local
RUM yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置环境
ENIV JAVA_HOME /usr/local/jdk1.8_351
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CLASS_HOME /usr/local/apache-tomcat-8.0.11
ENV CLASS_BASH /usr/local/apache-tomcat-8.0.11
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#暴露端口 8080
EXPOSE 8080
#启动tomcat并设置日志打印路径
CMD /usr/local/apache-tomcat-8.0.11/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.11/bin/logs/catalina.out
构建镜像
docker build -t diytomcat .
启动镜像并挂载目录
docker run -d -p 9090:8080 --name zxwtomcat -v /home/zxw/build/tomcat/test:/usr/local/apache-tomcat-8.0.11/webapps/test -v /home/zxw/build/tomcat/logs/:/usr/local/apache-tomcat-8.0.11/logs diytomcat
测试地址是否访问的通
报错curl: (56) Recv failure: Connection reset by peer 发现是目录写错
测试成功
直接在挂载目录下发布应用,会同步至容器中
测试成功
发布自己的镜像
1.先在docker hub 注册自己一个账号
2. docker login -u 用户名
3.docker push 作者名/容器名:版本号
发布至阿里云镜像上
1.登录阿里云
2.找到容器镜像服务
3.创建命名空间
4.创建容器镜像
具体操作步骤阿里云有具体文档;
Docker网络
测试
IO:本机回环地址
etho:阿里云内网地址
docker0:docker0地址
启动以一个tomcat容器然后查看网络
此时返回宿主机查看网络,发现宿主机多一个网络,正是容器的网络
docker容器之间的网络是可以互通的
绘制一个网络模型图
结论:tomcat01和tomcat02是一个公用的路由器,docker0。所有的容器在不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
思考一个场景,编写了一个微服务,database url = ip;项目不重启,数据库ip换掉了,希望可以根据名字来访问容器;
答:容器运行的时候用link来连接
docker run -d -P --name 容器名 -- link 要连通的容器名 镜像的容器名
可以通过查看hosts配置查看具体看连接的地址;现在已经不建议使用link;
自定义网络
查看所有的docker网络
docker network ls
网络模式
bridge:桥接 docker(默认)
none:不配置网络
host:和宿主机共享网络
测试
#我们直接启动的命令 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
#我们可以自定义一个网络
启动两个容器
查看自己建立的网络,发现多了两个容器的地址
再次用ping连接测试两个容器,容器之间用名字都可以ping通
我们自定义的网络docker已经帮我们维护好了对用的关系,推荐平时这样使用。
网络连通
测试打通tomcat01---->mynet
现在是不通的
连通网络:docker network connect mynet tomcat01
查看网络状态:docker inspect mynet,发现是把tomcat01网络直接添加进入mynet网络中
再尝试是否连通
实战部署redis集群
1、创建一个redis网络
docker network create redis --subnet 172.38.0.0/16
2、通过脚本创建6个redis配置
for port in $(seq 1 6); #6次循环
do #开始执行
mkdir -p /mydata/redis/node-${port}/conf #创建目录
touch /mydata/redis/node-${port}/conf/redis.conf #创建文件
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf #将以下命令输入到文件中
port 6379 #开放端口6379
bind 0.0.0.0 #允许任意计算机都可以连接
cluster-enable yes #使用集群功能
cluster-config-file nodes.conf #集群配置文件
cluster-node-timeout 5000 #允许失联最大毫秒数
cluster-announce-ip 172.38.0.1${port} #本节点1的ip地址
cluster-announce-port 6379 #本节点的端口
cluster-announce-bus-port #集群节点总线端口
appendonly yes #开启aof持久化
EOF #结束文件输入命令
done
启动redis
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#通过后台允许,指定网络,指定端口,指定redis版本,指定容器名,指定通过配置文件运行
进入其中一台机器
docker exec -it redis-1 /bin/sh
创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
查集群信息
往redis中存储数据
可以看到数据存在四号机,现在把四号机停掉,看是否能从备份机器中获取数据
查看集群信息发现四号机已被替换
SpringBoot打包微服务
1.构建springboot项目
2.打包应用
3.编写dockerfile
idea下载docker插件(可以高亮)
4.构建镜像
先把之前镜像都移除
在Linux home目录下创建一个存放jar包的目录
然后把jar和dockerfile传到这里
然后构建镜像 docker build 镜像名
5.发布运行
docker run -d -P --name 容器名 镜像名