Docker的使用.

环境隔离.

Posted by tianchen on November 27, 2020

隔了许久之后A-suozhang也开始用起了Docker

Installation

  • 公司的服务器上安装好了已经,之后再补充如何安装
  • WSL下的安装还有一些问题

  • 一个很全面的教程
  • ubuntu下的安装流程,参考官方tutorial
  • 还有一个可以参考的post

Nvidia docker的配置

  1. 对于LXC的eva服务器,需要在主机上进行一些操作,不然在container中启动docker服务会报错
    • modprobe overlay
    • 还有一个这个问题
  2. 主要参考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

换国内镜像

  1. 首先执行以下命令,查看是否在 docker.service 文件中配置过镜像地址,如果有删除
    • $ systemctl cat docker | grep '\-\-registry\-mirror'
    • 如果命令有输出: systemctl cat docker 查看 ExecStart= 出现的位置, 修改对应的文件内容去掉 –registry-mirror 参数及其值
    • 如果没有,pass
  2. 新建或者添加以下内容到 /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
  • 有可能在没有给一个用户设置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)
  • docker container start/stop
  • docker rename $OLD_NAME $NEW_NAME
  • 进入正在运行的containerdocker attach $CONTAINER_NAME
  • 另外一种方式是 docker exec -it $CONTAINER_NAME bash

docker registry

他人封装好的dockerfile,类似于git-repo