• 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
    
  • 相关阅读:
    ExtJS面向对象
    简单理解Ext.DomQuery操作CSS3选择器
    简单理解Ext.extend
    Pycharm去掉项目所有 # 注释
    windows 杀死进程
    mongo官方企业版安装及数据库授权使用
    python中赋值,深拷贝,浅拷贝区别
    测试驱动开发简单理解
    Flask与WSGI
    Python直接改变实例化对象的列表属性的值 导致在flask中接口多次请求报错
  • 原文地址:https://www.cnblogs.com/dongye95/p/14899577.html
Copyright © 2020-2023  润新知