docker学习

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个,和上面一个效果
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有什么是应该

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值