Docker的容器常用操作笔记

创建新容器

docker run --name con_1 -it centos:latest /bin/bash

此操作会使用centos:latest镜像创建一个新容器,命名为con_1,并进入交互模式。如果镜像centos:latest不存在,则自动下载。

注:虽然docker会为每个新容器自动创建一个随机的容器ID,但为了方便管理,建议养成手动命名的习惯。

参数说明:

  • –name: 容器名;不指定该参数时,docker会随机指派名字。
  • -i:让容器的标准输入保持打开。
  • -t:让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。
  • centos:latest:镜像名为centos,标签(tag)为lastest
  • /bin/bash:启动的软件路径/命令。这里启动了一个bash终端。

如果让容器在创建后在后台运行,使用-d参数。注: 容器最终是否会长久运行,与运行的软件有关。

如果让容器在运行结束后不保存,使用--rm参数。

时区设置

docker镜像一般使用UTC 时间,默认时区为零时区,因此与北京时间有8小时的时差。当宿主机为 Linux 系统时,我们可以直接将宿主机上的/etc/timezone和/etc/localtime挂载到容器中,这样可以保持容器和宿主机时区和时间一致。

-v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro

例如:docker run -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --rm -it ubuntu /bin/bash

在X86架构的电脑上运行ARM容器

docker使用qemu来模拟ARM架构,因此先安装qemu:

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

查看容器

docker ps

查看包含已停止的容器:docker ps -a

重命名容器

docker rename 容器ID/name 新name

停止容器

  • 在交互模式下,直接执行exit;或者按下Ctrl+d键。
  • 使用 docker stop 容器ID/name 来终止一个运行中的容器。

终止状态的容器可以用 docker ps -a 命令看到。例如:

启动已停止的容器

docker start 容器ID/name

这时容器启动,并在后台运行。

如果进行交互,可以执行docker attach 容器ID/namedocker exec -it 容器ID/name /bin/bash。两者区别为,attach命令会在你退出交互模式时停止容器。

删除容器

docker rm 容器ID/name

如果要删除正在运行中的容器,可增加-f参数,如:docker rm -f con_1

导出容器

docker export 容器ID/name > 文件路径

例如:docker export con_2 > ~/dockerdata/con_2.tar

这将会把指定容器和其附属的镜像一起导出为一个镜像文件。

导入容器

由于导出的是镜像,因此所谓导入容器,其实导入是包含容器内容的镜像。

docker import 文件路径 镜像名

例如:docker import con_2.tar mengmei/centos:v1

执行docker image ls,可以看到这个新镜像mengmei/centos:v1。

接下来我们就可以通过docker run --name con_2_bak -it mengmei/centos:v1 /bin/bash来启动这个导入的容器了。

端口映射

默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。

在新建容器时,通过-p参数来指定本机端口与容器端口的映射。

例如:docker run --name nginx_1 -p 11080:80/tcp -p 11081:81/udp -d nginx:latest

将本机的11080tcp端口与容器的80tcp端口绑定,本机11081upd端口与容器的81upd端口绑定。

如果在新建容器结束后想修改端口映射,可采用下面几种方法:

方法一、修改容器配置文件,重启docker服务

编辑容器的配置文件:/var/lib/docker/containers/容器id/hostconfig.json

找到要修改的端口,例如:

"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"11080"}]}

改为:

"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"11085"}]}

最后重启docker服务,即可将本机映射的11080端口改为11085端口。

这个方法的优点是操作简单,缺点是需要重启整个docker服务,会影响其他正在运行的容器。

方法二、iptable转发端口

获取容器的IP,执行 docker inspect 容器ID/name | grep IPAddress

假如得到容器的IP为172.17.0.2,继续执行 iptables -t nat -A DOCKER -p tcp --dport 11086 -j DNAT --to-destination 172.17.0.2:80

即可将本机11080tcp端口与容器的80tcp端口绑定。

方法三、利用docker commit新构镜像

docker commit:把一个容器的文件改动和配置信息保存到一个新的镜像,其实就是导出容器。

  • 1、停止docker容器
    docker stop 容器ID/name
  • 2、生成新镜像
    docker commit 容器ID/name new_image:tag
  • 3、用前一步新生成的镜像重新启动一个容器

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注