docker 命令汇总

容器生命周期管理

run

创建一个新的容器并运行一个命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
COMMAND :需要在容器内执行的命令

部分options 说明

option 作用
-i 以交互模式运行容器,通常与 -t 同时使用
-t 启动容器后,为容器分配一个命令行,通常与 -i 同时使用
-v 目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
-d 守护进程,后台运行该容器
-p 指定端口映射,格式:主机(宿主)端口:容器端口
-P 随机端口映射,容器内部端口随机映射到主机的端口
-u 以什么用户身份创建容器
--name "nginx-lb" 容器名字
-m, --memory bytes 设置容器使用内存最大值
-h, --hostname string 指定容器的 host name
--dns 8.8.8.8 指定容器 dns 服务器
-e username="ritchie" 设置环境变量
--restart Docker 重启后,容器是否自动重启
--privileged 容器内是否使用真正的 root 权限

例子

例子1:使用镜像 tomcat:8 ,容器命名为 tomcat8

docker run --name tomcat8 tomcat:8


这样运行,会直接将容器运行日志打印出来,所以一般都需要加 -d,否则无法继续敲其他命令

docker run -d --name tomcat8 tomcat:8

其实打印的日志就是 catalina.sh run 命令运行之后的日志

例子2:使用镜像 tomcat:8 ,且将启动的容器的端口映射到主机的端口

如果不指定端口,则随机映射:注意 P小写

docker run -d -P --name tomcat_suiji tomcat:8

指定端口,则会映射到固定端口(比如映射到主机的8081):注意 p小写

docker run -d -p 8081:8080 --name tomcat_suiji tomcat:8

