一、docker容器快速上手以及简单操作
docker的image和container
image镜像
docker image就是一个read.only文件,可以理解成一个模版,docker image具有分层的概念
可以自己制作,也可以从registry拉去
container容器
一个运行中的docker image,实质上是复制image最上层read.write的层,基于同一个image可以创建多个container
Docker容器的attached和detached的区别
Attached(附着)模式 交互式连接
在attached模式下,容器启动时会将其标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)直接绑定到宿主机的当前终端。这意味着容器的输出(如日志、提示信息等)会实时显示在用户的命令行界面中,用户可以直接在该终端上与容器进行交互,如输入命令、查看输出等。
前台运行: 当容器以attached模式运行时,它是前台任务,占据着当前命令行会话。用户在该会话中无法执行其他命令,直到容器停止或者用户手动中断(例如通过Ctrl+C)。
调试与监控: 由于attached模式提供了即时的输出反馈,它特别适合于开发和调试阶段,让用户能够直观地观察容器内部程序的运行状况、响应输入以及处理错误。
容器生命周期与终端关联: 通常情况下,当用户关闭或退出与容器attached的终端时,容器会被视为接收到了一个终止信号(如SIGINT或SIGTERM),并随之停止运行。这使得attached模式下的容器生命周期紧密依赖于宿主机终端会话的持续性。
Detached(分离)模式 后台运行
在detached模式下,容器在后台以非交互的方式启动,不与宿主机的任何终端直接关联。启动容器后,Docker会立即返回命令行提示符,允许用户在同一会话中继续执行其他命令,而不会阻塞在容器的输出上。
日志管理: 由于容器不在前台输出,其日志信息不会直接显示在宿主机的终端上。用户需要通过其他工具(如docker logs命令)来查看容器的输出或跟踪其运行状态。
独立运行: Detached模式下的容器独立于任何终端会话运行,即使用户关闭了启动容器的终端,容器仍会继续运行,直到显式停止(如通过docker stop命令)或遇到内部错误导致退出。这种模式非常适合于部署生产环境中的长期运行服务,确保服务的稳定性和持续性不受终端会话的影响。
无交互性: 由于没有直接的终端连接,用户不能直接在宿主机终端上与detached容器进行交互。如果需要在运行时与容器内部进行交互,可以使用docker exec命令打开一个临时的交互式shell或执行单个命令。
docker容器简单操作命令
docker info #查看docker详细信息
docker image ls #查看所有镜像
docker container run nginx #创建一个nginx镜像的容器(前台运行)
docker container run -d nginx #创建一个nginx镜像的容器(后台运行)
docker run nginx #旧的版本命令 创建一个镜像
docker container ls #查看所有当前运行中的容器
docker container ps -a #查看所有容器详细 或者 ls -a
docker container stop xxx xxx=容器的id #停止服务
docker conteriner rm xxx #删除容器(如果容器运行中无法删除,需要先停掉)
docker conteriner rm id1 -f #强制删除容器,包括运行中的容器
docker container logs xxx #查看容器log
docker container logs -f xxx #动态跟踪查看容器log
docker容器批量操作命令
docker container stop id1 id2 id3 #停掉多个容器
docker container ps -aq #列出所有容器id
docker container stop $(docker container ps -qa) #停掉所有运行中的容器
docker conteriner rm $(docker container ps -qa) #删除所有的容器实例
docker容器的交互模式
交互式进入容器命令
docker exec -it id1 sh #交互式进入容器
docker container run -it busybox sh #创建镜像容器并交互式进入容器,busybox 是镜像名称
linux查看进程id依赖关系
ps aux | grep nginx #查看所有nginx运行进程id
pstree -halps 9930 #查看进程id父子级关系
二、docker镜像的创建管理和发布
docker镜像的获取
从 Docker Hub 获取
Docker Hub 是 Docker 官方维护的公共镜像仓库,其中包含了大量由官方和社区贡献的免费和付费镜像。网址:Docker Hub Container Image Library | App Containerization
从red hat quay 获取
red hat quay是一个流行的第三方 Docker 镜像仓库,由 CoreOS(现为 Red Hat 公司的一部分)开发和维护。网址:Quay Container Registry · Quay
对于中国地区的用户,由于网络原因,直接从 Docker Hub 拉取镜像可能会速度较慢或不稳定。此时可以利用国内的镜像加速服务,如阿里云、腾讯云、DaoCloud 等提供的镜像加速器。
通常做法是: 注册并获取加速器地址。 编辑 Docker 配置文件 /etc/docker/daemon.json(Linux 系统)或 Docker for Windows / Docker for Mac 的相关设置,添加如下内容:
{"registry-mirrors": ["https://加速器地址"]
}
从私有仓库获取
在企业内部或受限网络环境中,可能需要使用私有 Docker 仓库,如 Harbor、Artifactory、Nexus 等。
配置私有仓库认证和拉去镜像
docker login [私有仓库地址]
docker pull [私有仓库地址]/[镜像名]:[标签]
docker镜像的命令操作
在线拉取镜像和删除镜像
docker pull nginx # 拉去docker hub 官方 nginx 最新版本镜像
docker pull nginx:1.20.0 #拉取registry 镜像
docker image inspect xxx #查看镜像详细的信息
docker image rm xxx #删除镜像(注意:正在运行和被容器使用的image镜像是无法删除的)
docker image save xxx镜像名称 -o xxxx文件名称 #把镜像导出为离线文件
docker image load -i xxxx文件 #把镜像离线文件导入
docker image build -t 文件名:1.0 . #编译dockerfile文件 . 代表当前文件夹 --build-arg VERSION=xxx
docker login #登陆
docker image push xxxx #上传镜像到dockerhub
docker image prune -a #删除没有使用到的镜像
离线镜像文件操作
#把镜像导出为离线文件, nginx.image是文件名称
docker image save nginx:1.20.0 -o nginx.image#把离线文件导入为镜像
docker image load -i ./nginx.image docker image build -t 文件名:1.0 . #编译dockerfile文件 . 代表当前文件夹 --build-arg
三、容器
#容器的基本操作
docker info #查看docker详细信息
docker image ls #查看所有镜像
docker container run nginx #创建一个nginx镜像的容器(前台运行)
docker container run -d nginx #创建一个nginx镜像的容器(后台运行)
docker run nginx #旧的版本命令 创建一个镜像
docker container ls #查看所有容器
docker container ps -a #查看所有容器详细 或者 ls -a
docker container stop xxx xxx #停止服务
docker conteriner rm xxx xxx #删除容器
docker conteriner run -p 80:80 nginx #端口映射创建镜像
docker container stop $(docker container ps -qa) #停止所有服务
docker container rm $(docker container ps -aq) #删除所有容器
docker comtainer rm -f xxx #强制删除
docker attach xxx #进入容器attach模式
docker container logs xxx #查看容器log
docker container logs -f xxx #动态跟踪查看容器log
docker container run -it ubuntu sh #创建一个交互式的ubuntu的容器
docker run -it ubuntu /bin/bash #创建一个交互式的ubuntu的容器
docker exec -it xxx sh #交互式进入正在运行容器的sh
docker pull nginx:1.20.0 #拉取registry 镜像
#imgae 镜像
docker image inspect xxx #查看镜像详细的信息
docker image rm xxx #删除镜像(注意:正在运行和被容器使用的image镜像是无法删除的)
docker image save xxx镜像名称 -o xxxx文件名称 #把镜像导出为离线文件
docker image load -i xxxx文件 #把镜像离线文件导入
docker image build -t 文件名:1.0 . #编译dockerfile文件 . 代表当前文件夹 --build-arg VERSION=xxx
docker login #登陆
docker image push xxxx #上传镜像到dockerhub
docker image prune -a #删除没有使用到的镜像
docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -v mysql-data:/var/lib/mysql mysql:5.7 #mysql 数据持久化
docker system prupe -f #清理系统
docker volume prune -f #volume清理
docker run -i -t -d --name bt -p 20:20 -p 21:21 -p 9000:80 -p 888:888 -p 8888:8888 --privileged=true -v E:\www:/www baota:v0 #ip+文件映射启动容器
#linux 一些命令
pstree -halps 进程id #查看进程id结构
ping xxxxx #测试网络的连通性
telnet xxx : 80 #端口是否可达
traceroute #网络路径跟踪
ip addr #linux 查看ip地址
ifconfig #linux 查看ip地址
ipconfig #windows 查看ip地址
docker的image和container
image镜像
docker image就是一个read.only文件,可以理解成一个模版,docker image具有分层的概念
可以自己制作,也可以从registry拉去
container容器
一个运行中的docker image,实质上是复制image最上层read.write的层,基于同一个image可以创建多个container
四、docker网络
1、容器端口映射使用-p 参数进行配置,8080:80 宿主机8080容器内部80端口。也可以 ip:8080:80,这样只有宿主机的ip可以访问8080端口。dockerFile使用expose 设定暴漏端口。
2、docker netword ls 查看docker网络,bridge和host有什么区别,bridge是默认的虚拟网络模式,host网络是容器直接使用宿主机的网络栈。启动创建容器使用--network=host关键字指定使用网络模式。还有一个none模式,这个就是告诉docker启动一个没有网络的容器。
3、linux网络命名空间隔离技术可以使多应用部署独立的网络空间,例如web应用和数据库分别配置独立的网络空间,即使web网络出现故障不会影响db的网络,还有就是安全隔离,db网络严格限制外部访问从而降低数据泄露的风险。
4、bridge网络,当我们创建容器容器会默认连接名为docker0的桥接网络,桥接网络本质上是一个虚拟网络设备,可以想象成一台交换机,将多个网络接口连接在一起,可以实现容器之间的相互通信。
五、容器集群swarm
1、k8s和 docker-swarm都是容器编排和管理工具,总得来说空k8s采用了分布式架构和模块化设计,能够应对大规模的容器集群,常用于大型互联网公司的生产环境。docker-swarm简单易用,更合适中小型的集群的编排。
2、搭建一个多机器的swarm容器集群的大概流程,初始化主节点-创建项目目录和文件结构-编写dockerFile-编写配置文件-编写docker-compose.yml-部署服务到集群
3、swarm夸机器无法满足容器之间通信,overlay网络就是为了解决这些问题而设计的,它是一种虚拟网络,就像云服务器的内网ip通信一样,swarm是可以创建多个overlay网络实现服务的网络隔离。overlay
4、关于容器集群网络有哪些,分为三种,1外部访问部署集群的服务流量通过ingress解决2容器之间访问的流量通过overlay解决-东西向流量3集群访问外部网络的流量-南北向流量通过linux+bridge+iptables nat解决。
5、ingress主要实现swarm外部流量到服务区的负载均衡和路由。
6、docker的服务依赖和检测,在创建dockerfile或者composer时候可以增加healthcheck参数,cmd curl http 状态实现服务检测,可以通过docker inspect命令查看容器的健康状态。依赖是composer配置文件可以通过depends_on 设置服务器启动的优先级,解决应用服务的依赖关系,例如启动一个web服务,web服务需要依赖redis和mysql,web依赖的服务优先安装和启动。