docker学习-基础
docker 分为镜像层和容器层,镜像层都是只读的,上层就是容器层是可写的,提交镜像就是提交某容器
docker安装
#卸载老版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装工具包与docker
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hna9ju11.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
#安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
#启动docker
sudo systemctl start docker
#重启docker
systemctl restart docker
#安装一个镜像
sudo docker run hello-world
#帮助命令
docker version 查看版本信息
docker info 查看docker信息,正在运行等
docker 命令 --help 帮助命令
docker命令
docker [子命令] --help 忘记命令可以用这个查看
# 开启 docker 自启动
systemctl enable docker.service
# 关闭 docker 自启动
systemctl disable docker.service
# 开启容器自启动
docker update --restart=always 【容器名】
例如:docker update --restart=always mysql
# 关闭容器自启动
docker update --restart=no【容器名】
例如:docker update --restart=no mysql
##### 相关配置解析
no:
不要自动重启容器。(默认)
on-failure:
如果容器由于错误而退出,则重新启动容器,该错误表现为非零退出代码。
always:
如果容器停止,请务必重启容器。如果手动停止,则仅在Docker守护程序重新启动或手动重新启动容器本身时才重新启动。(参见重启政策详情中列出的第二个项目)
unless-stopped:
类似于always,除了当容器停止(手动或其他方式)时,即使在Docker守护程序重新启动后也不会重新启动容器。
镜像命令
docker images #查看本机的所有docker镜像
docker search ** #搜索某种镜像
docker pull 镜像名称:版本 #下载镜像命令,没有版本默认最新
docker rmi -f $(docker images -aq)/名称/ID ID2 ... #删除所有镜像/名称/多个ID
docker tag 镜像ID 镜像名称 #复制一个镜像
容器命令
docker run [可选参数] image(容器id/名字) /bin/sh或者/bin/bash
#启动容器: 参数:
--name="名称" -d 后台运行 -it 交互方式运行并进入 -p:指定容器端口(-p 主机端口:容器端口)
exit :#关闭容器并退出 ctrl+p+q #容器不关闭退出
docker ps [-aq] #显示正在运行的容器 -a:显示所有历史运行过的容器 -aq只显示容器ID
docker rm [-f] 容器ID #删除某个容器
#启动和停止容器
docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker kill 容器ID
其他常用命令
docker run -d 镜像名称/id #后台运行容器时必须有前台进程,否则docker容器会自动关闭
docker logs [-t -f] --tail id/名字 #查看docker日志
docker top 容器id #查看docker容器的进程信息
docker inspect 容器id #docker的镜像元数据 重要!!!
docker exec -it 容器id /bin/bash #交互方式进入容器并操作(新建窗口)
docker attach 容器id #进入容器并操作(不新建窗口)
docker cp 容器id:/../目录/文件 主机目录 #容器文件拷贝到主机
提交自己的镜像
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:TAG]
容器卷技术
方式一:-v
#指定路径挂载 还有具名和匿名
docker run -it -v 主机目录:容器目录 /bin/bash #双向关联挂载卷,将主机目录和容器目录关联
#docker inspect可以查看是否挂载成功 Mounts:[]中
#touch 文件名 创建文件可以进行测试
实战mysql
#docker pull mysql:8.0 使用卷挂载,挂载配置文件和data
#官网:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# -d 后台运行 -e 环境配置
#启动命令
docker run -d -p 主机port:容器port -v 主机目录:容器目录 -v ... -e MYSQL_ROOT_PASSWORD=密码 --name 容器名称 mysql:tag
--restart always
no 不自动重启容器. (默认value)
on-failure 容器发生error而退出(容器退出状态不为0)重启容器
unless-stopped 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
always 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
具名和匿名挂载
#查看所有的volume情况
docker volume ls
#匿名挂载 不写容器外路径 默认卷路径:/var/lib/docker/volumes/xxx/_data
-v 容器内路径
#具名挂载 **推荐**
-v 卷名:容器内路径
#查看卷
docker volume inspect 卷名称
#权限问题
-v 容器内路径:ro #只读 **只读的话,只能宿主机操作,容器内部无法操作**
-v 容器内路径:rw #可读可写 **默认**
方式二:Dockerfile
#Dockerfile:用于构建docker镜像的构建文件
#创建dockerfile文件 名字随意,建议Dockerfile
#文件内 指令大写 :
FROM centos
VOLUME ["volume01","volume02"...] #匿名挂载卷
CMD echo "------end-----"
CMD /bin/bash
#然后构建镜像 **镜像名字不能有/** 注意有个 . 点
docker build -f dockerfile文件 . -t 镜像名字:tag
数据卷容器
#正常创建一个容器docker01 docker run -it --name xxx id:tag
#第一个就是数据卷容器,然后创建第二个
#docker run -it --name docker2 --volumes-from docker1 id:tag
--volumes-from
#数据卷生命周期为一直到没有容器使用,关联了宿主机的话就是持久化保存
DockerFile
指令集
#关键字 都是大写! 每一个指令都会创建一个镜像层提交 比如添加jdk、Tomcat都是构建成镜像
FROM xxx #基础镜像 scratch相当于Object 实际使用可能更多centos
MAINTAINER #镜像是谁写的 姓名+邮箱
RUN # 镜像构造时需要运行的命令
ADD # 添加内容、Tomcat镜像压缩包等压缩包
WORKDIR #工作目录 添加之后直接进入该目录执行命令
VOLUME # 挂载的目录
EXPOSE #保留端口配置 容器暴露的端口
CMD #制定容器启动要执行的命令可以&&拼接命令! 运行文件时后面添加运行参数会被覆盖
ENTRYPOINT #指定容器启动要运行的命令 ,可追加命令
ONBUILD #当构建一个被继承的DockerFile时会被运行、触发
COPY # 类似ADD将文件复制到镜像 本地内容 docker镜像地址内容
ENV #构建时设置环境变量
构建镜像
docker build -f Dockerfile名称 -t 容器名称:tag .
#注意最后的点 不加点的话 Dockerfile名称可以换成一个路径,默认找当前路径的Dockerfile文件
镜像推送阿里云仓库
#1. 登录阿里云Docker Registry
$ sudo docker login --username=java_lmy registry.cn-hangzhou.aliyuncs.com
#用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
#您可以在访问凭证页面修改凭证密码。
#2. 从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/lmytest/lmy:[镜像版本号]
#3. 将镜像推送到Registry
$ sudo docker login --username=java**** registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lmytest/lmy:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/lmytest/lmy:[镜像版本号]
#请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
#4. 选择合适的镜像仓库地址
#从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
#如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
#5. 示例
#使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
#使用 "docker push" 命令将该镜像推送至远程。
$ sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
Docker打包
docker save 输出路径.tar #打包成压缩包
docker load/import 路径 #解压压缩包
#有远程仓库就不用
Docker网络
docker0
#安装之后ip addr就会有docker0 255.255.0.1/16 有65535个ip 255*255-2
#255.255.0.1/24 共255个
# evth-pair技术,是一对虚拟设备接口,一端连着协议,一端彼此相连
#每个容器都会有一对虚拟网络接口,会去连接docker0,容器互联都通过docker0
–link
#通过容器互联(通过服务名称) 容器1可以ping容器2 反向不可以
# 本质就是在/etc/hosts中增加了一个ip配置
docker run -d --name 容器1 --link 容器2 镜像名
#此方式不方便,了解
自定义网络mynet
#查看所有的docker网络
docker network ls
#网络模式: bridge 桥接、 none 不配置网络、host 和宿主机共享网络
#容器启动命令自带一个默认参数:--net bridge
#创建自定义网络
#--driver bridge桥接模式 默认
#--subnet 192.168.0.1/16网段与个数
#--gateway 192.168.0.1 网关
docker network create --driver bridge --subnet 192.168.0.1/16 --gateway 192.168.0.1 mynet
#使用自定义网络,可以容器互联,通过容器名;启动容器时加--net 自定义网络名
docker run -d -P --name 容器名 --net 网络名 镜像名
网络连通
#docker0中容器和mynet连通:container1和mynet连通
docker network connect mynet container1
实战:springboot服务发布
#构建springboot项目并打包jar/war,idea搜索docker可以下载docker 插件
#编写dockerfile文件
#构建镜像##把包和file文件传到服务器
#发布运行
docker学习-进阶
Docker Compose(k8s基础)
#docker单机容器管理
#1.docker-compose安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#2赋予文件权限 docker-compose --version测试
sudo chmod +x /usr/local/bin/docker-compose
#3开始使用
#1)定义Dockerfile。
#2)定义docker-compose.yaml
#3)运行docker-compose up和应用程序(jar或者Tomcat)
docker-compose up #启动容器项目
docker-compose up --build #重新打包部署
docker-compose.yaml
#配置文件详情 分三层:版本--服务--其他配置
#(官网看配置https://docs.docker.com/compose/compose-file/compose-file-v3/)
version: "3.9" #版本:注意对应docker版本,具体看官网
services: #服务层
web: #web服务
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
depends-on: #依赖redis启动
- redis
restart: always
enviroment: #配置环境
REDIS_HOST: redis:6379
REDIS_USER: root
redis: #redis服务
image: redis
#其他配置 网络、卷、全局规则等
volumes:
logvolume01: {}
networks:
configs:
体验:开源博客项目WordPress(官网)
#部署博客:
#1下载项目docker-compose.yaml文件(如果没有Dockerfile需要自己写)
#2.直接启动 docker-compose up即可
Docker swarm
基础操作
#容器集群管理分两种节点 manager(管理节点)和worker(工作节点)
#分层:swarm-->node-->service-->task(单个容器)
#例:docker swarm node ls 管理节点可以展示节点列表,工作节点不可以
docker swarm [options] #--help 查看参数
#主要options:
init [options]#初始化一个集群 初始化完成之后会显示token让其他节点加入
docker swarm init --advertise-addr ip 集群广播地址(其他join)
join #加入一个集群
docker swarm join --token 获取到的token
leave #离开集群
update #更新
join-token #获取管理/工作节点令牌docker swarm join-token manager/worker
Raft协议
#保证大多数节点可用,即 3个节点挂1个,其他可用;2个节点挂1个都不可用
服务启动
#容器--服务-副本:多个副本容器,每个节点ip都可以访问
#动态扩缩容:可灰度发布、滚动更新
#docker run 启动一个容器(不可动态扩缩容)
docker service #启动一个服务/容器,可以动态扩缩容
create #创建
--mode Service mode (replicated, global, replicated-job,global-job) default "replicated" 管理节点分配task的模式)
update #更新,可新增服务副本(每个节点可有多个副本服务)
docker service update --replicas N(个数) 服务名称
scale #动态扩缩容
docker service scale nginx=5 #扩缩容5个,和上面一个效果