常用指令
1. 镜像指令
docker pull <Image_Name>[:tag] # 下载镜像,可以从 dockerHub 下载
docker images # 查看所有镜像
2. 容器指令
exit # 退出,容器不停止
Ctrl + P + Q / Ctrl + Z # 容器不停止退出
docker ps # 列出所有运行中的容器
docker ps -a # 查看所有容器,包括未运行的
# 启动和停止容器
docker start <容器id> # 启动容器
docker restart <容器id>
docker stop <容器id>
docker kill <容器id>
# 启动容器后可进入容器
docker exec -it <容器id> bash
# 上传本地文件到容器
docker cp <本地文件路径> <ID全称:容器路径>
# 查看docker各文件存储空间占用
docker system df # 可以查看image, container, volumes总占用
docker system df -v # 可以查看具体是哪个image, container, volumes占用
# 新建容器并启动
docker run [可选参数] image [COMMAND] [ARG...] # [COMMAND] [ARG...] 是image指定的输入参数
# 新建容器参数说明
--name="Name" # 容器的名字。一个镜像可以创建多个容器,以此区分不同容器
-d # 后台方式运行
-it # 使用交互方式运行,进入容器查看内容
-p # 指定容器端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P # 随机指定端口
--gpus all # 将本地显卡驱动映射到容器,否则nvidia-smi不可用
--log-opt max-size=10m # 容器单个日志的最大空间占用,不然容器空间和内存占用会越来越大
--log-opt max-file=3 # 容器最大日志数量,不然容器空间和内存占用会越来越大
# 新建容器 demo
docker run --name="centos_env" -it -p 8080:8080 --gpus all --log-opt max-size=10m --log-opt max-file=3 centos[:tag] bash # :tag 默认是:latest
空间占用
1. 容器占用空间太大
Docker目录/var/lib/docker/containers文件太大
Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加
启动容器时,我们可以通过参数来控制日志的文件个数和单个文件的大小:
# max-size 最大数值
# max-file 最大日志数
docker run -it --log-opt max-size=10m --log-opt max-file=3 redis
2. ext4.vhdx 太大
Cleaning Up Docker Disk Space In WSL2
构建镜像
1. 直接将容器打包镜像
2. 编写 dockerfile 来构建镜像
我编写的一些 Dockerfile 模板文件放在 备份盘>模板>Dockerfile
,WORKDIR 操作参考centos_gcc5_dockerfile,Dockerfile 下使用 conda 指令操作参考 centos_gcc5_conda_dockerfile
docker build -t <镜像名字>:<tag> . # 最后有个点,默认使用 当前目录下名为 Dockerfile 的文件作为Dockerfile,-t 用于指定镜像名称和 tag
WORKDIR
编写dockerfile容易犯的一个错误是将其等同于 Shell 脚本来书写,然而,在 Shell 中,连续两行是同一个进程执行环境,因此前一个命令修改的内存状态,会直接影响后一个命令;而在 Dockerfile 中,这两行 RUN 命令的执行环境根本不同,是两个完全不同的容器。具体参考WORKDIR 指定工作目录
Dockerfile 下使用 conda 指令
如果要在 dockerfile 中使用 conda 指令,需要设置 conda 执行程序的环境变量,即添加 ENV PATH /root/anaconda3/bin:$PATH
,其中 /root/anaconda3/bin
是 conda 指令程序的路径
Activate conda environment in docker
在 dockerfile 中切换 env 不能使用 conda activate ,使用 source activate
3. 上传镜像到 DockerHub
docker tag <image>:<tag> YOUR-USERNAME/<image>:<tag> # 首先修改image名称,必须有YOUR-USERNAME/;如果不加<tag>,默认为latest
docker push <username>/<image>:<tag>