文章目录
1. 查看帮助
1. 官方文档
https://docs.docker.com/reference/
2. 查看docker 版本信息
# 简单信息
docker -v
# 详细信息
docker version
3. 查看docker系统的详细信息
docker info
4. 帮助命令
# 查看所有命令
docker --help
# 查看某个命令的帮助信息
docker COMMAND --help
2. 镜像命令
1. 查看镜像
# 查看当前本地所有镜像,不包含中间层镜像
docker images
# 查看所有镜像,包含中间层镜像
docker images -a
# 查看所有镜像id
docker images -q
# -a 和 -q可以连用
docker images -aq
# 查看指定仓库和TAG(版本)的镜像
docker images [REPOSITORY[:TAG]]
# 如
docker images mysql:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest c0cdc95609f1 28 hours ago 556MB
2. 搜索镜像
# docker search 能显示的内容有限,网络允许的话,直接去dockerhub官网去查询较好
# https://registry.hub.docker.com/
# 搜索mysql镜像
docker search mysql
# 设置筛选条件
# --filter stars=num 筛选标星不少于30个的镜像
# --filter is-automated=true/false 是否自动构建
# --filter is-official=true/false 是否为官方镜像
docker search --filter stars=30 mysql
# 设置镜像显示格式
# .Name 镜像名称
# .Description 描述
# .StarCount 星标数
# .IsOfficial 是否官方
# .IsAutomated 是否自动构建
docker search --format="table {{.Name}}\t{{.IsAutomated}}\t{{.IsOfficial}}\t{{.StarCount}}" mysql
# 命令中table 表示以表格形式展示结果
3. 拉取镜像
# docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull tomcat:9.0
4. 删除镜像
# 删除镜像 docker rmi 镜像名[:tag]/镜像ID
docker rmi centos
# -f 强制删除
# 根据镜像ID删除所有镜像
docker rmi -f $(docker images -aq)
3. 容器命令
1. 查看容器
# 查看当前正在运行的容器
docker ps
# -a 查看所有的容器
# -s 显示容器磁盘占用
# -n=3 显示最近三条创建的所有容器
# -l 显示最新创建的容器
# -q 只显示容器ID
2. 新建容器
# docker run 镜像ID COMMAND
docker run -it centos /bin/bash
# -i 交互式操作,通常与 -t连用
# -t 终端
# centos 镜像名
# /bin/bash 镜像后的命令,用于启用交互式shell
# docker run 其他常用参数
# -d 后台运行
# --name 给容器命名
# -e 设置环境变量
# -m 设置使用的内存最大值
# -v 绑定一个卷
# -p 指定端口映射 主机端口号:容器端口号
# --rm 创建临时容器(exit容器即被删除)
3. 退出容器
exit #在容器内执行该语句,会退出该终端、退出并停止容器
ctrl +P +Q # 退出容器,但不关闭该终端,不停止容器
4. 进入容器
docker attach 镜像ID # 进入容器,在这里使用exit退出容器,则容器会停止运行
docker exec [OPTIONS] 镜像ID [COMMAND] # 进入容器,并重启一个新的终端,因此可以使用很多docker run的参数
# 如
docker exec -it 3b04532af311 /bin/bash
# 由于 docker exec 相当于在容器中新开一个终端,因此在该终端中退出容器,容器仍处于运行状态
5. 停止容器
docker stop 容器ID
# 如果stop失败,可以尝试使用 docker kill命令强制停止
docker kill 容器ID
6. 删除容器
# 删除容器
docker rm CONTAINER
# -f 强制刪除运行中的容器
# -v 连同关联的匿名卷一块删除
# 强制删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有状态为断开的容器
docker rm $(docker ps --filter status=exited -q)
7. 启动、重启容器
# 启动容器
docker start 容器ID
# 重启容器
docker restart 容器ID
8. 查看容器资源使用
docker stats
# 默认显示实时显示所有正在运行的容器的资源占用
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
2492b06944ce centos01 0.00% 3.605MiB / 1.777GiB 0.20% 1.1kB / 0B 19.4MB / 57.3kB 1
3b04532af311 reverent_ritchie 0.00% 532KiB / 1.777GiB 0.03% 926B / 0B 0B / 0B 1
9f754a7abfd3 clever_albattani 0.00% 536KiB / 1.777GiB 0.03% 746B / 0B 0B / 0B 1
# 也可以查看指定容器ID或者容器名的状态
docker stats 2492b06944ce clever_albattani
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
2492b06944ce centos01 0.00% 3.605MiB / 1.777GiB 0.20% 1.1kB / 0B 19.4MB / 57.3kB 1
9f754a7abfd3 clever_albattani 0.00% 536KiB / 1.777GiB 0.03% 746B / 0B 0B / 0B 1
# 其他参数
# --all 显示所有容器的状态数据(默认只显示运行中容器的状态)
# --no-stream 只获取一次当前的占用情况,后续不实时获取
# --format 指定输出格式
# .Container 容器ID/容器名
# .Name 容器名
# .ID 容器ID
# .CPUPerc CPU 百分比
# .MemUsage 当前内存使用
# .NetIO 网络IO
# .BlockIO 块设备IO
# .MemPerc 内存使用占比(Windows不可用)
# .PIDs 容器创建的进程或者线程数 (Windows不可用)
docker stats --all --format "table {{.ID}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}" 2492b06944ce clever_albattani
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
2492b06944ce centos01 0.00% 3.605MiB / 1.777GiB 0.20% 1.1kB / 0B 19.4MB / 57.3kB 1
9f754a7abfd3 clever_albattani 0.00% 536KiB / 1.777GiB 0.03% 746B / 0B 0B / 0B 1
9. 查看容器日志
docker logs 容器ID/容器名
# --details 显示更多信息
# --follow 跟踪实时日志
# --since 显示某个开始时间(2013-01-02T13:23:37Z、 42m for 42 minutes)的所有日志
# --tail 显示最近n条日志
# -t 显示日志时间戳
# --until 显示某个时间(2013-01-02T13:23:37Z、 42m for 42 minutes)之前的所有日志
docker logs --follow --timestamps --since '2021-03-01' --until '2021-05-18' --tail 2 2492b06944ce
2021-05-14T03:34:11.150879981Z exit
2021-05-14T05:45:27.175175999Z [root@2492b06944ce /]# exit
10. 查看容器中的进程
docker top 容器ID/容器名
docker top 2492b06944ce
UID PID PPID C STIME TTY TIME CMD
root 1853 1833 0 09:44 pts/0 00:00:00 /bin/bash
11 . 容器与主机之间的文件拷贝
# 将容器中的路径(文件或目录)拷贝至主机
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# 将主机中的路径(文件或目录)拷贝至容器
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 如果SRC_PATH是文件
# DEST_PATH 不存在, 需要手动新建目录,文件会保存至该DEST_PATH下
docker cp 3b04532af311:/root/dockerfile.txt ./hostfolder # 将dockerfile.txt保存到本地 ./hostfolder文件中,会覆盖同名文件
# DEST_PATH 不存在且以‘/’结尾, 则会报错,提示需要新建目录
[root@codetest ~]# docker cp 3b04532af311:/root/dockerfile.txt ./1/2/
invalid output path: directory "/root/1" does not exist
# DEST_PATH 存在,且是个文件,则会将SRC_PATH内容写进DEST_PATH
docker cp 3b04532af311:/root/dockerfile.txt ./hostfolder/test.txt
# DEST_PATH 存在,且是个目录,会在DEST_PATH新建跟SRC_PATH同名的文件
docker cp 3b04532af311:/root/dockerfile.txt ./hostfolder/ # 会在./hostfolder/下新建‘dockerfile.txt’文件
# 如果SRC_PATH是目录
# DEST_PATH 不存在,会自动新建该 DEST_PATH
docker cp 3b04532af311:/root/dockerfolder ./hostfolder456 # 在主机上新建 ./hostfolder456 目录
# DEST_PATH 存在,但是个文件,会报错,提示 'cannot copy directory'
docker cp 3b04532af311:/root/dockerfolder dockerfile.txt
# DEST_PATH 存在,且是个目录
# 如果 SRC_PATH 以'/.' 结尾, 则会将SRC_PATH目录下的文件拷贝至DEST_PATH
docker cp 3b04532af311:/root/dockerfolder/. ./hostfolder
# 如果不是SRC_PATH 以'/.' 结尾, 会在DEST_PATH下创建SRC_PATH目录
docker cp 3b04532af311:/root/dockerfolder/ ./hostfolder # 在本机./hostfolder下新建dockerfolder路径,并拷贝其中的文件至主机./hostfolder/dockerfolder目录
12. 数据同步(卷挂载)
# 主机目录:容器目录
docker run -v `pwd`:`pwd` -w `pwd` -i -t --name centos centos /bin/bash
[root@37fc626995b1 synctest]# ls
sync.txt
[root@37fc626995b1 synctest]# cat sync.txt
from host
[root@37fc626995b1 synctest]#
# 此时在主机修改文件会直接同步至容器,在容器中修改该文件,内容也会被同步至本地,主机和容器的对应目录 会保持一直
# 关闭容器,在主机修改目录,依然可以同步至容器。 删除容器,主机目录依然存在,不会被删除。
# 通过docker inspect命令,可查看容器的挂载信息
docker inspect 37fc626995b1
"Mounts": [
{
"Type": "bind",
"Source": "/root/synctest",
"Destination": "/root/synctest",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
# 若果主机目录不存在,则会在主机自动新建该目录
docker run -v /doesnt/exist:/foo -w /foo -i -t --name centos centos /bin/bash
#--read-only 表示容器只对同步的目录具有写权限,其他目录均为只读权限,无法修改
docker run --read-only -v `pwd`:`pwd` -w `pwd` -i -t --name centos centos /bin/bash
# 在容器目录添加 :ro 表示容器对该同步目录只有读权限,无写权限,要修改该目录,只能使用主机进行修改。 事实上,该设置会让容器对其他路径也只有读权限
docker run -v `pwd`:`pwd`:ro -w `pwd` -i -t --name centos centos /bin/bash
# 可以不指定主机目录位置
docker run -v /foo -w /foo -i -t --name centos centos /bin/bash
# 使用 docker inspect 命令查看容器详细信息,找到Mount模块,发现在不指定主机目录时,会在主机上生成随机路径
# /var/lib/docker/volumes/随机目录串/_data ,用于和容器进行同步
"Mounts": [
{
"Type": "volume",
"Name": "925b2e8d73485053924dcd5d53e148142400bfb2164262247daf4e8ccb1be717",
"Source": "/var/lib/docker/volumes/925b2e8d73485053924dcd5d53e148142400bfb2164262247daf4e8ccb1be717/_data",
"Destination": "/foo",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
# 不指定主机目录时,可以指定挂载的名字
docker run -v tongbu:/foo -w /foo -i -t --name centos centos /bin/bash
# 使用 docker inspect 命令查看容器详细信息,找到Mount模块,发现在不指定主机目录时,会在主机上生成指定路径
# /var/lib/docker/volumes/挂载名/_data ,用于和容器进行同步
"Mounts": [
{
"Type": "volume",
"Name": "tongbu",
"Source": "/var/lib/docker/volumes/tongbu/_data",
"Destination": "/foo",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
# 可通过docker volume ls 命令,查看不指定主机目录时的挂载信息
docker volume ls
DRIVER VOLUME NAME
local 925b2e8d73485053924dcd5d53e148142400bfb2164262247daf4e8ccb1be717
local tongbu
# 使用 --volumes-from 可以从其他的容器中挂载卷
docker run --volumes-from 25731f8e331d --volumes-from 7b3e43cd66f7 -i -t ubuntu /bin/bash
13. 主机与容器端口映射
# -p 主机端口:容器端口
docker run -d -p 8080:80 nginx
# -P 将主机的随机端口映射到容器端口
docker run -d -P nginx
# docker port CONTAINER 查看容器的端口映射情况