Docker基础:https://blog.csdn.net/huangjhai/article/details/118854733
目录:
1.镜像
2.容器
3.数据持久化
4.网络
5.容器脚本
6.项目脚本
第一关:镜像和容器
名词:
镜像:服务样品
仓库:存放镜像的远程服务器
容器:实际的服务应用
帮助:https://blog.csdn.net/qq_45637155/article/details/109901965
镜像常用:
查看:docker images
搜索:docker search
下载:docker pull
删除:docker rmi
容器常用:
生成并运行:docker run 镜像名 --name="自定义名" [如果容器什么都不做,容易被自动停掉]
列出容器:docker ps -a
删除容器:docker rm 容器id
操作容器:docker start/restart/stop/kill 容器id
跳出:Ctrl + p + q
退出:exit
容器交互:
进入:docker exec -it 容器id /bin/bash
进入:docker attach 容器id
文件贴出:docker cp 容器id:文件路径 目标路径
docker相关:
运行状态:docker stats
容器信息:docker inspect 容器id
挂载信息:docker volume ls
联合文件系统:镜像文件分层处理,底层共用。
自制镜像:底层都是共用的,只读的。自定义的部分都是在顶端一层累加的。
提交镜像:docker commit -a="" -m="" 容器id 镜像名:版本号
[将一个修改过的docker容器做成images,存放在本地]
第二关:数据与脚本
容器数据卷:
匿名挂载:docker run -v 主机目录:容器目录
docker run -d -v /html:/usr/share/nginx/html --name nginx01 -p 3335:80 nginx
具名挂载[推荐]:docker run -v 卷名:容器目录 [区别:是不是/开头]
卷名地址:/var/lib/docker/volumes/卷名
跟随别人的卷:相互共享-v信息,并无关系
--volumes-from 容器名
DockerFile:构建docker镜像的脚本
步骤:
1.编写脚本文件
dockerfile{
FROM 基础镜像名
MAINTAINER author
#自动解压放在某处
ADD xxx.tar.gz /path
COPY xxx.jar /path/xxx.jar
ENV MYPATH /usr/local
WORKDIR $MYPATH
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80 443
CMD ["--server.port=8080"]
ENTRYPOINT ["java","-jar","/app.jar"]
}
照抄脚本:docker history 镜像id
CMD与ENTRYPOINT:
都可以指定shell或exec函数调用的方式执行命令;
当存在多个CMD指令或ENTRYPOINT指令时,只有最后一个生效;
差异1:CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数。
差异2:CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖;
2.构建成镜像
docker build -f dockerfile.path -t images.name:tags 目标路径[通常是个.]
如果脚本名叫 Dockerfile,官方指定名的话。
docker build -t images.name:tags .[*重点*]
3.运行镜像:run
4.发布镜像:push
总结:
docker build 脚本构建镜像
docker run 运行镜像
docker start/stop/restart 操作镜像
docker commit 容器构建镜像
docker save/load 镜像打包
docker push/pull 镜像上传
第三关:网络
docker0:linux下ip addr,有个叫docker0的网卡
安装docker后,会新增一个docker0的网卡
每个docker容器运行后,容器内会有个分配的网卡,容器外会同时多出一个对应容器内的新网卡。
docker0,和容器内虚拟的网卡都分配在同一内网段。
问题:内网ip是分配的,解决容器内相互调用时ip的问题。
思路:springcloud中是使用服务名称代替ip的
容器互联:--link
docker run -d -P --name tomcat03 --link tomcat02 tomcat
缺点:反向不通,他的本质是改变了hosts文件[大雾],写死的,重新分配就没了。
自定义网络:抛弃docker0~!
查看docker网络:
docker network ls
创建一个内网[推荐]:
docker network create
--driver bridge
--subnet 192.168.0.0/16
--gateway 192.168.0.1 mynet
使用自创内网:
docker run -d -P --name tomcat03 --net mynet tomcat
docker exec -it 容器 ping 容器名
使用自创内网,可以利用容器名进行通讯。
多个内网,可以隔离不同集群内网
内网间通讯:将容器加入某个内网,容器两个ip
docker network connect [参数] 内网名 容器名
第四关:容器组团
DockerCompose:编写一次性启动多个容器的yaml文件
概念:
services:服务,指容器
团队成员:
Dockerfile:原来就有的
docker-compose:编写的,build当前文件夹里的Dockerfile
文件:cp过去,或者add过去
操作:在docker-compose文件上面,执行docker-compose up/down
Yaml:
#版本
version:
#服务
services:
服务1:名
build
images
network
...
服务2:名
#其他配置
volumes:
networks:
configs:



