【Docker】个人向Docker基础笔记


Note:本文为个人向笔记,笔者也是在学习摸索中,不够专业敬请见谅,若有写的不合理的地方欢迎指正,大家共同学习共同进步!

一、Docker安装

笔者在安装时遇到了密钥过期之类的问题,我解决的方法就是使用它说的最新的密钥形式。
参考网址:
https://developer.aliyun.com/article/1323800

二、Docker创建镜像

1.Dockerfile的编写

其中每一个RUN指令都会构建一层,依据自己想要安装的库,合理分层进行构建即可:变化比较小的放在前面的层,变化比较大的放在后面的层。

2.镜像的创建

创建文件名为dockerfile的文件(可以是其他的,因为创建镜像时会重新指定文件名)进行镜像创建。

docker build -f [dockerfile文件名] -t [image name] .

三、Docker创建容器

1. 容器创建

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

docker run -it --name [容器名称] --gpus all [镜像名称]

2. 进入创建好的容器

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

参考地址:
https://blog.csdn.net/a519781181/article/details/135552835

四、Docker的常用技巧

1.文件映射

写在前面
需要注意的是,创建文件映射会牵扯到一个文件所有者的问题,因此创建文件,最好使宿主机用户跟容器用户有一个对应,不然后续在宿主机创建文件,所有者是宿主机用户的uid,容器运行,生成的结果为容器用户的uid,比较麻烦。解决所有者权限问题可以通过Dockerfile来解决,或者在创建好容器后再解决。推荐使用Dockerfile解决,第二种解决方法在下一小节有讲。

以下为文件映射具体步骤

在创建好镜像后,创建容器的命令带属性-v,即可以创建与宿主机文件夹A有映射关系的容器,例如,容器的B文件夹。

这样做的好处是,如果想将数据往容器上传,只需要上传到有映射关系的宿主机的A文件夹即可,这样,上传的数据会立刻出现在容器的B文件夹下。

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

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

参考地址:
https://blog.csdn.net/felaim/article/details/105240539

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

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

该部分存在的原因是笔者想让现有容器跟宿主机的用户uid相同。
如果读者还没创建容器,直接在DockerFiler中指定用户以及uid等信息即可。但是如果你的容器已经创建好,并且想基于之前的容器进行创建,那么该该部分可能比较适合。

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

id -u# 获得宿主机用户的uid

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

容器运行的代码

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

注:当宿主机用户名跟容器用户名不一致,但是uid一致的情况,笔者没有做过尝试过能否解决权限问题,有感兴趣的网友可以尝试一下。

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

  1. root有没有设置密码
  2. PATH环境变量中的路径,新用户有没有权利访问。
  3. 工作目录的所有者是不是新用户。
  4. 新用户有没有家目录。

针对第一个问题,只要在容器内运行过passwd,就没大问题。
针对第二个问题,可以执行:

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

针对第三个问题,接下来将容器的工作目录的所有者更改为新创建的用户:

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

针对第四个问题,如果没有的话,用root用户创建一个就好,并且把/root/.bashrc复制到新用户的家目录,所有权也修改成新用户的。

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

su - [新用户]

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

参考地址:
https://blog.csdn.net/lsysafe/article/details/100311332
https://blog.csdn.net/qq_40021015/article/details/138610415

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

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

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

3.设置容器端口号

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

  • 修改容器中 /etc/ssh/sshd_config配置文件,修改配置文件中的Port为自定义的端口号,此处最好设置为比较大的端口号,避免端口号冲突。
  • 重启ssh服务 sudo service ssh restart
    (有时容器挂了,重启之后需要重启ssh服务)

4. 配置主机免密登录

这一步主要是将本地的公开密钥发送到容器中,实现免密登录。
在主机下执行:

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

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

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值