Docker 常用命令
帮助命令
docker version # 显示 docker 的版本信息 docker info # 显示 docker 的系统信息,包括镜像和容器的数量 docker 命令 --help # 帮助命令,如 docker images --help
镜像命令
docker images 查看镜像( 列出本地镜像 )
webpiece@1205 ~ % docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest eeb9db34b331 6 months ago 134MB # 解释 REPOSITORY 镜像的名称( 镜像的仓库源 ) TAG 镜像的版本标签,用来区分不同发行版本,如果不指定标记,则默认使用latest标记信息 IMAGE ID 镜像ID,如果镜像ID相同,则说明是同一镜像 CREATED 镜像的创建时间 SIZE 镜像的大小 # 命令格式:docker images [镜像名称] // 省略镜像名称,则列出所有本地镜像 # 可选项 -a, --all 列出所有的本地镜像( 包括已经删除的镜像记录 ) -q, --quiet 只显示镜像ID
docker search 搜索镜像
# 作用:搜索 Docker Hub( 镜像仓库 )上的镜像 webpiece@1205 ~ % docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 12906 [OK] mariadb MariaDB Server is a high performing open sou… 4950 [OK] # 命令格式:docker search [镜像名称] # 可选项 --filter=STARS=5000 // 通过搜索来过滤,收藏数大于5000 webpiece@1205 ~ % docker search mysql --filter=STARS=5000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 12906 [OK] # 说明 # NAME 名称;DESCRIPTION 基本功能描述;STARS 下载次数;OFFICIAL 官方;AUTOMATED 自动的运行
docker pull 获取镜像
# 作用:从远程仓库( 如,Docker Hub )中获取镜像 # 命令格式 docker pull 镜像名[:tag] // 代码示例 webpiece@1205 ~ % docker pull mysql Using default tag: latest // 如果不写tag,默认就是latest latest: Pulling from library/mysql latest: Pulling from library/mysql e5d41499b404: Pull complete // 分层下载,docker images 的核心:联合文件系统 c14e53563050: Pull complete 024772013ffd: Pull complete 1e0914c16b38: Pull complete 71713f7372e7: Pull complete a0c96e0313eb: Pull complete abbb3361f75b: Pull complete 857f6a6ae507: Pull complete 7ac3d9a78b39: Pull complete a07911c3362f: Pull complete fce3f4951dff: Pull complete Digest: sha256:152cf187a3efc56afb0b3877b4d21e231d1d6eb828ca9221056590b0ac834c75 // 签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest // 真实地址( docker pull mysql 等价于 docker pull docker.io/library/mysql:latest ) // 指定版本下载 webpiece@1205 ~ % docker pull mysql:8.0 8.0: Pulling from library/mysql 8.0: Pulling from library/mysql Digest: sha256:152cf187a3efc56afb0b3877b4d21e231d1d6eb828ca9221056590b0ac834c75 Status: Downloaded newer image for mysql:8.0 docker.io/library/mysql:8.0 # 另,获取的镜像,在哪里 ? // /var/lib/docker 目录下 // 操作下面的文件,可以查看相关的镜像信息 // vim /var/lib/docker/image/overlay2/repositories.json
docker tag 重命名 / 复制镜像
# 作用:对本地镜像的 NAME 和 TAG,进行重命名,并产生一个新的命名后镜像 # 命令格式:docker tag [老镜像名称]:[老镜像版本][新镜像名称]:[新镜像版本] // 代码示例 [root@centos7 overlay2]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 0c404972e130 9 days ago 135MB [root@centos7 overlay2]# docker tag nginx:latest nginx:1205 [root@centos7 overlay2]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1205 0c404972e130 9 days ago 135MB nginx latest 0c404972e130 9 days ago 135MB
docker rmi 删除镜像 // rmi,即 remove images
# 作用:删除本地的一个或多个镜像 webpiece@1205 ~ % docker images // 查看镜像 REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 02662e079c08 10 days ago 482MB nginx latest eeb9db34b331 6 months ago 134MB # 命令格式: docker rmi [命令参数][镜像ID] docker rmi [命令参数][镜像名称]:[镜像版本] webpiece@1205 ~ % docker rmi -f 02662e079c08 // 删除指定镜像 webpiece@1205 ~ % docker rmi -f 镜像ID 镜像ID 镜像ID // 删除多个镜像 webpiece@1205 ~ % docker rmi -f $(docker images -aq) // 删除全部镜像 # 说明:如果一个image_id存在多个名称,那么应该使用 名称:版本 的格式,删除镜像 [root@centos7 overlay2]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1205 0c404972e130 9 days ago 135MB nginx latest 0c404972e130 9 days ago 135MB [root@centos7 overlay2]# docker rmi nginx:1205 Untagged: nginx:1205 [root@centos7 overlay2]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 0c404972e130 9 days ago 135M
docker history 查看镜像历史分层信息
# 作用:查看一个本地镜像的历史分层信息 # 命令格式: docker history [镜像名称]:[镜像版本] docker history [镜像ID] // 如果想知道一个本地镜像,默认启动了哪些命令或者都封装了哪些系统层, // 可以使用 docker history 这条命令来获取我们想要的信息 [root@centos7 ~]# docker history nginx IMAGE CREATED CREATED BY SIZE COMMENT 0c404972e130 9 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 9 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B ... # 说明:IMAGE 编号;CREATED 创建时间;CREATED BY 基于哪些命令创建的;SIZE 大小;COMMENT 评论
docker inspect 查看镜像详细信息
# 作用:查看本地一个或多个镜像的详细信息
# 命令格式:
docker image inspect [命令参数] [镜像名称]:[镜像版本]
docker inspect [命令参数] [镜像ID]
// 查看镜像详细信息
[root@centos7 ~]# docker inspect nginx
// 查看容器网络信息
[root@centos7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS vigorous_rubin
42f6039f2034 centos "/bin/bash" 32 minutes ago Up 32 minutes affectionate_tharp
[root@centos7 ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 42f6
172.17.0.2
// 查看容器端口信息
[root@centos7 ~]# docker port 42f6
容器命令
// 前提:下载一个 centos 镜像,有了镜像,才可以创建容器 webpiece@1205 ~ % docker pull centos Using default tag: latest latest: Pulling from library/centos 52f9ef134af7: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest
docker ps 查看所有( 正在 )运行的容器
# 作用:显示 Docker 容器列表 // 命令格式:docker ps // 可选项 -a // 查看所有正在运行的容器 + 历史运行过的容器 -n=? // 查看最近常见的容器 -q // 只显示容器的ID // 说明:CONTAINER ID 容器ID;IMAGE 基于哪个镜像;COMMAND 运行镜像使用了哪些命令;CREATED 创建时间;PORTS 端口号;NAMES 容器名称,默认是随机的 // 管理 Docker 容器,可以通过名称,也可以通过 ID webpiece@1205 ~ % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES webpiece@1205 ~ % docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a237ab7c5251 centos "/bin/bash" 4 minutes ago Exited (127) 2 minutes ago infallible_goldberg 74d32f599ef1 nginx "/docker-entrypoint.…" 10 days ago Exited (255) 6 days ago 80/tcp helloworld 975595911c3c nginx "/docker-entrypoint.…" 10 days ago Exited (127) 10 days ago vigilant_ganguly 9d0afa85b716 nginx "/docker-entrypoint.…" 10 days ago Exited (0) 10 days ago charming_shtern 36af166c23d2 nginx "/docker-entrypoint.…" 10 days ago Exited (255) 6 days ago 80/tcp sweet_zhukovsky webpiece@1205 ~ % docker ps -a -n=1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a237ab7c5251 centos "/bin/bash" 7 minutes ago Exited (127) 5 minutes ago infallible_goldberg
docker create 创建待启动容器
# 作用:利用镜像,创建一个 Created 状态的待启动容器 # 命令格式:docker create [参数命令] 依赖镜像 [容器内命令] [命令参数] # 命令参数: -t, --tty 分配一个伪TTY,也就是分配虚拟终端 -i, --interactive 即使没有连接,也要保持STDIN打开 --name 为容器起名,如果没有指定将会随机产生一个名称 COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令 ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等 // 代码示例 [root@centos7 ~]# docker create --name nginx1 nginx [root@centos7 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 95e3c9e48c9a nginx "/docker-entrypoint.…" 6 seconds ago Created nginx1
docker rm 删除容器
docker rm 容器ID // 删除特定容器 docker rm -f $(docker ps -aq) // 删除所有的容器 // 参数说明: // -f 强制删除 webpiece@1205 ~ % docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb41acc2e491 centos "/bin/bash" 2 minutes ago Up 2 minutes dazzling_lederberg 50123540025e centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago heuristic_ramanujan 54642b05eeae centos "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago lucid_solomon 3df7ba61aa21 centos "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago youthful_wiles a237ab7c5251 centos "/bin/bash" 15 minutes ago Exited (127) 14 minutes ago infallible_goldberg 74d32f599ef1 nginx "/docker-entrypoint.…" 10 days ago Exited (255) 6 days ago 80/tcp helloworld 975595911c3c nginx "/docker-entrypoint.…" 10 days ago Exited (127) 10 days ago vigilant_ganguly 9d0afa85b716 nginx "/docker-entrypoint.…" 10 days ago Exited (0) 10 days ago charming_shtern 36af166c23d2 nginx "/docker-entrypoint.…" 10 days ago Exited (255) 6 days ago 80/tcp sweet_zhukovsky webpiece@1205 ~ % docker rm 50123540025e 50123540025e// 不能删除正在运行的容器,如果要强制删除,可以使用 -f webpiece@1205 ~ % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb41acc2e491 centos "/bin/bash" 4 minutes ago Up 4 minutes dazzling_lederberg webpiece@1205 ~ % docker rm bb41acc2e491 Error response from daemon: You cannot remove a running container bb41acc2e491331c9befbba1c724b60d6eeada573dcd57ab9304d4e226e37679. Stop the container before attempting removal or force remove webpiece@1205 ~ % docker rm -f bb41acc2e491 bb41acc2e491
启动、进入和停止容器
docker start 容器ID // 启动容器 docker restart 容器ID // 重启容器 docker stop 容器ID // 停止正在运行的容器 docker kill 容器ID // 强制停止当前容器 docker pause 容器ID // 暂停容器 docker unpause 容器ID // 取消暂停( 恢复 )容器「 启动容器 」启动容器,有三种方式:
- 启动待启动或已关闭的容器
# 作用:将一个或多个处于创建状态或关闭状态的容器,启动起来 # 命令格式:docker start [容器名称]或[容器ID] # 命令参数( options ): -a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上 -i, --interactive 将当前shell的 STDIN连接到容器上 // 代码示例 [root@centos7 ~]# docker start nginx1
- docker run 基于镜像,创建容器,并启动
- docker run -d 守护进程的方式,启动容器 // -d,以后台方式运行;-it,以交互模式运行
# 作用:基于镜像,创建,并启动一个容器 docker run [可选参数] image [执行的命令] // docker run,其实是 docker create 和 docker start 两个命令的集合体 // 参数说明 --name="NAME" 容器名字,如 centos1 centos2 用来区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口,如 -p 8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口 // 常用 -p 容器端口 容器端口 -P 随机指定端口 # 代码示例 1 webpiece@1205 ~ % docker run -it centos /bin/bash [root@a237ab7c5251 /]# ls // 查看容器内的centos bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@a237ab7c5251 /]# docker images // 基础版本,很多命令是不全的 bash: docker: command not found [root@a237ab7c5251 /]# exit // 退出( 容器停止并推出 ) // 另,使用快捷键 Ctrl + P + Q ,容器不停止退出 # 代码示例 2 // 更多的时候,我们需要让 Docker 容器,在后台以守护形式运行 // 此时,可以通过添加 -d 参数来实现 # 命令格式:docker run -d [image_name] command ... [root@centos7 ~]# docker run -d --name nginx2 nginx // 另 - bug,以后台方式运行centos,使用docker ps查看,发现并没有运行(停止了) // 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,如果docker发现没有应用,就会自动停止 // 可以以交互模式启动 docker run -it centos ,然后不停止容器退出,Ctrl + P + Q webpiece@1205 ~ % docker run -d centos 74560b6b0f4d6c7ae553620df14edbe2b86bfd3e64a7272702e41b2e3b2bb356 webpiece@1205 ~ % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
「 进入和退出容器 」
- 创建时,进入容器
// docker run --name [container_name] -it [docker_image] /bin/bash // 参数说明: --name 给容器定义一个名称 -i 让容器的标准输入保持打开 -t 让docker分配一个伪终端,并绑定到容器的标准输入上 /bin/bash 执行一个命令 简单来说,-it,以交互模式运行容器;-d,以后台模式运行容器 // 代码示例 [root@centos7 ~]# docker run -it --name "nginx3" nginx /bin/bash root@0ad48849905b:/# echo "helloworld" helloworld # 退出容器:方法一 exit 方法二 Ctrl+D root@0ad48849905b:/# exit exit
- 手动方式,进入容器
// 通常,容器都是以后台的方式运行的,如果需要改一些配置,如何进入容器呢 ? // 方式 1( 推荐 ):docker exec -it 容器ID bashshell // 进入容器后,开启一个新的终端,可以在里面操作 webpiece@1205 ~ % docker exec -it f1c648c6cbb0 /bin/bash [root@f1c648c6cbb0 /]# // 方式 2:docker attach 容器ID // 进入容器正在运行的终端,不会启动新的进程 webpiece@1205 ~ % docker attach f1c648c6cbb0 [root@f1c648c6cbb0 /]#
- 生产方式,进入容器
// 生产中,常用的进入容器方法是:使用脚本,脚本内容如下 #!/bin/bash #定义进入仓库函数 docker_in(){ NAME_ID=$1 PID=$(docker inspect --format {{.State.Pid}} $NAME_ID) nsenter --target $PID --mount --uts --ipc --net --pid } docker_in $1 // 直接执行的话,是没有执行权限的,所以,需要赋值权限 #赋权执行 $ chmod +x docker_in.sh # 进入指定容器,并测试 $ ./docker_in.sh 95e3c9e48c9a
「 容器文件拷贝 」 // 拷贝,是一个手动过程,后续可以使用容器卷技术,实现容器和宿主机的互通
// 无论容器是否开启,都可以拷贝 docker cp 容器ID:容器内路径 容器外路径 // 从容器内拷出 docker cp 容器外路径 容器ID:容器内路径 // 从外部拷贝到容器内 // 测试 1:从容器拷贝到宿主机 webpiece@1205 /home % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f1c648c6cbb0 centos "/bin/bash" 19 hours ago Up 4 minutes hungry_mayer // 进入容器 webpiece@1205 /home % docker exec -it f1c6 /bin/bash [root@f1c648c6cbb0 /]# cd home [root@f1c648c6cbb0 home]# touch test.js // 新建一个test.js文件 [root@f1c648c6cbb0 home]# ls test.js // 退出容器 [root@f1c648c6cbb0 home]# exit exit // 没有文件操作权限 webpiece@1205 /home % docker cp f1c648c6cbb0:/home/test.js /home open /System/Volumes/Data/home/test.js: operation not supported // 重新拷贝到有权限的目录下 webpiece@1205 idea % docker cp f1c648c6cbb0:/home/test.js /Users/webpiece/idea // 测试 2:从宿主机拷贝到容器 webpiece@1205 idea % touch hello.js webpiece@1205 idea % ls dcps demo hello.js meilan micro_service project sth svn-project web webpiece webpiece@1205 idea % docker cp /Users/webpiece/idea/hello.js f1c648c6cbb0:/home webpiece@1205 idea % docker attach f1c648c6cbb0 [root@f1c648c6cbb0 /]# cd /home [root@f1c648c6cbb0 home]# ls hello.js test.js [root@f1c648c6cbb0 home]#
其他命令
docker logs 查看容器的运行日志
docker logs -tf 容器ID // 查看所有容器日志 docker logs -tf --tail 10 容器ID // 显示指定行数的日志
docker top 查看容器中的进程信息
webpiece@1205 ~ % docker top f1c648c6cbb0 UID PID PPID C STIME TTY TIME CMD root 3970 3945 0 13:09 ? 00:00:00 /bin/bash root 4017 3945 0 13:10 ? 00:00:00 /bin/bash
docker inspect 查看容器的详细信息
webpiece@1205 ~ % docker inspect f1c648c6cbb0
[
{
"Id": "f1c648c6cbb0b6d658f933db6d14e4ad9fe054966c90a86a09b5e87932baeab5",
"Created": "2022-07-23T13:05:52.327584834Z",
...
// 查看容器网络信息:
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' f1c648c6cbb0
// 查看容器端口信息
$ docker port f1c648c6cbb0 // 没有效果,没有和宿主机关联
docker rename 给容器重命名
# 作用:修改容器的名称 # 命令格式:docker rename [容器id]或[容器名称] [容器新名称] [root@centos7 ~]# docker rename 95e3c9e48c9a nginx6
