Advertisement

【Docker】个人向Docker基础笔记

阅读量:

个人向Docker基础笔记

  • 一、Docker安装

  • 二、Docker创建镜像

    • 1.Dockerfile的编写
    • 2.镜像的创建
  • 三、Docker创建容器

    • 1. 容器创建
    • 2. 进入创建好的容器

四、Docker常用技巧精粹
* 1.文件映射管理
* 2.宿主机与容器间的用户关联配置
* (1) 当前已创建的容器中的用户与宿主机实现关联
* (2) 在容器尚未启动的情况下, 宿主机用户的权限自动分配给新生成的容器

复制代码
* 3.设置容器端口号
* 4\. 配置主机免密登录

这是一份个人学习笔记。笔者正在努力学习和探索中,专业知识有待提升,请海涵。如有不足之处,请批评指正!希望与大家一起交流学习!

一、Docker安装

在安装过程中,笔者曾遇到过密钥过期等问题。为了解决这个问题的办法即是遵循文中所述采用最新密钥形式。

二、Docker创建镜像

1.Dockerfile的编写

其中每一个RUN指令都会组装一层代码结构,并基于用户所需安装的库进行科学地进行层级划分;而为了优化整体性能表现,在实际操作中应当将那些变化较为有限的部分安排在较高层级的位置上

2.镜像的创建

为容器命名容器文件(可以是其他的...)由于在镜像构建过程中会重新指定文件名)生成镜像。

复制代码
    docker build -f [dockerfile文件名] -t [image name] .
    
    
    bash

三、Docker创建容器

1. 容器创建

基于刚刚创建的镜像,获得一个对应的容器。最简单的创建方式:

复制代码
    docker run -it --name [容器名称] --gpus all [镜像名称]
    
    
    bash

2. 进入创建好的容器

复制代码
    sudo docker ps # 查看要进入的容器的id
    sudo docker exec -it [容器id] /bin/bash
    
    
    bash

参考地址:

四、Docker的常用技巧

1.文件映射

需要注意的是,在创建文件映射时会涉及文件所有者问题。因此,在宿主机创建文件时最好让宿主机用户的ID与容器用户的ID对应。建议在宿主机上创建完成后及时处理此问题。推荐使用Dockerfile来解决这一问题,在下一小节有详细说明这一方法的优势。

以下为文件映射具体步骤

在完成镜像构建后使用生成容器的操作,并带有--v选项,则可以在宿主机的文件夹A中映射到容器中的相应位置;例如,在容器中使用b文件夹即可实现对应关系。

这一做法的好处在于简化了数据传输流程。若要将数据发送至容器中,则只需将数据发送至与宿主机存在映射关系的A文件夹即可。如此操作后,在容器中的B文件夹下即可看到上传的数据

复制代码
    docker run -it -v [宿主机的A文件夹的绝对路径]:[容器的B文件夹的绝对路径] --name [容器名称] --gpus all [镜像名称]
    
    
    bash

其中, gpus all的作用是启用 GPU 支持。

参考地址:

2.宿主机与容器之间的用户映射

(1)现有容器创建用户跟宿主机对应

该问题出现的原因是笔者希望将现有的容器与宿主机共享相同的用户uid。
然而,在Dockerfile中指定参数时有两点需要注意:

  1. 如果你尚未构建任何容器,则可以直接在Dockerfile中指定用户的uid等信息。
  2. 但如果已经有了已构建好的容器,并且希望在此基础上建立新的构建,则这一部分可能会更加适用。

下面为完成该目标的代码:
宿主机的代码

复制代码
    id -u# 获得宿主机用户的uid
    
    
    bash

假设宿主机的用户uid为1000,用户名为uid1.

容器的代码

复制代码
    passwd # 设置root的密码,用于账户之间的切换
    useradd -u [宿主机uid] [宿主机用户名]
    useradd -u 1000 uid1
    
    
    bash

注:当宿主机器的用户名与容器运行的机器用户名不匹配且uid一致时的情况……笔者尚未进行过测试能否解决权限问题?对此有疑问的读者可自行尝试验证

在切换成新用户之前,我们还要在root环境中检查几个事情

  1. root是否配置了密码?
  2. 是否允许新用户访问$PATH环境变量中的路径?
  3. 工作目录的拥有者是否是新用户?
  4. 新用户的个人目录是否存在?

关于第一类相关问题而言,在容器内部进行修改密码是较为稳妥的做法。

复制代码
    echo $PAHT #检查环境变量有哪些
    # 依次执行下面命令即可
    chmod -R 777 [环境变量中列出的地址]
    
    
    bash

处理第3个问题:具体来说,在修改过程中,请将容器工作目录的所有者更改为新创建的用户。

复制代码
    chown -R [新所有者用户名]:[新所有者群组(一般也是用户名)] [修改权限的文件路径]
    
    
    bash

针对第四个问题 ,如果没有,则以root账户创建一个,并将$/.bashrc移动至新用户的家目录下,并将该文件的权限设置为newuser的权限。

检查完毕之后,进行用户切换。

复制代码
    su - [新用户]
    
    
    bash

每次进入容器时,都可以用以上命令切换到创建好的用户。

参考链接:

(2)容器还没创建时跟宿主机用户对应

Dockerfile中先创建好跟宿主机用户一样的uid

复制代码
    docker run -it -v [宿主机的A文件夹的绝对路径]:[容器的B文件夹的绝对路径] -u "[宿主机用户uid]:[宿主机group id]" --name [容器名称] --gpus all [镜像名称]
    
    
    bash

3.设置容器端口号

可以通过设置容器对应的宿主机端口号,来达到vscode直连容器的效果。

  • 调整容器内的 /etc/ssh/sshd_config 配置文件,并将其中指定Port为自定义的端口号以防止端口冲突。
    • 重新启动SSH服务:sudo service ssh restart
      (有时容器挂了后重启后需要重新启动SSH服务)

4. 配置主机免密登录

本步骤的主要功能是将本地系统中的公开密钥通过容器传输通道传递给容器环境,并完成无密授权登录。

复制代码
    ssh-copy-id -p 端口号 -i ~/.ssh/id_rsa.pub  容器用户名@宿主机ip
    
    
    bash

其中,公开密钥在不同系统位置可能不一样,如果没有密钥,需要自行生成。

全部评论 (0)

还没有任何评论哟~