docker dockerifle docker-compose文件编写/本地移植docker images在没有网络的情况下
从dockerfile新建镜像,根基基础alpine镜像构建
- dockerfile 编写
- 构建镜像
- docker build -t python3_ssh ./
导出images 文件
要在 Docker 中导出本地镜像并在另一台机器上安装该镜像,可以按照以下步骤进行操作:
-
导出本地镜像:
使用docker save
命令可以将本地镜像保存为一个 tar 归档文件。例如,假设你要导出名为my_image
的镜像,可以运行以下命令:docker save -o my_image.tar my_image
这将在当前目录下生成一个名为
my_image.tar
的 tar 归档文件,其中包含了my_image
镜像的所有信息。 -
将 tar 归档文件传输到另一台机器:
将生成的 tar 归档文件传输到另一台机器,可以使用 scp、rsync 或其他文件传输工具进行操作。 -
在另一台机器上加载镜像:
在另一台机器上,可以使用docker load
命令来加载从本地机器导出的镜像。例如,假设你已经将my_image.tar
文件传输到另一台机器上,可以运行以下命令:docker load -i my_image.tar
这将在另一台机器上加载
my_image.tar
中包含的镜像。
一旦镜像加载完成,你就可以在另一台机器上使用该镜像来创建容器或进行其他操作了。
目标机器导入load
创建Docker-compose.yaml(错误的)
version: '3'
services:
sfc_report:
image: python3_ssh:lastest ##优先本地,本地没有就远程
restart: always
command: ["python3","-m","http.server"]
ports:
- 10240:8000
- 8022:22
volumes:
- /home/autotest/report:/root/report
提示找不到镜像,默认从远端拉取
![image](https://img2023.cnblogs.com/blog/3036865/202311/3036865-20231109164728877-821037905.png)
原因和解决办法:
分割线
2023.11.10
只需要将load的镜像加个tag就可以了
docker tag id new_tag
- 原因
当运行 docker-compose 时,您实际上是在远程主机 tcp://...:2376 上运行 Docker,而在单独运行 docker 时,您是在本地运行 Docker。
当您运行docker images 时,您确实会看到存储在您机器上本地的图像列表。但是docker-compose up -d 将尝试不在您的本地机器上启动容器,而是在...:2376 上。 docker images 不会向您显示远程 Docker 主机上可用的映像,除非您设置 DOCKER_HOST 环境变量,例如:
DOCKER_HOST=tcp://...:2376 docker images
显然,远程 Docker 主机没有存储web-server:staging 映像,Docker 集线器上也没有可用的映像。这就是为什么 Docker 抱怨它找不到镜像的原因。
docker server和docker cli怎么通信的
Docker 服务器(也称为 Docker 守护进程或 Docker 守护进程)和 Docker 客户端之间通过 REST API 进行通信。这种通信是通过 Unix 套接字(Unix socket)或网络端口进行的,具体取决于 Docker 守护进程的配置。
-
Unix 套接字通信(域套接字):默认情况下,Docker 守护进程会在
/var/run/docker.sock
路径下创建一个 Unix 套接字文件。Docker 客户端通过连接到这个套接字文件来与 Docker 守护进程通信。Docker 客户端发送命令和请求到这个套接字文件,Docker 守护进程接收并处理这些请求,然后返回响应给客户端。 -
网络端口通信:在某些情况下,Docker 守护进程也可以配置为监听网络端口,允许远程 Docker 客户端通过网络连接进行通信。这种情况下,Docker 客户端可以通过指定 Docker 守护进程的 IP 地址和端口来连接并发送命令和请求。
无论是通过 Unix 套接字还是网络端口,Docker 客户端和 Docker 守护进程之间的通信都是基于 Docker Remote API 的。Docker 客户端发送 REST 请求到 Docker 守护进程的 API 端点,然后 Docker 守护进程处理这些请求并返回相应的 JSON 格式响应。
总之,Docker 客户端和 Docker 守护进程之间的通信是通过 REST API 进行的,可以通过 Unix 套接字或网络端口进行连接。
查看监听的端口
Docker 守护进程默认情况下会在以下端口上监听:
-
Unix 套接字:
/var/run/docker.sock
是 Docker 守护进程默认的 Unix 套接字路径。Docker 客户端可以通过连接到这个套接字文件来与 Docker 守护进程通信。 -
网络端口:Docker 守护进程默认不会在网络端口上监听。但是,如果需要,可以通过配置 Docker 守护进程来监听网络端口。默认情况下,如果 Docker 守护进程在网络端口上监听,通常会使用
2375
或2376
端口。
需要注意的是,默认情况下,Docker 守护进程不会在网络端口上监听,因为这可能会引起安全风险。如果你需要远程访问 Docker 守护进程的 API,建议使用 TLS 加密和认证来保护通信。
- 解决办法
- 本地使用dockerfile重新构建(以下删除)
version: '3'
services:
report:
image: python3_hhtp ##新的镜像的名字从build指定目录的dockfile创建 image是最终的镜像名,不会生成中间镜像
#使用本地镜像构建:
build: .
restart: always
#command: ["python3","-m","http.server"]
ports:
- 10240:8000
- 8022:22
volumes:
- /home/autotest/report:/root/report
~~
补充
docker-compose.yaml写法
在docker-compose.yaml文件中,定义了Docker Compose服务的配置。以下是一些常用的docker-compose.yaml文件中的参数介绍:
-
version
:指定Docker Compose文件的版本号,定义了使用的Docker Compose的语法版本。 -
services
:定义了要运行的服务及其配置。每个服务都可以指定镜像、端口映射、环境变量、挂载卷等。 -
volumes
:定义了数据卷的配置,可以指定数据卷的名称、驱动、路径等。 -
networks
:定义了网络的配置,可以指定网络的名称、驱动、IP地址等。 -
environment
:定义了环境变量的配置,可以为每个服务指定特定的环境变量。 -
ports
:定义了端口映射的配置,可以将容器内部的端口映射到宿主机上的端口。 -
depends_on
:定义了服务之间的依赖关系,可以指定一个服务依赖于另一个服务。 -
restart
:定义了服务的重启策略,可以指定在什么情况下重启服务。
这些是docker-compose.yaml文件中的一些常用参数,可以根据实际需要进行配置。
查看已经运行的容器的build参数
通过docker inspect python3_ssh 查看Config字段
podman
和 docker
都是用于管理容器的工具,但它们有一些区别。
-
架构:
docker
使用一个守护进程(daemon)来管理容器,而且通常需要以root用户或者通过sudo来运行命令。podman
不需要守护进程,它使用普通的用户进程来管理容器和镜像,因此不需要特权用户权限。
-
兼容性:
docker
是Docker公司开发的容器管理工具,它的命令行接口和配置文件格式都是Docker特有的。podman
是Red Hat公司开发的工具,它的命令行接口和配置文件格式与Docker兼容,因此可以作为Docker的替代品来使用。
-
Rootless容器:
podman
支持在没有root权限的情况下运行容器,这对于一些安全性要求较高的环境非常有用。docker
需要root权限来启动守护进程,因此在没有root权限的情况下无法运行。
总的来说,podman
是一个具有更多安全特性的容器管理工具,而且在功能上与docker
非常类似。如果你有安全性要求较高的环境,或者不希望使用root权限来管理容器,那么podman
是一个很好的选择。