<
Docker命令记录
>
上一篇

pytorch的interpolate函数
下一篇

Welcome to Jekyll!

注:原文章在我的csdn博客上。

Docker命令记录

平时使用docker的时候总是忘了一些命令,每次使用忘了都要重新查,比较麻烦。现在整理一下。

文中命令中大写字母为要替换的变量。


添加用户到docker组

非root用户使用docker时总是要在命令前加sudo,并且要输入密码,使用比较麻烦。可以创建一个docker组,并把用户加入到这个组内,这样以后使用时就可以不加sudo啦。

步骤

  1. 检查当前计算机中是否有名为docker的组。

     sudo cat /etc/group | grep docker
    
  2. 如果上一步没有docker组的话就创建一个。

     # 指定ID为999
     sudo groupadd -g 999 docker
     # 也可以不指定
     sudo groupadd docker
    
  3. 添加相应的用户到docker组内。

     # xxx替换为要添加的用户名
     sudo usermod -aG docker xxx
    
  4. 检查一下是否添加成功。

     cat /etc/group
    
  5. 重新登陆当前用户或重启docker-daemon。

     sudo systemctl restart docker
    
  6. 检查是否成功。

     docker info
    
  7. 如果有错误,看错误提示是docker.sock没有权限,给一下权限即可。

     sudo chmod a+rw /var/run/docker.sock
    

拉取镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

通过DockerFile创建镜像

docker build -t REPOSITORY:TAG -f ./DOCKERFILE_PATH .

说明:


查看计算机中有的Docker Images

docker imags

其中REPOSITORY:TAG组成了IMAGE_NAMEIMAGE_NAME和第三列IMAGE_ID都可以表示一个独一无二的镜像。


创建容器

使用以下命令创建容器后,会返回一个容器的id,也是和容器一一对应的。

两个命令

  1. docker create:创建容器,处于停止状态。
  2. docker run:创建并启动容器。

后台型容器

docker run --name=USER_MISSION -d IMAGE_ID/IMAGE_NAME /bin/bash -c "while true; do echo hello world; sleep 1; done"

说明:

前台型容器

创建一个正常的容器
docker run -it --name=USER_MISSION IMAGE_NAME/IMAGE_ID /bin/bash
挂载本地目录

本来当容器关闭时,容器启动时改动的文件就都没有了,如果内部有什么数据也只能专门提前移动出来。做路径映射就相当于在docker的内部和外部都对路径中的数据做管理,即使docker非正常关闭,数据也不会丢失。还是推荐做这个操作的,毕竟容器的目的就是做操作,而不是数据管理。

docker run -it -v LOCAL_PATH:CONTAINER_PATH --name USER_MISSION IMAGE_NAME/IMAGE_ID /bin/bash

说明:

添加端口映射

有的容器需要和外部网络通信,需要有一些可访问的端口,比如vscode的Remote-ssh、jupyter-lab,这时就需要添加端口映射了。

docker run -it -p 22 -p 8888 -p 8080 -v LOCAL_PATH:CONTAINER_PATH --name USER_MISSION IMAGE_NAME/IMAGE_ID /bin/bash

说明:

设置网络连接类型

之前使用Docker时从来没有注意过网络问题,直到有一次发现Docker内怎么也无法联网,后来是通过设置这个参数才成功的。 问题已经解决,详情见下一条。改成host模式是可以解决问题,但是外挂端口的时候还会有坑,还是bridge好用。

docker run -it --net="bridge" --name USER_MISSION IMAGE_NAME/IMAGE_ID /bin/bash

说明:

配置DNS

上一条说的bridge模式无法联网的问题找到了,是DNS没有配置,在启动时加上DNS信息或直接配置Docker默认的DNS即可。

docker run -it --dns=114.114.114.114 --name USER_MISSION IMAGE_NAME/IMAGE_ID /bin/bash
设置共享内存(shared memory)大小

这个问题主要是最近在跑pytorch框架的时候,把dataloader中的workers设置成大于0的数就会出错。手动设置下共享内存的大小就可以解决。

docker run -it --shm-size=8G IMAGE_NAME/IMAGE_ID /bin/bash
添加gdb调试权限
docker run -it --cap-add=SYS_PTRACE --name USER_MISSION IMAGE_NAME/IMAGE_ID /bin/bash

查看容器

查看正在运行的容器

docker ps

查看所有容器,包括关闭的

docker ps -a

查看容器的超详细信息

会输出一个json形式的文本,里面包括非常详细的配置信息。

docker inspect IMAGE_ID/CONTAINER_ID

退出容器

这里指的是在容器内使用终端命令的时候做的操作。

退出关关闭容器

使用快捷键Ctrl+D即可。

暂退容器

如果想暂时退出容器,但又不希望容器停止,使用快捷键Ctrl+p+q


停止正在运行的容器

docker stop CONTAINER_ID

终端打开已启动的容器

docker attach CONTAINER_ID

启动已停止的容器

docker start CONTAINER_ID

保存容器

docker commit -a "wyg1997" -m "hello world" CONTAINER_ID REPOSITORY:TAG

说明:


删除操作

删除镜像

docker rmi IMAGE_ID

删除容器

# 如果容器还在运行状态记得关一下
# docker stop CONTAINER_ID
docker rm CONTAINER_ID

批量删除名为none的镜像

这些镜像可能是后面新的镜像REPOSITORY:TAG有重复,前面的就会被改名为<none>:<none>。

docker rmi $(docker images | grep "none" | awk '{print $3}')

批量删除已经停止的容器

docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')
Top
Foot