本文将介绍DockerWeave命令整理的详细情况,特别是关于docker常用命令整理的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于dockeri
本文将介绍Docker Weave 命令整理的详细情况,特别是关于docker常用命令整理的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于docker image拷贝加载 docker save docker load、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、docker toolbox 常见的命令整理、Docker Weave 介绍 or 工作原理的知识。
本文目录一览:- Docker Weave 命令整理(docker常用命令整理)
- docker image拷贝加载 docker save docker load
- Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
- docker toolbox 常见的命令整理
- Docker Weave 介绍 or 工作原理
Docker Weave 命令整理(docker常用命令整理)
Docker Weave 命令整理
- # 查看 weave 状态
- weave status
- # 查看状态详情
- weave status connections
- # 查看 weave 相互之间节点建立的关系
- weave status peers
- # 查看当前分配的容器
- weave ps
- # 查看 weave 当前版本
- weave version
- # 启动并与其他主机建立连接,启动 weave 并下载镜像
- weave launch
- # 进行连接 IP 连接对端服务器
- weave launch <ip address>
- # 使用 weave 代理
- weave env
- # 执行输出 | 来自 weave env 的输出
- export DOCKER_HOST=unix:///var/run/weave/weave.sock
- # 关闭 weave
- weave stop
- # 关闭 weave env 代理
- export DOCKER=OPTS=
docker image拷贝加载 docker save docker load
解决问题:
在内网下,使用跳板机上下载的docker镜像启动docker
1,在跳板机上下载镜像
2,打包镜像
3,拷贝镜像到对应运行docker的机器上
4,加载镜像到机器上
1,在跳板机上下载镜像
[root@home]# docker pull Nginx
…
[root@home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/Nginx latest 5f6fbb9839f4 2 days ago 223 MB
2,打包镜像
[root@home]# docker save -o Nginx.tar docker.io/Nginx
3,拷贝镜像到对应运行docker的机器上
[root@home]# scp ngnix.tar 172.16.14.21:/data
…
4,加载镜像到机器上
[root@localhost data]# docker load -i Nginx.tar
…
Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
在 Docker 容器里面使用 docker run
/docker build
?
Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择。而在 DevOps 中,我们需要将各种后端/前端的测试/构建环境打包成 Docker 镜像,然后在需要的时候,Jenkins 会使用这些镜像启动容器以执行 Jenkins 任务。
为了方便维护,我们的 CI 系统如 Jenkins,也会使用 Docker 方式部署。 Jenkins 任务中有些任务需要将微服务构建成 Docker 镜像,然后推送到 Harbor 私有仓库中。 或者我们所有的 Jenkins Master 镜像和 Jenkins Slave 镜像本身都不包含任何额外的构建环境,执行任务时都需要启动包含对应环境的镜像来执行任务。
我们的 Jenkins Master、Jenkins Slaves 都是跑在容器里面的,该如何在这些容器里面调用 docker run
命令启动包含 CI 环境的镜像呢? 在这些 CI 镜像里面,我们从源码编译完成后,又如何通过 docker build
将编译结果打包成 Docker 镜像,然后推送到内网仓库呢?
答案下面揭晓。
一、原理说明:/var/run/docker.sock
Docker 采取的是 Client/Server 架构,我们常用的 docker xxx
命令工具,只是 docker 的 client,我们通过该命令行执行命令时,实际上是在通过 client 与 docker engine 通信。
我们通过 apt/yum 安装 docker-ce 时,会自动生成一个 systemd 的 service,所以安装完成后,需要通过 sudo systemctl enable docker.service
来启用该服务。 这个 Docker 服务启动的,就是 docker engine,查看 /usr/lib/systemd/system/docker.service
,能看到有这样一条语句:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
默认情况下,Docker守护进程会生成一个 socket(/var/run/docker.sock
)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。 sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。
因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了。具体的命令见后面的「示例」部分。
要记住的是,真正执行我们的 docker 命令的是 docker engine,而这个 engine 跑在宿主机上。所以这并不是真正的 "Docker in Docker".
二、示例
在容器内部使用宿主机的 docker,方法有二:
- 命令行方式:将
/usr/bin/docker
映射进容器内部,然后直接在容器内部使用这个命令行工具docker
- 需要的时候,也可以将
/etc/docker
文件夹映射到容器内,这样容器内的docker
命令行工具也会使用与宿主机同样的配置。
- 需要的时候,也可以将
- 编程方式:在容器内部以编程的方式使用 docker
- 通过 python 使用 docker: 在 Dockerfile 中通过
pip install docker
将 docker client 安装到镜像中来使用
- 通过 python 使用 docker: 在 Dockerfile 中通过
容器的启动方式也有两种,如下:
1. 直接通过 docker 命令启动
示例命令如下:
docker run --name <name> \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
--user root \
<image-name>:<tag>
**必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock
的用户)**然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。
2. 使用 docker-compose 启动
docker-compose.yml 文件内容如下:
version: ''3.3''
services:
jenkins-master:
image: jenkinsci/blueocean:latest
container_name: jenkins-master
environment:
- TZ=Asia/Shanghai # 时区
ports:
- "8080:8080"
- "50000:50000"
volumes:
- ./jenkins_home:/var/jenkins_home # 将容器中的数据映射到宿主机
- /usr/bin/docker:/usr/bin/docker # 为容器内部提供 docker 命令行工具(这个随意)
- /var/run/docker.sock:/var/run/docker.sock # 容器内部通过 unix socket 使用宿主机 docker engine
user: root # 必须确保容器以 root 用户启动!(这样它才有权限读写 docker.socket)
restart: always
然后通过 docker-compose up -d
即可后台启动容器。
Docker 中的 uid 与 gid
通过上面的操作,我们在容器内执行 docker ps
时,还是很可能会遇到一个问题:权限问题。
如果你容器的默认用户是 root,那么你不会遇到这个问题,因为 /var/run/docker.sock
的 onwer 就是 root.
但是一般来说,为了限制用户的权限,容器的默认用户一般都是 uid 和 gid 都是 1000 的普通用户。这样我们就没有权限访问 /var/run/docker.sock
了。
解决办法:
方法一(不一定有效):在构建镜像时,最后一层添加如下内容:
# docker 用户组的 id,通常都是 999
RUN groupadd -g 999 docker \
&& usermod -aG docker <your_user_name>
这样我们的默认用户,就能使用 docker 命令了。
P.S.
999
不一定是 docker 用户组,所以上述方法某些情况下可能失效。这时还是老老实实通过docker run -u root
启动容器吧。(或者在docker-compose.yml
中添加user: root
属性)
参考
- Docker in Docker - 王柏元
docker toolbox 常见的命令整理
附使用docker toolBox 常见的命令
// 重新生成证书
docker-machine regenerate-certs default
// 重启Docker主机
docker-machine restart default
// 关闭default主机
docker-machine stop default
// 移除default主机
docker-machine rm default
// 新建主机
docker-machine create --driver virtualBox default
// 进入default主机
docker-machine ssh default
Docker Weave 介绍 or 工作原理
Docker Weave Network
Weave Network:属于第三方网络项目。
Weave在Docker主机之间实现Overlay网络,使用业界标准VXLAN封装,基于UDP传输,也可以加密传输。
Weave Net创建一个连接多个Docker主机的虚拟网络,类似于一个以太网交换机,所有的容器都连接到这上面,互相通信。
Weave Net由多个peer组成,Weave路由器运行不同Docker主机上,是一个用户空间的进程;每个peer都有一个名称,重启保持不变。它们通过TCP连接彼此,建立后交换拓扑信息。
Weave Net可以在具有编号拓扑的部分连接的网络中路由数据包。
例如:在下面网络中,peer1直接连接2和3,但是如果1需要发送数据包到4和5,则必须先将其发送到peer3。
Weave Net中的”fast data path”使用Linux内核的OpenvSwich datapath模块。该模块使Weave Net路由器能够告知内核如何处理数据包。
OpenvSwich datapath和VXLAN功能在Linux内核版本3.12+才支持,如果内核不支持,则Weave Net使用”user mode”数据包路径。Weave Net会自动选择两台主机之间最快的路径传输数据,提供近原生吞吐量和延迟。
特点:
# IP地址管理(IPAM)
Weave自动为容器分配唯一的IP地址。可通过weave ps查看
# 命名和发现
命名的容器自动会注册到Weave DNS中,并可以通过容器名称访问。
注:weave自己维护了一个微型的dns服务器。可以实现主机名通信。
# 负载均衡
允许注册多个相同名称的容器,Weave DNS随机为每个请求返回地址,提供基本的负载均衡功能。
注:如果访问容器名相同,则会自动轮询访问该容器,实现负载均衡。
# 手动指定IP地址
docker run –it –e WEAVE_CIDR=10.32.0.100/24 busybox
# 动态拓扑
可以在不停止或重新配置剩余Docker主机的情况下添加主机到Weave网络中或从Weave网络中删除
# 容错
weave peer不断交换拓扑信息,监视和建立与其他peer的网络连接。如果有主机或网络出现故障,Weave会绕过这个主机,保证两边容器可以继续通信,当恢复时,恢复完全连接
Docker Weave 工作原理
- 网卡设备
- Container eth0:eth0是容器主机的默认网络,主要提供容器访问外网所提供的服务,走的默认docker网络架构,只不过他创建了docker_gwbridge这个网桥。
- docker_gwbridge:docker_gwbridge是容器所创建的网桥它替代了docker0的服务。
- Contailner ethwe:它是veth pair虚拟设备对,与其他容器通信的网络虚拟网卡。
- vethwe-bridge:是ethwe设备对创建的weave网桥。网桥内分配的具体的IP与网关。
- weave:weave网桥,通过route路由表找到目标,通过端口将数据包转发到对端端口节点。
- eth0:真机网卡与外界网卡连接得真机网卡,它用来转发,容器VXLAN与NAT两种网卡类型的数据包到指定的对端节点。
- 注:weave会将相邻的节点互相学习,通过route路由表进行相互通信,并通过单独的端口发送数据。类似于静态路由。
Contailner ethwe 发送数据包到对端容器通信
1、ethwe 会将数据包发送给vethwe-bridge网桥。
2、vethwe-bridge接收到数据包后由weave去处理这个数据,通过UDP6783数据端口依照weave的路由表转发到下一路由节点。
3、如果该节点就是目的地,本地weave会把信息转发到内核的TCP协议站,再转发到目的节点。
今天关于Docker Weave 命令整理和docker常用命令整理的讲解已经结束,谢谢您的阅读,如果想了解更多关于docker image拷贝加载 docker save docker load、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、docker toolbox 常见的命令整理、Docker Weave 介绍 or 工作原理的相关知识,请在本站搜索。
本文标签: