Docker 基础使用

3 minute read

Published:

Docker 简易教程。

Docker 安装

非 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:可以为 bindvolumetmpfs,默认为 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 —— 从入门到实践

Docker Documentation

只要一小时,零基础入门Docker

Docker与Dockerfile极简入门文档

Docker 容器使用

详解Docker 端口映射与容器互联

添加当前用户进docker用户组

docker 创建docker用户组,应用用户加入用户组

Docker exec 命令

Docker容器进入的4种方式

docker cp

docker学习——docker的volumes

关于Docker目录挂载的总结

docker volumes 中 -v 和 -mount 区别

Docker 管理应用数据 - 使用绑定挂载(bind mount)

docker从零开始 存储(二)volumes 挂载

docker19.03+NVIDIA显卡+docker: Error response from daemon: could not select device driver “” with c