Docker
docker # 查看 docker 用法,包括命令列表
docker image # 查看 docker image 用法,包括命令列表
docker <COMMAND> --help # 查看 docker 命令帮助
# docker 的命令基本结构是:
# docker [OPTIONS] COMMAND COMMAND [OPTIONS]
# 例如:
# docker image --help
# docker image ls --help
# docker image ls -a
docker version # 查看 docker 版本
docker info # 查看 docker 信息
加速
# 编译镜像源
vim /etc/docker/daemon.json
# 使生效
sudo systemctl daemon-reload
sudo systemctl restart docker
镜像源
{
"registry-mirrors": [
"https://7x52jhpv.mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.ccs.tencentyun.com",
"https://registry.hub.docker.com"
]
}
https://dockerproxy.com/docs
Docker Hub 源使用帮助 — USTC Mirror Help 文档
轻量应用服务器 安装 Docker 并配置镜像加速源-最佳实践-文档中心-腾讯云
镜像
获取镜像
# docker pull [选项] [仓库地址[:端口号]/]仓库名[:标签]
docker pull ubuntu:18.04
docker image pull redis:latest
docker image pull quay.io/bitnami/nginx # https://quay.io/ 也是一个镜像仓库
# 查看本地镜像详情(镜像需要先下载到本地)
docker image inspect 镜像
查看本地镜像列表
docker images
docker image ls
- -a 查看所有
删除本地镜像
# docker image rm [选项] <镜像1> [<镜像2> ...]
# 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要
# 短 ID 一般取前3个字符以上,只要足够区分于别的镜像就可以了
docker rmi
docker image rm 镜像
## 删除所有未使用的镜像
docker image prune
# 删除所有未使用的数据,包括容器、镜像、网络等
docker system prune -f
- -f 强制删除
如果一个镜像正被某些容器使用,则无法删除
从容器创建镜像
docker container commit [选项] <容器> [镜像[:TAG]]
docker container commit 123 pish163/my-nginx:1.0.0
导出镜像
# 导出镜像到一个文件中,文件可用于传输
docker image save <镜像> <镜像> <镜像> -o <文件>
docker image save nginx:1.20.0 -o nginx.image
导入镜像
# 从文件中获取镜像,这种方式的优点是不需要联网
docker image load -i <文件>
docker image load -i ./nginx.image
构建镜像(dockerfile)
docker image build -t <镜像名称> <Dockerfile目录>
docker image build -t hello .
构建好镜像后,可以通过 docker image ls
查看
其它命令
# 查看镜像的各个分层
docker image history 镜像
容器
从镜像启动
# 使用 run 来启动镜像时,若镜像不存在,则 Docker 将自动下载
# 比如说,可以直接运行 "docker container run nginx" 就可以自动下载并运行 nginx
# docker run 将创建一个新容器
# 也可以先执行 docker create xxx 创建容器
docker run -it ubuntu:18.04 bash
docker container run -it ubuntu:18.04 /bin/bash
docker container run ubuntu:18.04 /bin/echo 'Hello world' # 输出一个 “Hello World”,之后终止容器
docker container run --name centos -it centos bash
docker container run -itd --name redis-test -p 6379:6379 redis
docker container run --name some-redis -d -p 6379:6379 redis
docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
- -i 交互式操作,让容器的标准输入保持打开
- -t 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
- -d 后台运行容器(守护态运行)
- -p 指定端口映射,格式为:主机(宿主)端口:容器端口
- –name=“nginx-lb”: 为容器指定一个名称,若不指定则使用随机名字
- –rm 不保存容器,也就是说容器运行结束后会自动自行删除,如果一个容器运行时只是执行一个命令后自行退出,那么很适合加上
--rm
参数,如果一个容器的运行总是通过镜像运行,也就没必要保存容器了,可以在运行结束后自动删除 - -v 为容器的某一个指定 volume 指定一个名称或路径,例如:
-v name:/app
就是将 volume “/app” 指定名称为 “name”,-v ${pwd}:/app
就是为 volume “/app” 指定存储路径为当前目录 - –netowrk 指定要使用的网络
- 放在镜像名后的是 命令,如果希望有个交互式 Shell,可以用
bash
容器运行后,在 windows 下,按 ctrl+c 虽然会即出 shell,但容器仍在运行中,linux 和 mac 则会退出容器。
命令中,镜像名之后可以指定容器启动后要运行的命令,若不指定,则会运行镜像所配置的默认命令。
挂载主机目录/文件
# 读写
docker run -it --name centos7 --mount type=bind,source=E:\share,target=/share centos:centos7
# 只读
docker run -it --name centos7 --mount type=bind,source=E:\share,target=/share,readonly centos:centos7
- 挂载目录或文件使用相同命令,可使用目录路径或文件路径
从容器启动
docker start -i 容器
docker restart
docker container start -i 容器
docker container restart 容器
- -i 交互式操作,让容器的标准输入保持打开
Attach(前台) 与 Detach(后台)
windows 下,attach 模式是不完整的,容器的输出会输出到本地 shell,但是在本地 shell 进行 ctrl+c 的话,只会即出本地 shell,容器仍然在运行。
所以在 windows 下,要停止容器,需要使用 docker stop
命令。
linux 和 max 则是完整的 attach 模式,只要容器是在前台运行,ctrl+c 就会结束容器
# 添加 --detach 或 -d 参数即可以 detach 模式运行,即后台运行
# 以后台模式运行时,容器的输出并不会输出到本地 shell
# 这种模块下本地 shell 不会被容器占用
docker run --detach -p 80:80 nginx
# 将容器转换为前台
# 这时本地 shell 被容器占用,输入 ctrl+c 可以停止容器(仅linux和mac)
docker attach 容器
# 如果容器在后台运行,可以执行以下命令来临时查看其输出日志
# -f 参数可以保持日志输出,直到 ctrl+c 退出
docker container logs 容器
docker container logs -f 容器
进入容器
# 将本地标准输入、输出和错误流附加到运行的容器
# 如果容器没有以交互操作方式启动(比如启动时使用 -d 参数),可使用此命令进入容器
# 进入后,在容器中执行 exit 容器将退出,输出是容器的输出,输入则输入给容器
# 注意,-d 相当于 --detach,与这里的 attach 是相反的模式
docker attach 容器
# 当容器是在后台运行时,可以使用如下命令在运行中的容器中执行命令
# 因为使用了 -it 选项并执行 sh,所以会保存 sh 的打开状态,相当于从后台模式回到了前台模式
# 注意,进入后,在容器中执行 exit 时只是退出了 `/bin/sh`,容器将仍然保持运行
docker exec -it 容器 /bin/sh
退出容器
# 容器自身的虚拟终端,退出容器
exit
# 容器自身的虚拟终端,不退出容器,保留在后台运行
ctrl+q+p
docker stop 容器 容器 容器
docker kill 容器 容器 容器
docker container stop 容器 容器 容器
# 停止所有容器
# "docker container ls -aq" 输出的是所有容器的 ID
docker container stop $(docker container ls -aq)
查看容器列表
# 查看已经在运行的容器
docker ps -a
docker container ls -a
# 列出所有容器的 ID
# 借助该命令,可以进行批量容器操作
# 例如 `docker container stop $(docker container ls -aq)`
# 例如 `docker container rm $(docker ps -aq)`
docker container ls -aq
- -a 列出所有容器(包括未运行的容器)
在容器列表中,会包含容器的 ID 和容器的名称,ID 或名称都可以指代容器,而且在使用 ID 时,可以只输入 ID 的前 n 个字母
删除容器
# 如果容器正在运行,则需要带上 -f 参数
docker rm 容器 容器 容器 容器
docker container rm 容器 容器 容器 容器
# 删除所有停止运行的容器
docker container prune
# 删除所有容器
# "docker container ls -aq" 输出的是所有容器的 ID
docker container rm $(docker container ls -aq)
# 删除所有未使用的数据,包括容器、镜像、网络等
docker system prune -f
容器重命名
docker rename 容器 新的容器名
常用模式
docker container run -it busybox sh # 前台方式启动容器
exit # 退出容器
docker container run -d nginx # 后台运行
docker container exec -it 容器 sh # 取得交互
其他命令
# 查看容器详情,例如启动命令、镜像、连接的网络
docker container inspect 容器
数据卷(volume)
Data Volume
方式一:在 dockerfile 中可以通过 VOLUME ["路径"]
来指定数据卷,例如 VOLUME [ "/data" ]
。这时,容器中向 /data
读写数据时将会同步到宿主机中(即使启动时没有指定 -v
选项)。宿主机中有专门的目录来存储其数据。如果启动容器时没有指定 -v
选项,则会自动创建一个名称随机的卷。注意,没有指定 -v
参数时,每次启动都会创建新的卷。
方式二:启动容器时,可以使用 -v
参数为容器中的某个路径指定数据卷,不管这个路径有没有使用 VOLUME
进行声明。-v
可以为数据卷指定一名字,格式为 -v name:/path
。
当然,VOLUME
和 -v
结合使用也没问题,例如 -v local-data:/data
,这时,容器中 /data
的数据就会存储到宿主机中的 local-data
数据卷中。
volume 命令
# 查看所有数据卷
docker volume ls
# 查看数据卷详情
# 详情中包括数据卷中宿主机中的挂载路径,如 `/var/lib/docker/volumes/xxxxx/_data`
docker volume inspect 名称
mysql 示例
在 mysql 中,就有一个数据卷 VOLUME [/var/lib/mysql]
,可以使用如下方式进行启动:docker run -d -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2
执行 docker volume inspect mysql-data
,得到如下信息:
[
{
"CreatedAt": "2023-10-31T17:50:37+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
"Name": "mysql-data",
"Options": null,
"Scope": "local"
}
]
Bind Mount(直接挂载)
使用 -v
时,除也可以指定的一名称之外,还可以直接指定一个路径,例如:
docker run -d -v /root/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2
以上命令中,使用了 -v 宿主路径:容器内路径
的方式挂载数据,这时会自动将宿主机中的路径挂载到容器的指定路径上,这时,使用 docker volume ls
将无法查看到这个数据卷。但可以通过 docker container inspect 容器
命令来查看窗口详情,其中会有 “Mounts” 信息。
网络
docker 的网络(仅手动创建的网络)可以用容器名称进行 ping 操作
查看
# 查看当前的所有网络
docker network ls
# 查看某个网络的详情
# 可查看到网络的网段、网关地址、已接入的所有节点等
docker network inspect xxx
创建
# 创建一个网络
# -d 参数用于指定驱动,还可以配置子网、网关等参数
docker network create -d bridge xxxx
创建网络后,在启动容器时,可以使用 --network xxxx
参数来指定要连接的网络
手动创建的网络具有类似 dns 的功能,在连接的容器之间可以用容器名 ping 通过。注意,docker 自动创建的默认网络则没有这种功能。
连接
# 容器已经创建后,可以通过以下命令来为容器连接新的网络
docker network connect [网络名] [容器名]
# 断开连接
docker network disconnect [网络名] [容器名]
备忘
安装 ifconfig
yum provides ifconfig
yum whatprovides ifconfig
# 结果如下
net-tools-2.0-0.25.20131004git.el7.x86_64 : Basic networking tools
Repo : base
Matched from:
Filename : /sbin/ifconfig
# 表明 ifconfig 工具在 net-tools 包中
yum install net-tools
redis
docker pull redis:latest # 获取镜像
docker run -itd --name redis -p 6379:6379 redis:latest # 启动容器(后台)
docker exec -it redis /bin/bash # 进入虚拟终端
redis-cli # 启动 redis 客户端
Docker
docker # 查看 docker 用法,包括命令列表
docker image # 查看 docker image 用法,包括命令列表
docker <COMMAND> --help # 查看 docker 命令帮助
# docker 的命令基本结构是:
# docker [OPTIONS] COMMAND COMMAND [OPTIONS]
# 例如:
# docker image --help
# docker image ls --help
# docker image ls -a
docker version # 查看 docker 版本
docker info # 查看 docker 信息
加速
# 编译镜像源
vim /etc/docker/daemon.json
# 使生效
sudo systemctl daemon-reload
sudo systemctl restart docker
镜像源
{
"registry-mirrors": [
"https://7x52jhpv.mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.ccs.tencentyun.com",
"https://registry.hub.docker.com"
]
}
https://dockerproxy.com/docs
Docker Hub 源使用帮助 — USTC Mirror Help 文档
轻量应用服务器 安装 Docker 并配置镜像加速源-最佳实践-文档中心-腾讯云
镜像
获取镜像
# docker pull [选项] [仓库地址[:端口号]/]仓库名[:标签]
docker pull ubuntu:18.04
docker image pull redis:latest
docker image pull quay.io/bitnami/nginx # https://quay.io/ 也是一个镜像仓库
# 查看本地镜像详情(镜像需要先下载到本地)
docker image inspect 镜像
查看本地镜像列表
docker images
docker image ls
- -a 查看所有
删除本地镜像
# docker image rm [选项] <镜像1> [<镜像2> ...]
# 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要
# 短 ID 一般取前3个字符以上,只要足够区分于别的镜像就可以了
docker rmi
docker image rm 镜像
## 删除所有未使用的镜像
docker image prune
# 删除所有未使用的数据,包括容器、镜像、网络等
docker system prune -f
- -f 强制删除
如果一个镜像正被某些容器使用,则无法删除
从容器创建镜像
docker container commit [选项] <容器> [镜像[:TAG]]
docker container commit 123 pish163/my-nginx:1.0.0
导出镜像
# 导出镜像到一个文件中,文件可用于传输
docker image save <镜像> <镜像> <镜像> -o <文件>
docker image save nginx:1.20.0 -o nginx.image
导入镜像
# 从文件中获取镜像,这种方式的优点是不需要联网
docker image load -i <文件>
docker image load -i ./nginx.image
构建镜像(dockerfile)
docker image build -t <镜像名称> <Dockerfile目录>
docker image build -t hello .
构建好镜像后,可以通过 docker image ls
查看
其它命令
# 查看镜像的各个分层
docker image history 镜像
容器
从镜像启动
# 使用 run 来启动镜像时,若镜像不存在,则 Docker 将自动下载
# 比如说,可以直接运行 "docker container run nginx" 就可以自动下载并运行 nginx
# docker run 将创建一个新容器
# 也可以先执行 docker create xxx 创建容器
docker run -it ubuntu:18.04 bash
docker container run -it ubuntu:18.04 /bin/bash
docker container run ubuntu:18.04 /bin/echo 'Hello world' # 输出一个 “Hello World”,之后终止容器
docker container run --name centos -it centos bash
docker container run -itd --name redis-test -p 6379:6379 redis
docker container run --name some-redis -d -p 6379:6379 redis
docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
- -i 交互式操作,让容器的标准输入保持打开
- -t 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
- -d 后台运行容器(守护态运行)
- -p 指定端口映射,格式为:主机(宿主)端口:容器端口
- –name=“nginx-lb”: 为容器指定一个名称,若不指定则使用随机名字
- –rm 不保存容器,也就是说容器运行结束后会自动自行删除,如果一个容器运行时只是执行一个命令后自行退出,那么很适合加上
--rm
参数,如果一个容器的运行总是通过镜像运行,也就没必要保存容器了,可以在运行结束后自动删除 - -v 为容器的某一个指定 volume 指定一个名称或路径,例如:
-v name:/app
就是将 volume “/app” 指定名称为 “name”,-v ${pwd}:/app
就是为 volume “/app” 指定存储路径为当前目录 - –netowrk 指定要使用的网络
- 放在镜像名后的是 命令,如果希望有个交互式 Shell,可以用
bash
容器运行后,在 windows 下,按 ctrl+c 虽然会即出 shell,但容器仍在运行中,linux 和 mac 则会退出容器。
命令中,镜像名之后可以指定容器启动后要运行的命令,若不指定,则会运行镜像所配置的默认命令。
挂载主机目录/文件
# 读写
docker run -it --name centos7 --mount type=bind,source=E:\share,target=/share centos:centos7
# 只读
docker run -it --name centos7 --mount type=bind,source=E:\share,target=/share,readonly centos:centos7
- 挂载目录或文件使用相同命令,可使用目录路径或文件路径
从容器启动
docker start -i 容器
docker restart
docker container start -i 容器
docker container restart 容器
- -i 交互式操作,让容器的标准输入保持打开
Attach(前台) 与 Detach(后台)
windows 下,attach 模式是不完整的,容器的输出会输出到本地 shell,但是在本地 shell 进行 ctrl+c 的话,只会即出本地 shell,容器仍然在运行。
所以在 windows 下,要停止容器,需要使用 docker stop
命令。
linux 和 max 则是完整的 attach 模式,只要容器是在前台运行,ctrl+c 就会结束容器
# 添加 --detach 或 -d 参数即可以 detach 模式运行,即后台运行
# 以后台模式运行时,容器的输出并不会输出到本地 shell
# 这种模块下本地 shell 不会被容器占用
docker run --detach -p 80:80 nginx
# 将容器转换为前台
# 这时本地 shell 被容器占用,输入 ctrl+c 可以停止容器(仅linux和mac)
docker attach 容器
# 如果容器在后台运行,可以执行以下命令来临时查看其输出日志
# -f 参数可以保持日志输出,直到 ctrl+c 退出
docker container logs 容器
docker container logs -f 容器
进入容器
# 将本地标准输入、输出和错误流附加到运行的容器
# 如果容器没有以交互操作方式启动(比如启动时使用 -d 参数),可使用此命令进入容器
# 进入后,在容器中执行 exit 容器将退出,输出是容器的输出,输入则输入给容器
# 注意,-d 相当于 --detach,与这里的 attach 是相反的模式
docker attach 容器
# 当容器是在后台运行时,可以使用如下命令在运行中的容器中执行命令
# 因为使用了 -it 选项并执行 sh,所以会保存 sh 的打开状态,相当于从后台模式回到了前台模式
# 注意,进入后,在容器中执行 exit 时只是退出了 `/bin/sh`,容器将仍然保持运行
docker exec -it 容器 /bin/sh
退出容器
# 容器自身的虚拟终端,退出容器
exit
# 容器自身的虚拟终端,不退出容器,保留在后台运行
ctrl+q+p
docker stop 容器 容器 容器
docker kill 容器 容器 容器
docker container stop 容器 容器 容器
# 停止所有容器
# "docker container ls -aq" 输出的是所有容器的 ID
docker container stop $(docker container ls -aq)
查看容器列表
# 查看已经在运行的容器
docker ps -a
docker container ls -a
# 列出所有容器的 ID
# 借助该命令,可以进行批量容器操作
# 例如 `docker container stop $(docker container ls -aq)`
# 例如 `docker container rm $(docker ps -aq)`
docker container ls -aq
- -a 列出所有容器(包括未运行的容器)
在容器列表中,会包含容器的 ID 和容器的名称,ID 或名称都可以指代容器,而且在使用 ID 时,可以只输入 ID 的前 n 个字母
删除容器
# 如果容器正在运行,则需要带上 -f 参数
docker rm 容器 容器 容器 容器
docker container rm 容器 容器 容器 容器
# 删除所有停止运行的容器
docker container prune
# 删除所有容器
# "docker container ls -aq" 输出的是所有容器的 ID
docker container rm $(docker container ls -aq)
# 删除所有未使用的数据,包括容器、镜像、网络等
docker system prune -f
容器重命名
docker rename 容器 新的容器名
常用模式
docker container run -it busybox sh # 前台方式启动容器
exit # 退出容器
docker container run -d nginx # 后台运行
docker container exec -it 容器 sh # 取得交互
其他命令
# 查看容器详情,例如启动命令、镜像、连接的网络
docker container inspect 容器
数据卷(volume)
Data Volume
方式一:在 dockerfile 中可以通过 VOLUME ["路径"]
来指定数据卷,例如 VOLUME [ "/data" ]
。这时,容器中向 /data
读写数据时将会同步到宿主机中(即使启动时没有指定 -v
选项)。宿主机中有专门的目录来存储其数据。如果启动容器时没有指定 -v
选项,则会自动创建一个名称随机的卷。注意,没有指定 -v
参数时,每次启动都会创建新的卷。
方式二:启动容器时,可以使用 -v
参数为容器中的某个路径指定数据卷,不管这个路径有没有使用 VOLUME
进行声明。-v
可以为数据卷指定一名字,格式为 -v name:/path
。
当然,VOLUME
和 -v
结合使用也没问题,例如 -v local-data:/data
,这时,容器中 /data
的数据就会存储到宿主机中的 local-data
数据卷中。
volume 命令
# 查看所有数据卷
docker volume ls
# 查看数据卷详情
# 详情中包括数据卷中宿主机中的挂载路径,如 `/var/lib/docker/volumes/xxxxx/_data`
docker volume inspect 名称
mysql 示例
在 mysql 中,就有一个数据卷 VOLUME [/var/lib/mysql]
,可以使用如下方式进行启动:docker run -d -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2
执行 docker volume inspect mysql-data
,得到如下信息:
[
{
"CreatedAt": "2023-10-31T17:50:37+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
"Name": "mysql-data",
"Options": null,
"Scope": "local"
}
]
Bind Mount(直接挂载)
使用 -v
时,除也可以指定的一名称之外,还可以直接指定一个路径,例如:
docker run -d -v /root/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2
以上命令中,使用了 -v 宿主路径:容器内路径
的方式挂载数据,这时会自动将宿主机中的路径挂载到容器的指定路径上,这时,使用 docker volume ls
将无法查看到这个数据卷。但可以通过 docker container inspect 容器
命令来查看窗口详情,其中会有 “Mounts” 信息。
网络
docker 的网络(仅手动创建的网络)可以用容器名称进行 ping 操作
查看
# 查看当前的所有网络
docker network ls
# 查看某个网络的详情
# 可查看到网络的网段、网关地址、已接入的所有节点等
docker network inspect xxx
创建
# 创建一个网络
# -d 参数用于指定驱动,还可以配置子网、网关等参数
docker network create -d bridge xxxx
创建网络后,在启动容器时,可以使用 --network xxxx
参数来指定要连接的网络
手动创建的网络具有类似 dns 的功能,在连接的容器之间可以用容器名 ping 通过。注意,docker 自动创建的默认网络则没有这种功能。
连接
# 容器已经创建后,可以通过以下命令来为容器连接新的网络
docker network connect [网络名] [容器名]
# 断开连接
docker network disconnect [网络名] [容器名]
备忘
安装 ifconfig
yum provides ifconfig
yum whatprovides ifconfig
# 结果如下
net-tools-2.0-0.25.20131004git.el7.x86_64 : Basic networking tools
Repo : base
Matched from:
Filename : /sbin/ifconfig
# 表明 ifconfig 工具在 net-tools 包中
yum install net-tools
redis
docker pull redis:latest # 获取镜像
docker run -itd --name redis -p 6379:6379 redis:latest # 启动容器(后台)
docker exec -it redis /bin/bash # 进入虚拟终端
redis-cli # 启动 redis 客户端