隔了许久之后A-suozhang也开始用起了Docker
Installation
Nvidia docker的配置
- 对于LXC的eva服务器,需要在主机上进行一些操作,不然在container中启动docker服务会报错
- modprobe overlay
- 还有一个这个问题
- 主要参考nvidia-docker的官方installation guide
- 最后一步的命令
docker run --rm --gpus all nvidia/cuda:10.0-base nvidia-smi
,会报错idocker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"nvidia-smi\": executable file not found in $PATH": unknown
- 原因是LXC中的nvidia驱动的位置变了,启动docker需要换成这个指令
docker run -v /usr/local/nvidia//:/usr/local/nvidia --rm -ti --gpus all nvidia/cuda:10.0-base bash
- 最后一步的命令
换国内镜像
- 首先执行以下命令,查看是否在 docker.service 文件中配置过镜像地址,如果有删除
$ systemctl cat docker | grep '\-\-registry\-mirror'
- 如果命令有输出:
systemctl cat docker
查看 ExecStart= 出现的位置, 修改对应的文件内容去掉 –registry-mirror 参数及其值 - 如果没有,pass
- 新建或者添加以下内容到
/etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
使用
Cheat Sheet
一些很基础的操作
docker run -it --name="somebody" ubuntu:16.04
- 会自动从docker官方镜像开始pull下ubuntu16.04的标准镜像
- -it表示interactive term
- -v 可以进行地址挂载
-v $SOURCE:$TARGET
,注意要用绝对路径 - –rm 退出之后自动删除,经常用于测试
- 显示已经停止的docker image
docker ps -a
- 显示正在运行的docker image
docker image ls
- 从上面两个命令可以看到docker ID
docker restart/start/stop/attach $DOCKER_ID
- get-container-ID -
sudo docker ps -aqf "name=containername"
- copy file from host
docker cp $CONTAINER_ID/$CONTAINER_NAME:/foo.txt foo.txt
- docker中的cp相当于linux中的cp -a会自动递归复制该目录下的所有
- 删除container和image名字一样怕搞错的话直接用ID
- 可以直接重命名用
docker rename
(用docker ps -a
看)
Fisrt Step
- 登录上一个docker image之后的操作
- 可能是docker run之后直接开始的,也可能是docker attach到特定docker
- docker登录之后的几个措施
- 会直接以root登录
- 直接
passwd
设置一个密码 - 然后建立新的用户
useradd -s ‘bin/bash’ -m -G adm,sudo %username
- -m 自动为用户建立登录目录
- -G 指定用户所属的组为adm和sudo
- -s 指定用户使用的terminal
- 为新用户设置密码
passwd %username
- 给用户sudo
- 修改
/etc/sudoers
添加一行$NAME ALL=(ALL) ALL
- 修改
- 给用户sudo的时候发现了没有
/etc/sudoer
文件,查询之后需要安装sudo package- 先通过docker cp将外部的内容复制到/etc/apt/sources.list
sudo apt-get install sudo
- 但是无法安装,应该是source.list文件出了问题
- 但是发现连文本编辑器都没有…只能从外部拷贝source.list进来
- 或者直接通过文件目录挂载给复制过来
- 拷贝完了之后要运行一下apt-get update
- 先通过docker cp将外部的内容复制到/etc/apt/sources.list
- 有可能在没有给一个用户设置passwd的情况下就已经su到某个用户了
Basics
docker inspect $SOMETHING
查看信息
docker image
- docker image - 包含了docker的程序以及依赖
- image是一个二进制文件,可以看作是容器的模板,同一个image可以生成多个运行的container instance
docker image ls/(rm [image name])
- 通过pull他人的image开始建立
docker image pull library/hello-world
- 运行docker image
docker container run
命令会自动抓取(pull)镜像,即使本地没有,也会自己pull下来
- 生成自己的docker image(从container)
- 在docker内执行操作d
- 在host上先
docker container ls
查看container情况- 记住这里的NAMES
docker commit -m "Some meaasge" $container_name $image_name:$version
- -a 提交作者
- -m 提交说明文字
- -c 用dockerflie来创建
- -p comimt过程中container暂停
- 然后
docker image ls
应该就能够看到新的container了 - 完成这个相当于对本机的container进行了register,于本机的docker相绑定了
- 如果要在本机启动这个docker,可以用
docker run $image_name:Version -it /bin/bash
- 进入之后本机
docker image ls
就会发现多了一个container正在运行(它的名字貌似是会被随机定义为两个单词的组合)
- 进入之后本机
- 导出与导入container
docker save NAME:VERSION > NAME.tar
将镜像打包到一个tar文件docker -o ./FILE.tar NAME:VERSION
- 到另外一个机器上用
docker load NAME:VERSION < NAME.tar
或者是docker load -i X.tar
- 此外还可以用import/export来额外保存commit信息
docker container
docker cantainer kill
来停止docker container ls (--all)
来列举所有文件- 注意这个步骤只会列举正在运行的conatiner(如果需要看已经停的,用
docker ps -a
)
- 注意这个步骤只会列举正在运行的conatiner(如果需要看已经停的,用
docker container start/stop
docker rename $OLD_NAME $NEW_NAME
- 进入正在运行的container
docker attach $CONTAINER_NAME
- 另外一种方式是
docker exec -it $CONTAINER_NAME bash
docker registry
他人封装好的dockerfile,类似于git-repo