DockerCommand - wxtt-github/blog GitHub Wiki

Dockerfile文件内容示例(D必须大写)

FROM node:14-alpine
COPY index.js /index.js
# 另一种可选的运行命令格式
# CMD [ "node", "/index.js" ]
CMD node /index.js

创建镜像

docker build -t <镜像名> .

查看所有镜像(选其中一个命令即可)

docker images
docker image ls

启动镜像

注意:从Docker Hub拉取的镜像名可能包括账号名

docker run <镜像名>

上传镜像

注:你可以在上传前先标记版本号为latest,这样上传时也不需要加版本号了,默认是latest

# 登录Docker Hub账号
docker login
# 标记镜像
docker tag <镜像名> <账号名>/<镜像名>:<版本号>
# 上传镜像
docker push <账号名>/<镜像名>:<版本号>

例如:

自定义版本号

docker tag hello_docker wxtt/hello_docker:v1.0

docker push wxtt/hello_docker:v1.0

默认版本号为latest

docker tag hello_docker wxtt/hello_docker:latest

docker push wxtt/hello_docker

拉取镜像

注意:有些镜像的拉取不需要版本号也行,不加版本号就是默认版本号为latest,前提是镜像源的版本号得有latest,否则会报错

docker pull <账号名>/<镜像名>:<版本号>

删除镜像

如果承载镜像的容器还在的话,是无法删除镜像的,需要先把容器删掉

不止可以根据ID删除,根据名字删除也可以

# 查看所有容器的状态
docker ps -a
# 删除容器,只需要输入容器ID前3位即可
docker rm <容器ID>
# 查看镜像信息
docker images
# 删除镜像,只需要输入镜像ID前3位即可
docker rmi <镜像ID>

Docker Compose构建

docker compose up -d

停止容器运行

# 停止容器运行,只需要输入容器ID前3位即可
docker stop <容器ID>
# 停止所有正在运行的容器,运行以下命令:
docker stop $(docker ps -aq)

容器自启动(开启/关闭)

# 开启自启动
docker update –-restart=always <容器ID>
# 关闭自启动
docker update --restart=no $(docker ps -q)

离线移植docker镜像

# 保存镜像
docker save <镜像名>:<版本号> -o <镜像名>.tar
例如
docker save java:8 -o java.tar  #将java:8的镜像导出成tar文件
# 加载镜像
docker load -i <镜像名>.tar

重启docker

sudo systemctl restart docker

例子,布置N卡Cuda Ubuntu 22.04

# 拉取Ubuntu 22.04 + CUDA的基础镜像
docker pull nvidia/cuda:12.2.0-base-ubuntu22.04
# 语法:docker save -o [保存文件名] [镜像名]:[标签]
docker save -o cuda-12.2.0-base-ubuntu22.04.tar nvidia/cuda:12.2.0-base-ubuntu22.04
# 语法:docker load -i [文件名]
docker load -i cuda-12.2.0-base-ubuntu22.04.tar
# 启动容器,进入命令行模式
docker run -it --gpus all \
  --name gpu-server-dev \  # 将容器命名为gpu-server-dev
  -v $(pwd):/app \  # 挂载当前目录到容器的/app,注意是pwd下的文件
  -p 33355:33355 \  # 暴露端口,左边是主机端口,右边是容器端口
  nvidia/cuda:12.2.0-base-ubuntu22.04 bash  # 进入容器内部

# 更新软件源
apt-get update
# 安装必要工具
apt-get install -y wget git build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev libgl1 libglib2.0-0
# 如果是conda环境
conda install -c conda-forge libstdcxx-ng

# 安装Python 3.10
apt-get install -y python3.10 python3.10-dev python3.10-venv python3-pip
# 设置Python 3.10为默认
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
# 选择3.10
update-alternatives --config python3
# 验证Python版本
python3 --version  # 应显示Python 3.10.x

# 升级pip
pip install --upgrade pip
pip install -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

# 验证GPU是否可用
nvidia-smi
# 在Python中验证CUDA是否可用
python3 -c "import torch; print(torch.cuda.is_available())"

# 停止并删除容器
docker stop gpu-server-dev
docker rm gpu-server-dev

# 复制文件基本语法
docker cp <主机文件路径> <容器名或ID>:<容器内目标路径>
# 实际示例(将主机的data.txt复制到容器的/app目录)
docker cp /path/on/host/data.txt my-container:/app/data.txt
# 复制整个目录
docker cp /path/on/host/folder/ my-container:/app/folder/

# 提交容器为新镜像(格式:docker commit [容器ID] [新镜像名]:[标签])
docker commit my-container my-custom-image:v1.0

# 进入运行中的容器的命令行
docker exec -it <容器名称或容器ID> /bin/bash
Ctrl+P,Ctrl+Q,不停止容器

# -d为后台运行
docker run -d --gpus all --name <容器名> -p 33355:33355 <镜像名:版本> bash -c "cd /APP && python3 app.py"
⚠️ **GitHub.com Fallback** ⚠️