docker 命令汇总 容器生命周期管理 容器操作 镜像仓库 容器 rootfs 命令 本地镜像管理 其他 配置文件hostconfig.json
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 包,就能在浏览器访问对应的项目(注意这里不能
-d,
bash`不能少)
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 | 指定访问容器的用户名 |
- 执行 tomcat 容器的 startup.sh 脚本
docker exec -it tomcat_jenkins startup.sh
- 进入容器的 CLI 模式(最常用)
docker exec -it tomcat7 bash
- 执行普通命令
docker exec -it tomcat7 pwd
- 指定工作目录执行命令
docker exec -it -w /usr tomcat7 pwd
- 以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 登录这个账号的话,均会报权限错误的问题哦
search
从 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 的讲解
- SRC_PATH 指定一个文件,DEST_PATH 不存在
创建 DEST_PATH 所需的文件夹,文件正常保存到 DEST_PATH 中
- SRC_PATH 指定一个文件, DEST_PATH 不存在,并以 / 结尾
错误:目标目录必须存在
- SRC_PATH 指定一个文件, DEST_PATH 存在并且是一个文件
目标被源文件的内容覆盖
- SRC_PATH 指定一个文件, 若 DEST_PATH 存在并且是目录
使用 SRC_PATH 中的基本名称将文件复制到此目录中
- SRC_PATH指定目录,若 DEST_PATH 不存在
将 DEST_PATH 创建为目录,并将源目录的内容复制到该目录中
- SRC_PATH指定目录,若 DEST_PATH存在并且是一个文件
错误:无法将目录复制到文件
- SRC_PATH指定目录,若 DEST_PATH存在并且是目录
- SRC_PATH 不以
/.
结尾,源目录复制到此目录 - SRC_PATH 以
/.
结尾,源目录的内容被复制到该目录中
实际例子
- 从容器复制文件到主机,已存在的目录
docker cp tomcat7:usr/local/tomcat/README.md ./
- 从容器复制文件到主机,不存在的目录
docker cp tomcat7:usr/local/tomcat/README.md test/
- 从容器复制文件到主机,已存在的文件
docker cp tomcat7:usr/local/tomcat/README.md test.txt
- 从主机复制文件到容器
docker cp test.txt tomcat7:/
- 从主机复制文件到容器,目标目录不存在
docker cp test tomcat7:test/
- 从主机复制文件到容器,目标是一个文件
docker cp test tomcat7:test.text
- 从主机复制文件到容器,目标目录已存在
docker cp test tomcat7:test/
- 从容器复制目录到主机
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
方法二:修改容器的配置文件
- 暂停 Docker 服务
systemctl stop docker
- 进入 Docker 容器配置文件目录下
cd /var/lib/docker/containers/ls
- 进入某个容器的配置文件目录下
容器ID 就是文件夹名称,可通过 docker ps -aq 来查看,不过这是缩写,对照起来看就行
cd 34543c614b6db4ae34543543561703586460b68633d4354354357b66e62c633ls
- 修改 hostconfig.json
vim hostconfig.json
输入 / ,搜索 RestartPolicy
修改后面的值,改成 always
修改完后 :wq 退出并保存此文件
- 重新启动 Docker 服务
systemctl stop dockerdocker ps
就能看到自启动的容器了
如何修改 docker 容器的端口映射
创建容器的时候, -p 指定了端口映射,但是运行之后需要改端口
方法一:删除原有容器,重新创建新的容器
局限性
:如果是数据库、服务器相关的容器,创建新的容器,又得重新配置相关东西了。多用于测试环境
删除容器
docker rm -f 容器ID/名字
重新创建容器
docker run -d -p 8888:8080 -i --name tomcat7 tomcat:7
方法二:修改容器配置文件
- 暂停 Docker 服务
systemctl stop docker
- 进入 Docker 容器配置文件目录下
cd /var/lib/docker/containers/ls
- 进入某个容器的配置文件目录下
容器ID 就是文件夹名称,可通过 docker ps -aq 来查看,不过这是缩写,对照起来看就行
cd 34543c614b6db4ae34543543561703586460b68633d4354354357b66e62c633ls
- 修改 hostconfig.json
vim hostconfig.json
输入 / ,搜索映射的端口(9999)
修改端口值就行了
修改完后 :wq 退出并保存此文件
- 重新启动 Docker 服务
systemctl stop dockerdocker ps
就能看到自启动的容器了
注意
如果不行,config.v2.json也修改下,目录地址跟hostconfig.json一致
方法三:使用 docker commit 命令构建新镜像和容器
- 暂停 Docker 服务
systemctl stop docker
- 使用 commit 构建新镜像
docker commit tomcat7 new_tomcat7docker images
- 使用新镜像重新创建一个 Docker 容器
docker run -d -p 8888:8080 -i --name tomcat77 new_tomcat7
docker ps
- 修改新容器的名字
如果新容器想用回旧容器的名字,需要先删了旧容器,再改名
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
方法二:修改容器配置文件
- 暂停 Docker 服务
systemctl stop docker
- 进入 Docker 容器配置文件目录下
cd /var/lib/docker/containers/ls
- 进入某个容器的配置文件目录下
容器ID 就是文件夹名称,可通过 docker ps -aq 来查看,不过这是缩写,对照起来看就行
cd 34543c614b6db4ae34543543561703586460b68633d4354354357b66e62c633ls
- 修改 hostconfig.json
- 修改 config.v2.json
输入 / ,搜索映射的目录(webapps)
也可以找到 MountPoints
若需要重新指定主机上的映射目录,要改两个地方,别漏
若需要重新指定容器上的映射目录,要改两个地方,别漏
- 重新启动 Docker 服务
systemctl stop dockerdocker start tomcat7cd /usr/local/tomcat/webappsls
方法三:使用 docker commit 命令构建新镜像和容器
- 暂停 Docker 服务
systemctl stop docker
- 使用 commit 构建新镜像
docker commit tomcat7 new_tomcat7docker images
- 使用新镜像重新创建一个 Docker 容器
docker run -d -p 9999:8080 -i --name tomcat77 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7
- 修改新容器的名字
如果新容器想用回旧容器的名字,需要先删了旧容器,再改名
docker rm -f tomcat7
docker rename tomcat77 tomcat7
docker ps