一、linux当中的容器
docker: failed to connect to the docker API at unix:///Users/triumph/.docker/run/docker.sock; check if the path is correct and if the daemon is running: dial unix /Users/triumph/.docker/run/docker.sock: connect: no such file or directory
Run ‘docker run --help’ for more information
Unable to find image ‘ubuntu:15.10’ locally
docker: Error response from daemon: failed to resolve reference “docker.io/library/ubuntu:15.10”: failed to do request: Head “https://registry-1.docker.io/v2/library/ubuntu/manifests/15.10”: EOF
dockerrmi-fubuntu:15.10//彻底删除镜像而不是删除容器(因为命令里面有一个i)#删除容器的命令dockerrm-f容器# 查看正在运行的容器dockerps# 查看所有容器(包括已停止的)dockerps-adockerstop 容器ID/容器名字#都可以停止容器为什么每次使用docker run都会创建一个新的实例
简单来说:因为 docker run 的设计初衷就是“从蓝图启动一个全新的、隔离的实例”。
如果您再次 docker run,您肯定不希望进入一个已经被修改过的、充满之前实验痕迹的环境。
每次创建新实例保证了环境的纯净和隔离,避免了依赖冲突和配置污染。
如果您想「重复进入」同一个容器,应该怎么做?
# 1. 启动一个已存在的、处于停止状态的容器dockerstart<容器名或ID># 2. 然后附加到它的终端进行交互dockerattach<容器名或ID># 或者将上面两步合二为一:dockerstart-ai<容器名或ID>下面图片的意思是创建一个新的容器,进入里面在内部进行交互
总结当我们想和以前容器的终端进行操作
docker pull postgres:latest(先拉取镜像,后面才能开启镜像)
- docker run -i -t ubuntu:22.04 /bin/bash(开启一个终端,并进行交互)
- docker start -ai 240a9b0b853e (以后再进入这个容器内的时候就可以直接用了)
- 或者你启动了容器后,docker attach 容器ID/容器名字
1.挂载
在 Docker 中,挂载(Mounting) 的本质和操作系统是一样的,但目的更具体:把宿主机(你的电脑或服务器)上的文件或文件夹,连接到容器内部的一个目录,让容器能读写宿主机上的数据。实现数据持久化。
docker run-d \--name timescaledb \ \\需要注意一下的事情相当于是给当前的容器命名-v/home/cm3d/timescaleData:/home/postgres/pgdata/data \-e POSTGRES_PASSWORD=mysecret \-p5432:5432\-v/home/cm3d/timescaleData:/home/postgres/pgdata/data ↑ ↑ 宿主机路径 容器内路径(source)(target)Docker 容器是一个隔离的虚拟环境,容器里的文件默认都存在容器内部虚拟磁盘,一旦容器被删除,里面所有数据库、日志数据会全部消失。-v A:B 挂载就是打通宿主机(你的服务器)和容器内部的目录通道: A:宿主机真实路径(服务器硬盘上的文件夹/文件) B:容器内部访问的路径 容器读写 B 里的文件,实际操作的是服务器硬盘上 A 的文件,实现数据持久化、文件共享、时区同步。2.docker start -ai container 为什么进入linux容器的shell,进入不了数据库的shell
- 数据库容器的主进程是数据库服务本身,而不是 shell。docker start -ai 会附加到容器的主进程(通常是
MySQL、PostgreSQL 等数据库程序) - docker exec -it 3d7e767f33d9(镜像的ID或者就是镜像的名字)/bin/sh 使用这个可以
这个命令是进入已经存在的容器,不是拉取新镜像。
2、docker-compose.yaml
用一个 yaml 文件批量定义、启动、管理一组互相配合的 docker 容器。
https://www.runoob.com/docker/docker-compose.html
只有在 docker-compose.yml 的 volumes 中明确映射的子目录,才属于“挂载到容器”,例如: volumes: - ./config:/workspace/config - ./results:/workspace/results 表示: Windows:docker_robot\config ↕ 实时共享 容器: /workspace/config二、windows中的容器(docker desktop)
1、docker desktop
参考安装https://blog.csdn.net/twoz_/article/details/163705858 (可以选择对应的虚拟器)
基础教程:https://www.cnblogs.com/phzmxw/p/18657577
正常情况下,打开 Docker Desktop,它会自动拉起内置的 Docker Engine(dockerd),等左下角鲸鱼图标变成绿色、面板显示 running,引擎就就绪了,你就可以直接跑docker命令
2 、docker_robot(父节点)
- 它不是一个单独容器,所以你看到它的
Container ID、Image两栏是空的;相当于是项目的总目录,所有的子容器都在这里面,所有的配置都在这个地方 - 在后台启动当前项目
cdC:\Users\cm3d\Desktop\jxb\docker_robotdockercompose up-d- 这个名字就是你
compose.yaml里项目的名字(默认是 yaml 所在文件夹名,也可以手动指定name: docker_robot); - 对它点启动 / 停止,会批量控制这个项目下全部容器一起启停。
ros_rviz_test_bridge(子容器),它们之间的关系Compose 会自动把同项目下所有容器放到同一个自定义网桥里,容器之间可以直接用服务名互相通信
Dockerfile → 构建镜像 镜像 → 创建容器 容器 → 启动、停止和运行3、如何去创建这个项目呐
Docker Desktop 不能直接创建 Windows 项目总目录;总目录需要在 Windows 文件资源管理器或 PowerShell 中创建。
例如在 PowerShell 中:mkdir C:\Users\cm3d\Desktop\jxb\new_project 然后把 Dockerfile 和 compose.yaml 放进该目录,再运行:
cd C:\Users\cm3d\Desktop\jxb\new_project
docker compose up -d
Docker Desktop 就会自动显示这个 Compose 项目及其容器。
简单来说:
Windows创建项目目录
→ 目录内放compose.yaml
→ 执行docker compose up
→ Docker Desktop显示该项目
4、什么是Dockerfile文件
Dockerfile 就是创建 Docker 镜像的“安装说明书”,它规定基础系统、需要安装的软件、需要复制的代码,以及容器启动时运行什么程序。