Docker 基础使用
Published:
Docker 简易教程。
Docker 安装
- 安装 Docker 参考官方教程
- 要使用 gpu 需要安装 nvidia-container-runtime
非 root 用户使用
1、添加 docker 用户组
sudo groupadd docker
2、将当前用户加入到 docker 用户组
sudo usermod -aG docker [USERNAME]
3、重启 docker 服务
sudo systemctl restart docker
4、退出当前用户重登一下
Repository
Repository 命令(DockerHub)
# 登录 DockerHub
docker login
# 上传本地镜像到 DockerHub
docker push [REPOSITORY[:TAG]]
# 查看镜像是否存在于 https://hub.docker.com/
docker search [NAME]
# 下载 DockerHub 中的镜像到本地
docker pull [NAME[:TAG]]
Image
Image 命令
# 查看镜像是否存在于 https://hub.docker.com/
docker search [NAME]
# 利用 pull 命令获取镜像
docker pull [NAME]
# 利用 Dockerfile 创建镜像
# -t 指定新镜像的 name、tag 等;. 表示在当前目录寻找 Dockerfile
docker build -t="[REPOSITORY[:TAG]]" .
# 利用容器创建镜像
# -m 指定说明信息;-a 指定用户信息;
docker commit -m "[INFO]" -a "[AUTHOR]" [CONTAINER ID] [REPOSITORY[:TAG]]
# 查看当前系统中的 images 信息
docker images
# 删除 images
# 若使用 IMAGE ID 删除时报错 image has dependent child images,说明此时该镜像可能存在多个标签;
# 请使用 REPOSITORY[:TAG] 来删除某标签,当所有标签被删光时便会触发删除镜像行为。
docker rmi [REPOSITORY[:TAG] / IMAGE ID]
# 保存镜像
docker save -o [REPOSITORY].tar [REPOSITORY[:TAG]]
# 加载镜像
docker load -i [REPOSITORY].tar
Container
Container 命令
# 查看 docker 中的 containers 信息
docker ps -a
# 利用镜像启动一个容器
# -i 表示打开并保持 stdout;-t 表示分配一个终端;-d 表示后台运行;--name 指定别名
# -p 端口映射
# -p IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort
# -v 目录挂载,具体如下
# --mount 卷挂载,具体如下
# --gpus all 允许容器所有 gpu
docker run -itd --name=[ALIAS] [REPOSITORY[:TAG]]
# 查看 stdout 的 log
docker logs [NAMES / CONTAINER ID]
# 查看容器配置信息
docker inspect [NAMES / CONTAINER ID]
# 启动容器
docker start [NAMES / CONTAINER ID]
# 停止容器
docker stop [NAMES / CONTAINER ID]
# 停止所有容器
docker stop $(docker ps -a -q)
# 重启容器
docker restart [NAMES / CONTAINER ID]
# 进入容器
docker attach [NAMES / CONTAINER ID]
# 删除容器
docker rm [NAMES / CONTAINER ID]
# 删除所有容器
docker rm $(docker ps -a -q)
# 退出容器并停止(容器终端下)
exit
# 退出容器并后台运行(容器终端下)
快捷键:CTRL + p q (按住 ctrl 不放,分别按 p 和 q)
# 利用容器创建镜像
# -m 指定说明信息;-a 指定用户信息;
docker commit -m "[INFO]" -a "[AUTHOR]" [CONTAINER ID] [REPOSITORY[:TAG]]
exec 命令
当我们使用 docker attach
进入容器时有一个问题,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。所以我们在这里推荐使用 exec
命令进入容器。
# -i 表示打开并保持 stdout;-t 表示分配一个终端;-d 表示后台运行;
docker exec -it [CONTAINER] [COMMAND]
# e.g.
# 打开 bash
docker exec -it your_container /bin/bash
# 执行某个脚本
docker exec -it your_container /bin/sh /root/test.sh
cp 命令
# 容器向宿主机传输文件
docker cp CONTAINER:SRC_PATH/FILE DEST_PATH
# 容器向宿主机传输目录
docker cp CONTAINER:SRC_PATH/DIR DEST_PATH
# 宿主机向容器传输文件
docker cp SRC_PATH/FILE CONTAINER:DEST_PATH
# 宿主机向容器传输目录
docker cp SRC_PATH/DIR CONTAINER:DEST_PATH
--mount
与 -v
命令
- 官方建议统一使用
--mount
给容器挂载卷存储 个人觉得简单情况的目录挂载下
-v
命令即可,卷挂载用--mount
--mount
可以支持创建集群服务的数据卷,而-v
不行- 如果需要指定 volume driver 选项,那么必须使用
--mount
-v
命令
# 挂载目录(共享主机目录,需要绝对路径)
-v HOSTDIR:CONTAINERDIR
# 挂载卷
-v VOLUME:CONTAINERDIR
--mount
命令
--mount
: 包含多个 key-value 对,使用逗号分割。
type
:可以为bind
,volume
,tmpfs
,默认为volume
source
:也可以写成src
,volumes 名或宿主机目录名destination
:可以写成dst
,容器目录名readonly
:可选,如果使用,表示只读
# 挂载目录
--mount type=bind,source=HOSTDIR,destination=CONTAINERDIR
# 挂载卷
--mount type=volume,source=VOLUME,destination=CONTAINERDIR
# 挂载只读卷
--mount type=volume,source=VOLUME,destination=CONTAINERDIR,readonly
日志文件
日志文件位置
/var/lib/docker/containers/容器ID/容器ID-json.log
volume
volume 命令
# 创建实名数据卷
docker volume create [NAME]
# 查看数据卷列表
docker volume ls
# 查看具体的数据卷
docker volume inspect [NAME]
# 删除数据卷
docker volume rm [NAME]
参考资料及致谢
docker volumes 中 -v 和 -mount 区别
Docker 管理应用数据 - 使用绑定挂载(bind mount)
docker19.03+NVIDIA显卡+docker: Error response from daemon: could not select device driver “” with c