自定义docker镜像
docker-->Ubuntu-->image
是的,您完全可以这样做。这种方法允许您从一个基本的系统镜像开始,手动在容器内部进行环境配置,然后将配置好的环境导出为一个新的Docker镜像。这种方式在需要定制化镜像或进行特定环境配置时非常有用。以下是完成这一过程的基本步骤:
- 创建并启动基本的Ubuntu容器
首先,您需要从Docker Hub上拉取一个基本的Ubuntu镜像,并启动一个容器。如果您还没有Ubuntu镜像,可以使用以下命令获取:
docker pull ubuntu:latest
然后,启动一个基于该镜像的容器:
docker run -it --name ubuntu_base ubuntu:latest /bin/bash
这里,-it
选项让容器的终端变得交互式,--name
用于指定容器的名称,这里命名为my_ubuntu_container
。/bin/bash
启动一个Bash会话,以便您可以在容器内执行命令。
- 在容器内进行环境配置
容器启动后,您将进入Ubuntu的命令行界面。在这里,您可以安装所需的软件包、修改配置文件、安装脚本等,就像在一个标准的Ubuntu系统上操作一样。例如,您可以使用apt-get
安装软件包:
apt-get update
apt-get install -y nginx
完成所有所需的配置后,您可以通过输入exit
命令或使用Ctrl+D
退出容器。
- 从配置好的容器创建新镜像
一旦您完成了在容器中的所有配置,您可以使用docker commit
命令从该容器创建一个新的镜像。以下是命令的基本格式:
docker commit [容器ID或名称] [新镜像名称]:[标签]
例如,要从您之前创建并配置的容器my_ubuntu_container
创建一个新镜像,命名为my_custom_ubuntu
,可以使用:
docker commit ubuntu_llama_factory ubuntu_base:latest
- 导出新创建的镜像
现在,您已经有了一个包含所有自定义配置的新Docker镜像。您可以使用docker save
命令将其导出到一个文件中,如之前所述:
docker save -o ubuntu_base.tar ubuntu_base:latest
这样,您就成功地从一个基本的Ubuntu镜像开始,手动配置了环境,并将配置好的环境导出为一个新的Docker镜像。这个镜像现在可以被导入到其他机器上,或者用作将来容器的基础。
这种方法提供了极高的灵活性,使您能够 精确控制镜像的内容和配置。然而,它也要求您对Docker及所需环境的配置有较深的了解。对于需要重复创建相同环境的场景,考虑使用Dockerfile来自动化构建过程可能更为高效。
从本地复制文件到docker中
docker cp /root/llama_factory.zip singularity_llama_factory:/miniconda3/envs
将tar文件导入docker中
使用 docker load
命令并指定 .tar
文件的路径来导入镜像:
docker load --input /path/to/your/image.tar
再次进入容器
要重新进入一个正在运行的Docker容器的命令行界面,您可以使用docker exec
命令。这个命令允许您在运行中的容器内启动一个新的命令或交互式会话。如果您想要获得一个交互式的Shell会话,可以按照以下步骤操作:
- 确定容器的ID或名称
首先,您需要知道要进入的容器的ID或名称。可以通过运行以下命令来列出所有正在运行的容器,从而找到您需要进入的容器的ID或名称:
docker ps
这个命令会显示所有活跃的容器,包括它们的ID、创建的命令、创建时间、状态、端口等信息。从输出中找到您想要进入的容器的ID或名称。
- 使用
docker exec
命令进入容器
一旦您知道了容器的ID或名称,就可以使用docker exec
命令加上-it
选项(i
代表交互式,t
代表分配一个伪终端)来启动一个交互式的bash会话。假设您的容器ID或名称为container_id_or_name
,可以运行:
docker exec -it container_id_or_name bash
如果容器内部没有bash,您可以尝试使用sh
代替:
docker exec -it container_id_or_name sh
这将会启动一个新的Shell会话,允许您在容器内执行命令。
- 退出容器
当您完成操作,想要退出容器时,可以简单地输入exit
命令或使用Ctrl-D
快捷键。这将结束您的Shell会话,但不会停止容器。
docker file
基础Ubuntu镜像
# 使用 Ubuntu 最新的 LTS 版本作为基础镜像
FROM ubuntu:22.04
# 设置环境变量,防止在安装过程中出现交互式提示
ENV DEBIAN_FRONTEND=noninteractive
# 更新软件包列表
RUN apt-get update
# 安装基础工具
RUN apt-get install -y --no-install-recommends \
git \
curl \
vim \
build-essential \
wget
# 清理缓存,减小镜像大小
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 创建一个新用户 `developer`
RUN useradd -m developer
# 切换到新用户 `developer`
USER root
# 设置工作目录为新用户的家目录
WORKDIR /root
RUN echo 'root:YOURPASSWORD' | chpasswd
# 设置容器启动时执行的命令
CMD ["/bin/bash"]
如果您在构建 Docker 镜像时没有设置用户密码,通常 root 用户也不会有密码。在 Docker 容器中,默认情况下,您可以直接以 root 用户身份执行命令,而无需密码。
如果您是通过 docker run
启动容器的,并且没有指定以非 root 用户运行,那么您应该已经是以 root 用户身份在容器中了。您可以通过运行 whoami
命令来检查当前用户。
如果您发现自己不是 root 用户,并且 su -
命令要求您输入密码,但您不知道密码是什么,您可以尝试以下方法:
-
重新启动容器并以 root 用户身份登录:
当您使用
docker run
命令时,可以通过-u
或--user
选项指定以 root 用户身份运行容器:docker run -u root -it <image_name> /bin/bash
这将允许您以 root 用户身份登录到容器中,并且不会要求输入密码。
-
修改 Dockerfile:
如果您有 Dockerfile 的访问权限,您可以修改 Dockerfile 来确保容器以 root 用户身份运行:
FROM ubuntu:22.04
# 其他指令...
USER root然后重新构建镜像并启动新容器:
docker build -t myimage .
docker run -it myimage -
创建新容器并设置 root 密码:
如果您需要在容器中设置 root 密码,可以在 Dockerfile 中添加以下指令:
FROM ubuntu:22.04
RUN echo 'root:YOURPASSWORD' | chpasswd替换
YOURPASSWORD
为您想要设置的密码。然后重新构建镜像。
请注意,直接在 Dockerfile 中设置 root 密码并不是一个安全的做法,因为密码将会在镜像中以明文形式存在。这种做法应该只用于您完全控制的环境中,而且不应该用于生产环境。在生产环境中,您应该使用更安全的方法来管理凭据。
Docker Ubuntu需要安装的东西
# 切换到bash
bash
apt-get update
#安装基础工具
apt-get install -y vim git build-essential wget
# 安装ifconfig和代理
apt-get install -y net-tools
# 安装sudo
apt-get install -y sudo
# 安装ping
apt install -y vim git build-essential wget
sudo apt-get update && sudo apt-get install -y \
build-essential \
libssl-dev \
uuid-dev \
libgpgme11-dev \
squashfs-tools \
libseccomp-dev \
wget \
pkg-config \
git \
cryptsetup-bin