基本命令
以在 Docker 中安装 redis 为例
# 镜像
# 搜索
方法一:
在 https://hub.docker.com (opens new window) 搜索
方法二:
docker search redis
# 下载(拉取)
将 docker 镜像服务器中的镜像下载到本地
docker pull 镜像名[:版本号(标签)]
# docker pull redis:latest # 拉取一个最新版的redis
# 本地(已下载)列表
docker images
# 删除
# 镜像需要容器stop才可以删除
docker rmi 镜像id
# 删除所有未被使用的镜像
docker image prune -a
# 删除所有未被使用的镜像,且为24小时前创建的
docker image prune -a --filter "until=24h" -f
# 导出
docker save -o <导出文件> <导出镜像>
# docker save -o nginx.tar nginx:latest
# 导入
docker load -i <导入文件>
# docker load -i nginx.tar
# 提交本地(打包)
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <[email protected]>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
参数类似于 Git 的 commit,作用是将修改(定制)的容器打包成一个镜像
docker commit -a "<作者信息>" -m "<提交信息>" <容器标识> <镜像名[:版本号]>
# docker commit -a "NipGeihou" -m "update index.html" my-nginx my-nginx:0.1
# 推送远程
登录
docker login # 登录
docker tag <镜像名[:版本号]> <镜像名[:版本号]>
# docker tag my-nginx:0.1 nipgeihou/my-nginx:0.1
# docker images # 检查打标签情况
docker push <镜像名[:版本号]>
# docker push nipgeihou/my-nginx:0.1
docker logout # 退出登录
tag:打标签,可以理解为复制一份,因为远程库有要求,通过前缀区分。
# 构建 Dockerfile
在 Dockerfile 文件所在目录
docker build -t <镜像名[:版本号]> .
# 容器
下文出现的
容器标识
即:容器 ID 或容器名
# 创建
docker run -itd --name <自定义容器名> -p <可访问IP>:<外部端口号>:<内部端口号> <镜像名>
docker run -itd --name redis-test -p 127.0.0.1:6379:6379 redis
# docker run -itd --name redis-test -p 6379:6379 redis # 注意!会把redis暴露到外网
参数 | 说明 | 示例 |
---|---|---|
--restart | no :容器退出时,不重启容器;on-failure :只有在非 0 状态退出时才从新启动容器;always :无论退出状态是如何,都重启容器; | --restart=always:开机启动 |
--name | 容器名字 | --name my-redis |
-p | 端口映射,冒号左边是宿主机端口,右边是容器端口 | -p 80:80 |
-d | 后台运行容器 | |
-v | 挂载数据卷 -v <数据卷名称|宿主机路径>:<容器内路径>[:ro] ,如果数据卷不存在会自动创建 | |
-e | 环境变量 |
-v:默认挂载路径权限为读写,如果指定为只读可以加 :ro
# 列表
docker ps # 目前运行的镜像
docker ps -a # 所有镜像
# 停止
docker stop <容器标识> # 暂停指定容器id的容器
docker stop $(docker ps -a -q) # 暂停所有镜像
参数 | 说明 | 示例 |
---|---|---|
-t | 关闭容器的限时,如果超时未能关闭则用 kill 强制关闭,默认值 10s | docker stop -t=60 容器标识 |
# 强制关闭
docker kill <容器标识>
# 启动
docker start <容器标识>
# 重启
docker restart <容器标识>
# 删除
docker rm <容器标识>
docker rm -f <容器标识> #强制删除,无需停止运行
# docker rm -f $(docker ps -a | grep "k8s_" | awk '{print $1}') # 批量删除k8s_开头的容器
# 进入
docker exec -it <容器标识> /bin/bash
# docker attach 容器标识 # 不推荐使用,退出容器终端,会导致容器的停止
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- bash:进入容器后执行的命令,bash 是一个 linux 终端交互命令
容器里没有vi/vim命令怎么办?
修改的目的需要是定制化容器,即容器本身不能满足需求,又没有提供很好的扩展点。否则应优先考虑使用挂载数据卷覆盖原文件的方式。
如果只是想替换字符串,可以使用 cat
+ sed
命令。
sed -i 's#Welcome to nginx#你好世界#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
# 追加 - 开启启动
docker update --restart=always 容器标识
# 修改配置
vim /var/lib/docker/containers/container-ID/config.v2.json
不建议修改配置文件,而是新建容器
# 查看日志
docker logs <容器标识>
docker logs -f <容器标识> # 持续查看日志(自动刷新)
# 复制文件
可从容器中复制文件 (夹) 到宿主机,反之也可以。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# docker cp /www/runoob 96f7f14e99ab:/www/
# 数据卷
docker volume <command>
# 创建
docker volume create <名称>
# docker volume create html
# 列表
docker volume ls
# 详情
docker volume inspect <名称>
WSL 路径为
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
# 删除
docker volume rm <名称>
# 删除未使用
docker volume prune
# 网络
网络模式 | 描述 |
---|---|
bridge | 桥接模式。为每个容器分配设置 IP 地址,并将容器的网络连接到 docker0 网桥上,docker 的默认模式 。 |
host | 主机网络模式。不虚拟容器的网卡,也不配置 IP 地址信息,直接使用宿主机的网络栈 IP 和端口。 |
none | node 模式。容器有自己独立的网络命名空间,但是不对其进行设置,一般是由第三方 CNI 接入管理,如 flannel。 |
container | Container 模式。新容器自己不创建和设置网络,而是共享使用的指定的其他容器的 IP 端口等网络。 |
# 其他
# 复制容器文件到宿主机
docker cp mycontainer:/opt/testnew/file.txt /opt/test/
# 查看容器的 RUN 命令参数
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod <名称>
上次更新: 2024/09/24, 16:49:56