注:原文章在我的csdn博客上。
平时使用docker的时候总是忘了一些命令,每次使用忘了都要重新查,比较麻烦。现在整理一下。
文中命令中大写字母为要替换的变量。
非root用户使用docker时总是要在命令前加sudo
,并且要输入密码,使用比较麻烦。可以创建一个docker
组,并把用户加入到这个组内,这样以后使用时就可以不加sudo
啦。
检查当前计算机中是否有名为docker
的组。
sudo cat /etc/group | grep docker
如果上一步没有docker
组的话就创建一个。
# 指定ID为999
sudo groupadd -g 999 docker
# 也可以不指定
sudo groupadd docker
添加相应的用户到docker
组内。
# xxx替换为要添加的用户名
sudo usermod -aG docker xxx
检查一下是否添加成功。
cat /etc/group
重新登陆当前用户或重启docker-daemon。
sudo systemctl restart docker
检查是否成功。
docker info
如果有错误,看错误提示是docker.sock
没有权限,给一下权限即可。
sudo chmod a+rw /var/run/docker.sock
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker build -t REPOSITORY:TAG -f ./DOCKERFILE_PATH .
说明:
Docker Images
docker imags
其中REPOSITORY:TAG
组成了IMAGE_NAME
,IMAGE_NAME
和第三列IMAGE_ID
都可以表示一个独一无二的镜像。
使用以下命令创建容器后,会返回一个容器的id,也是和容器一一对应的。
docker create
:创建容器,处于停止状态。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会随机的分配一个名字。IMAGE_NAME
或IMAGE_ID
指定特定的镜像。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
说明:
LOCAL_PATH
表示本地路径,CONTAINER_PATH
表示docker容器内的路径,==必须==使用绝对路径(以/
开头)。如果容器内不存在,则会自动创建。有的容器需要和外部网络通信,需要有一些可访问的端口,比如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
说明:
LOCAL_PORT:CONTAINER_PORT
的形式,表示本地的指定端口映射到容器的指定端口。DockerFile
中指定。之前使用Docker时从来没有注意过网络问题,直到有一次发现Docker内怎么也无法联网,后来是通过设置这个参数才成功的。 问题已经解决,详情见下一条。改成host模式是可以解决问题,但是外挂端口的时候还会有坑,还是bridge好用。
docker run -it --net="bridge" --name USER_MISSION IMAGE_NAME/IMAGE_ID /bin/bash
说明:
上一条说的bridge模式无法联网的问题找到了,是DNS没有配置,在启动时加上DNS信息或直接配置Docker默认的DNS即可。
docker run -it --dns=114.114.114.114 --name USER_MISSION IMAGE_NAME/IMAGE_ID /bin/bash
这个问题主要是最近在跑pytorch框架的时候,把dataloader
中的workers
设置成大于0的数就会出错。手动设置下共享内存的大小就可以解决。
docker run -it --shm-size=8G IMAGE_NAME/IMAGE_ID /bin/bash
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
说明:
latest
。docker rmi IMAGE_ID
# 如果容器还在运行状态记得关一下
# docker stop CONTAINER_ID
docker rm CONTAINER_ID
这些镜像可能是后面新的镜像REPOSITORY:TAG
有重复,前面的就会被改名为<none>:<none>。
docker rmi $(docker images | grep "none" | awk '{print $3}')
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')