例子3:主机的目录 /usr/local/tomcat/webapps 映射到容器的 ``/usr/local/tomcat/webapps,以后直接在主机的 webapps 目录上传 war 包,就能在浏览器访问对应的项目(注意这里不能 -dbash`不能少)

 docker run -it -p 8081:8080 -v /usr/local/tomcat8_jdk1.8_8200_XXX/webapps:/usr/local/tomcat/webapps --name=tomcat_jenkins tomcat:8 bash

在本机的 /usr/local/tomcat8_jdk1.8_8200_XXX/webapps下有 jenkins的war包

如图,已经映射进去。直接bin目录下启动就可以。

例子4:以 root 权限创建容器,当进入容器之后,拥有 root 权限去执行命令

docker run -d --name tomcat8_jenkins --privileged=true tomcat:8

虽然是拥有了 root 权限,但并不一定是 root 用户身份,所以最好加 -uroot 指定 root 用户身份

docker exec -it -uroot tomcat8_jenkins bash

总结

  • -uroot:是给了 root 用户身份,但并没有真正的 root 权限
  • --privileged:真正让当前用户有了 root 权限
  • 若想要最高的权限,两者可以结合使用

例子9:该容器在 Docker 重启后会自动启动无需手动启动

docker run -d --name tomcat8_jenkins --restart always tomcat:8

start/stop/restart

  • docker start:启动一个或多个已经被停止的容器
  • docker stop:停止一个或多个运行中的容器
  • docker restart:重启一个或多个容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]

start 命令的options忽略

stop/restart 命令的options

option 作用
-t, --time 杀死容器之前等待停止的秒数(默认为10)

根据容器 ID 启动、关闭、重启

docker start 59aec7797ebf
docker stop 59aec7797ebf
docker restart 59aec7797ebf

根据容器名字启动、关闭、重启

docker start myTomcat3
docker stop myTomcat3
docker restart myTomcat3

启动所有容器

docker start $(docker ps -a -q)

关闭所有容器

docker stop $(docker ps -a -q)

重启所有容器

docker restart $(docker ps -a -q)

kill

杀死一个或多个正在运行的容器

docker kill [OPTIONS] CONTAINER [CONTAINER...]

根据容器名字杀掉容器

docker kill tomcat_jenkins

根据容器ID杀掉容器

docker kill 65d4a94f7a39

rm

删除一个或多个容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

options 说明

option 作用
-f 通过 SIGKILL 信号删除一个正在运行的容器
-l 移除容器间的网络,而非容器本身
-v 删除与容器映射的目录

强制删除容器

docker rm -f tomcat7

删除所有已经停止的容器

docker rm $(docker ps -a -q)

批量删除所有已经退出的容器

docker rm -v $(docker ps -aq f status=exited)

删除容器,并且删除容器映射到本机的目录

docker rm -f -v tomcat7

会把/var/lib/docker/vfs/dir目录下的volume删除

Volume

如果你已经使用docker rm来删除你的容器,那可能有很多的孤立的Volume仍在占用着空间。

Volume只有在下列情况下才能被删除:

  • 该容器是用docker rm -v命令来删除的(-v是必不可少的)。
  • docker run中使用了--rm参数

即使用以上两种命令,也只能删除没有容器连接的Volume。连接到用户指定主机目录的Volume永远不会被docker删除。

除非你已经很小心的,总是像这样来运行容器,否则你将会在/var/lib/docker/vfs/dir目录下得到一些僵尸文件和目录,并且还不容易说出它们到底代表什么。

深入理解Docker Volume(一) - DockOne.io (dockerone.com)

create

创建一个新的容器但不启动它

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

部分options 说明

option 作用
--name 指定容器的名字
-v 目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
docker create --name tomcat8 tomcat:8
或者
docker create --name=tomcat8 tomcat:8

exec

在正在运行的容器中运行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

options 说明

options 作用
-d 在后台运行命令
-i 即使没有附加也保持 STDIN 打开
-t 进入容器的 CLI 模式
-e 设置环境变量
-w 需要执行命令的目录
-u 指定访问容器的用户名
  1. 执行 tomcat 容器的 startup.sh 脚本
docker exec -it tomcat_jenkins startup.sh

  1. 进入容器的 CLI 模式(最常用)
docker exec -it tomcat7 bash
  1. 执行普通命令
docker exec -it tomcat7 pwd
  1. 指定工作目录执行命令
docker exec -it -w /usr tomcat7 pwd
  1. 以root用户身份进入容器(重点)
docker exec -it -uroot jenkins1 bash

pause/unpause

  • docker pause:暂停一个或多个容器中的所有进程
  • docker unpause:恢复一个或多个容器中的所有进程
docker pause CONTAINER [CONTAINER...]
docker unpause CONTAINER [CONTAINER...]

暂停tomcat容器的服务

docker pause tomcat7

恢复tomcat容器的服务

docker unpause tomcat7

attach

进入容器正在执行的终端

docker attach [OPTIONS] CONTAINER

options 说明

option 说明
--detach-keys 覆盖用于分离容器的键序列
--no-stdin 不要附加标准输入
--sig-proxy 所有接收到的信号代理到进程
docker run -d --name topdemo ubuntu /usr/bin/top -b
docker attach topdemo

和 docker exec 的区别

#进入当前容器后开启一个新的终端,可以在里面操作。(常用)
docker exec 

# 进入容器正在执行某个命令的终端,不能在里面操作
docker attach 

容器操作

ps

列出容器

docker ps [OPTIONS]

options 说明

option 作用
-a, --all 显示全部容器(默认只显示运行中的容器)
-f, --filter filter 根据提供的 filter 过滤输出
-n, --last int 列出最近创建的 n 个容器(默认-1,代表全部)
-l, --latest 显示最近创建的容器(包括所有状态的容器)
-s, --size 显示总的文件大小
--no-trunc 显示完整的镜像 ID
-q, --quiet 静默模式,只显示容器 ID
# 不带options
docker ps

# 显示全部容器,和总文件大小
docker ps -a -s

# 显示最近创建的容器
docker ps -l
docker ps -a -l

# 显示最近创建的 2 个容器
docker ps -n 2

# 显示完整的镜像ID
docker ps --no-trunc

# 只显示镜像ID
docker ps -q

列表字段介绍

  • CONTAINER ID:容器 ID
  • IMAGE:使用的镜像
  • COMMAND:启动容器时后,容器运行的命令
  • CREATED:容器的创建时间
  • STATUS:容器状态
  • PORTS:实际运行端口,若有指定运行端口则会显示指定的端口和默认运行端口,以及连接类型( tcp / udp )
  • NAMES:容器名字
  • SIZE:容器全部文件的总大小,也会显示容器大小

容器状态介绍

  • created:已创建
  • restarting:重启中
  • running:运行中
  • removing:迁移中
  • paused:暂停
  • exited:停止
  • dead:死亡

top

显示容器正在运行的进程

docker top CONTAINER [ps OPTIONS]

docker top tomcat_jenkins

docker top gitlab | grep redis

logs

提取容器的日志

docker logs [OPTIONS] CONTAINER

options 说明

options 作用
--details 显示提供给日志的其他详细信息
-f, --follow 跟踪日志输出
--tail 仅列出最新N条容器日志
-t, --timestamps 显示时间戳

给日志加时间戳

docker logs -t tomcat7

打印最新5条日志

docker logs --tail 5 tomcat7

跟踪打印日志

docker logs -f tomcat7

port

列出指定的容器的端口映射

docker port CONTAINER [PRIVATE_PORT[/PROTO]]

  • PRIVATE_PORT:指定查询的端口
  • PROTO:协议类型(tcp、udp)

列出容器所有端口的映射

docker port tomcat_jenkins

列出容器指定端口的映射

docker port tomcat_jenkins 8080

列出容器指定端口和协议的映射

docker port tomcat_jenkins 8080/tcp

export

将容器的文件系统导出为 tar 文件

docker export [OPTIONS] CONTAINER

options 说明

option 说明
-o 将输入内容写到文件
docker export -o test.tar tomcat_jenkins

镜像仓库

login

登录 Docker 镜像仓库,默认是 Docker hub

docker login [OPTIONS] [SERVER]

options 说明

options 作用
-u 账号
-p 密码
--password-stdin 通过 STDIN 提供密码
docker login   然后逐步输入账号密码
docker login -u 用户名 -p 密码

但是这两种方式不安全,密码会出现再shell的history中

通过 STDIN 输入密码

先将密码存储在 pwd.txt 文件中

cat pwd.txt | docker login -u 用户名 --password-stdin

logout

退出 Docker 镜像仓库,默认是 Docker hub

docker logout [SERVER]

如果Docker hub,可以不跟 [server]

docker logout

pull

从镜像仓库中拉取或更新镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

options 说明

option 作用
-a, --all-tags 拉取所有 tagged 镜像
--disable-content-trust 忽略镜像的校验,默认开启
-q, --quiet 概要输出
--platform string 若服务支持多平台,这里可以设置平台

push

将本地的镜像上传到镜像仓库,要先登录到镜像仓库

docker push [OPTIONS] NAME[:TAG]

options 说明

options 作用
--disable-content-trust 忽略镜像的校验,默认开启

重点

  • dongye95/tomcat8 ,镜像为什么要是这个名字,因为 dongye95 是我在 Docker Hub 注册的账号名(Docker ID),DockerID/image 这是固定格式
  • 如果前面不写存在的账号名(需要已登录),或者写了但没有 docker login 登录这个账号的话,均会报权限错误的问题哦

从 Docker Hub 查找镜像

docker search [OPTIONS] TERM

options 说明

option 作用
-f, --filter filter 根据提供的 filter 过滤输出
--limit int 搜索结果条数最大为 int(默认25)
--no-trunc 显示完整的镜像 description

容器 rootfs 命令

commit

从容器创建一个新的镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

options 说明

options 作用
-a 提交镜像的作者
-c 使用 Dockerfile 指令来创建镜像
-m 提交时的说明文字
-p commit 时,将容器暂停

无参数生成镜像

docker commit tomcat_jenkins new_image

带参数生成镜像

docker commit -a 名字 -m 文字备注 tomcat_jenkins new_image

cp

在容器和主机之间复制文件/文件夹

docker cp [OPTIONS] container:src_path dest_path 从容器里面拷文件到宿主机
docker cp [OPTIONS] dest_path container:src_path 从宿主机拷文件到容器里面

注意

不管容器有没有启动,拷贝命令都会生效。如果拷贝的内容有重复,会直接覆盖,不会询问。

重点

  • 容器 container 可以是正在运行或已停止的容器
  • SRC_PATH 或 DEST_PATH可以是文件或目录
  • 该命令会假定容器路径相对于容器的 /(根)目录
  • 而主机路径则是相对于执行 docker cp 命令的当前目录

options 说明

option 作用
-a 存档模式(复制所有uid / gid信息)
-L 保持源目标中的链接

备注:暂时没发现这两个 options 有啥用

SRC_PATH 和 DEST_PATH 的讲解

  1. SRC_PATH 指定一个文件,DEST_PATH 不存在

创建 DEST_PATH 所需的文件夹,文件正常保存到 DEST_PATH 中

  1. SRC_PATH 指定一个文件, DEST_PATH 不存在,并以 / 结尾

错误:目标目录必须存在

  1. SRC_PATH 指定一个文件, DEST_PATH 存在并且是一个文件

目标被源文件的内容覆盖

  1. SRC_PATH 指定一个文件, 若 DEST_PATH 存在并且是目录

使用 SRC_PATH 中的基本名称将文件复制到此目录中

  1. SRC_PATH指定目录,若 DEST_PATH 不存在

将 DEST_PATH 创建为目录,并将源目录的内容复制到该目录中

  1. SRC_PATH指定目录,若 DEST_PATH存在并且是一个文件

错误:无法将目录复制到文件

  1. SRC_PATH指定目录,若 DEST_PATH存在并且是目录
  • SRC_PATH 不以 /. 结尾,源目录复制到此目录
  • SRC_PATH 以 /. 结尾,源目录的内容被复制到该目录中

实际例子

  1. 从容器复制文件到主机,已存在的目录
docker cp tomcat7:usr/local/tomcat/README.md ./
  1. 从容器复制文件到主机,不存在的目录
docker cp tomcat7:usr/local/tomcat/README.md test/
  1. 从容器复制文件到主机,已存在的文件
docker cp tomcat7:usr/local/tomcat/README.md test.txt
  1. 从主机复制文件到容器
docker cp test.txt tomcat7:/
  1. 从主机复制文件到容器,目标目录不存在
docker cp test tomcat7:test/
  1. 从主机复制文件到容器,目标是一个文件
docker cp test tomcat7:test.text
  1. 从主机复制文件到容器,目标目录已存在
docker cp test tomcat7:test/
  1. 从容器复制目录到主机
docker cp tomcat7:/usr/local/tomcat/webapps.list /usr/local/ 

diff

检查容器文件系统上文件或目录的更改情况

docker diff CONTAINER

结果字段说明

字符 说明
A 添加了文件或目录
D 删除了文件或目录
C 修改了文件或目录
根据容器名字或者根据容器ID
docker diff tomcat_jenkins
docker diff 78b4a7917f0d

本地镜像管理

images

列出所有的本地镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

options说明

options 作用
-a, --all 列出本地所有的镜像(含中间镜像层,默认情况下,过滤掉中间映像层)
--digests 显示镜像的摘要信息
-f, --filter filter 显示满足条件(filter)的镜像
--format string 使用模板格式化输出
--no-trunc 显示完整的镜像信息
-q, --quiet 只显示镜像ID

rmi

删除一个或多个镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

options 说明

options 作用
-f 强制删除
--no-prune 不移除该镜像的过程镜像,默认移除

删除镜像,且不带tag

docker rmi hello-world

删除镜像,且带tag

docker rmi -f tomcat:latest

tag

给本地镜像打一个标记(tag),可将其归入某一仓库

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

docker tag tomcat:8 tomcat:new_tag

打了新的 TAG 虽然会多了一条记录,但是从 IMAGE ID 可以得知他们是同一个镜像

实际使用场景

假设我们现在发布了一个镜像 myimage,版本为 v1.9.1。那么我们可以给镜像打上四个 tag:1.9.1、1.9、1 和 latest:
    docker tag myimage-v1.9.1 myimage:1   (原来的myimage-v1.9.1:latest,新增一个myimage:1)
    docker tag myimage-v1.9.1 myimage:1.9
    docker tag myimage-v1.9.1 myimage:1.9.1
    docker tag myimage-v1.9.1 myimage:latest
过了一段时间,我们发布了 v1.9.2。这时可以打上 1.9.2 的 tag,并将 1 和1.9 和 latest 从 v1.9.1 移到 v1.9.2:
    docker tag myimage-v1.9.2 myimage:1
    docker tag myimage-v1.9.2 myimage:1.9
    docker tag myimage-v1.9.2 myimage:1.9.2
    docker tag myimage-v1.9.2 myimage:latest
之后,v2.0.0 发布了。这时可以打上 2.0.0、2.0 和 2 的 tag,并将 latest 移到 v2.0.0。

    docker tag myimage-v2.0.0 myimage:2
    docker tag myimage-v2.0.0 myimage:2.0
    docker tag myimage-v2.0.0 myimage:2.0.0
    docker tag myimage-v2.0.0 myimage:latest

这种 tag 方案使镜像的版本很直观,用户在选择非常灵活:
    myimage:1 始终指向 1 这个分支中最新的镜像。
    myimage:1.9 始终指向 1.9.x 中最新的镜像。
    myimage:latest 始终指向所有版本中最新的镜像。
如果想使用特定版本,可以选择 myimage:1.9.1、myimage:1.9.2 或 myimage:2.0.0。

import

从 tar 归档文件中创建镜像

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

options 说明

option 说明
-m 提交时的说明文字
-c 将Dockerfile指令应用于创建的映像
docker import 
dongye95/tomcat_jenkins_new

其他

info

显示 Docker 系统信息,包括镜像和容器数

docker info [OPTIONS]

options 说明

-f:使用给定的模板格式化输出(一般不用)

version

显示 Docker 版本信息

docker version [OPTIONS]

options 说明

-f:使用给定的模板格式化输出(一般不用)

inspect

获取容器/镜像的元数据(JSON格式)

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

options 说明

option 说明
-f 指定返回值的模板文件
-s 如果类型为容器,则显示文件总大小
--type 返回指定类型的JSON

例子一:获取容器 IP

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER_ID

或者
docker inspect tomcat7 | grep IPAddress

例子二:获取容器mac地址

docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $CONTAINER_ID

或者
docker inspect tomcat7 | grep MacAddress

例子三:获取容器日志路径

docker inspect --format='{{.LogPath}}' $CONTAINER_ID

例子四:获取容器的镜像名

docker inspect -f "{{.Config.Image}}" p100_syslog

registry.cn-shenzhen.com/image/syslog:1.0

例子五:获取容器目录挂载信息

docker inspect --format="{{json .Mounts}}" container

美化输出结果

#使用python的json模块美化

docker inspect --format="{{json .Mounts}}" container | python -m json.tool

#使用jq美化

docker inspect --format="{{json .Mounts}}" container | jq

例子六:获取容器网络信息

#查看完整网络信息

docker inspect --format="{{json .NetworkSettings}}" container | jq

#查看网络端口映射

docker inspect --format="{{json .NetworkSettings.Ports}}" container | jq

# 查看容器的网络ip、网关等信息

docker inspect --format="{{json .NetworkSettings.Networks}}" container | jq

例子七:获取容器特定端口的映射信息

docker inspect --format='{{(index (index .NetworkSettings.Ports "8787/tcp") 0).HostPort}}' $INSTANCE_ID

例子八:获取容器的元数据

docker inspect tomcat7

update

  • 有时候创建容器时忘了添加 --restart 参数,导致 Docker 服务重启后,容器不会自动启动,每次都需要手动启动,很不方便
  • 需要对已创建的容器修改 --restart 参数
docker update --restart=always 容器名字/ID

配置文件hostconfig.json

如何修改 docker 容器的启动参数

  • 有时候创建容器时忘了添加 --restart 参数,导致 Docker 服务重启后,容器不会自动启动,每次都需要手动启动,很不方便
  • 那现在如何针对已创建的容器修改 --restart 参数呢

方法一:docker命令修改

详见update

方法二:修改容器的配置文件

  1. 暂停 Docker 服务
systemctl stop docker
  1. 进入 Docker 容器配置文件目录下
cd /var/lib/docker/containers/ls
  1. 进入某个容器的配置文件目录下

容器ID 就是文件夹名称,可通过 docker ps -aq 来查看,不过这是缩写,对照起来看就行

cd 34543c614b6db4ae34543543561703586460b68633d4354354357b66e62c633ls
  1. 修改 hostconfig.json
vim hostconfig.json

输入 / ,搜索 RestartPolicy 
修改后面的值,改成 always 
修改完后 :wq 退出并保存此文件
  1. 重新启动 Docker 服务
systemctl stop dockerdocker ps

就能看到自启动的容器了

如何修改 docker 容器的端口映射

创建容器的时候, -p 指定了端口映射,但是运行之后需要改端口

方法一:删除原有容器,重新创建新的容器

局限性:如果是数据库、服务器相关的容器,创建新的容器,又得重新配置相关东西了。多用于测试环境

删除容器
docker rm -f 容器ID/名字

重新创建容器
docker run -d -p 8888:8080 -i --name tomcat7 tomcat:7

方法二:修改容器配置文件

  1. 暂停 Docker 服务
systemctl stop docker
  1. 进入 Docker 容器配置文件目录下
cd /var/lib/docker/containers/ls
  1. 进入某个容器的配置文件目录下

容器ID 就是文件夹名称,可通过 docker ps -aq 来查看,不过这是缩写,对照起来看就行

cd 34543c614b6db4ae34543543561703586460b68633d4354354357b66e62c633ls
  1. 修改 hostconfig.json
vim hostconfig.json

输入 / ,搜索映射的端口(9999)
修改端口值就行了
修改完后 :wq 退出并保存此文件
  1. 重新启动 Docker 服务
systemctl stop dockerdocker ps

就能看到自启动的容器了

注意如果不行,config.v2.json也修改下,目录地址跟hostconfig.json一致

方法三:使用 docker commit 命令构建新镜像和容器

  1. 暂停 Docker 服务
systemctl stop docker
  1. 使用 commit 构建新镜像
docker commit tomcat7 new_tomcat7docker images
  1. 使用新镜像重新创建一个 Docker 容器
docker run -d -p 8888:8080 -i --name tomcat77 new_tomcat7
docker ps 
  1. 修改新容器的名字

如果新容器想用回旧容器的名字,需要先删了旧容器,再改名

docker rm -f tomcat7
docker rename tomcat77 tomcat7
docker ps

方法四:修改主机 iptables 端口映射

docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现。通过控制网桥来做端口映射,类似路由器中设置路由端口映射。

如果我们有一个容器的8000端口映射到主机的9000端口,先查看iptabes设置了什么规则:

sudo iptables -t nat -vnL

结果中有一条:

Chain DOCKER (2 references)
pkts bytes target prot opt in     out     source        destination         
 98  5872 RETURN  all  --  docker0 *     0.0.0.0/0     0.0.0.0/0           
237 14316 DNAT    tcp  --  !docker0 *    0.0.0.0/0    0.0.0.0/0    tcp dpt:9000 to:172.17.0.3:8000

我们可以看到docker创建了一个名为DOKCER的自定义的链条Chain。而我开放8000端口的容器的ip是172.17.0.3。

也可以通过inspect命令查看容器ip

docker inspect [containerId] |grep IPAddress

我们想再增加一个端口映射,比如8081->81,就在这个链条是再加一条规则:

sudo iptables -t nat -A  DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.3:81

加错了或者想修改:先显示行号查看

sudo iptables -t nat -vnL DOCKER --line-number

删除规则3

sudo iptables -t nat -D DOCKER 3

如何修改 docker 容器的目录映射

创建容器时,指定了目录映射(-v),现在要改映射目录

方法一:删除原有容器,重新创建新的容器

局限性:如果是数据库、服务器相关的容器,创建新的容器,又得重新配置相关东西了。多用于测试环境

删除容器
docker rm -f 容器ID/名字

重新创建容器
 docker run -d -p 9999:8080 -i --name tomcat7 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7

方法二:修改容器配置文件

  1. 暂停 Docker 服务
systemctl stop docker
  1. 进入 Docker 容器配置文件目录下
cd /var/lib/docker/containers/ls
  1. 进入某个容器的配置文件目录下

容器ID 就是文件夹名称,可通过 docker ps -aq 来查看,不过这是缩写,对照起来看就行

cd 34543c614b6db4ae34543543561703586460b68633d4354354357b66e62c633ls
  1. 修改 hostconfig.json
  2. 修改 config.v2.json
输入 / ,搜索映射的目录(webapps)
也可以找到 MountPoints 
若需要重新指定主机上的映射目录,要改两个地方,别漏
若需要重新指定容器上的映射目录,要改两个地方,别漏
  1. 重新启动 Docker 服务
systemctl stop dockerdocker start tomcat7cd /usr/local/tomcat/webappsls

方法三:使用 docker commit 命令构建新镜像和容器

  1. 暂停 Docker 服务
systemctl stop docker
  1. 使用 commit 构建新镜像
docker commit tomcat7 new_tomcat7docker images
  1. 使用新镜像重新创建一个 Docker 容器
 docker run -d -p 9999:8080 -i --name tomcat77 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7
  1. 修改新容器的名字

如果新容器想用回旧容器的名字,需要先删了旧容器,再改名

docker rm -f tomcat7
docker rename tomcat77 tomcat7
docker ps
posted @ 2021-06-18 15:02  dongye95  阅读(408)  评论(0编辑  收藏  举报