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命令会将你的终端附加到容器的主进程上,但不启动新的shell会话;exec命令在容器内启动一个新的shell会话。

删除容器

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、用前一步新生成的镜像重新启动一个容器

文件映射

主机上的 A 目录映射到容器 B

要让主机上的某个目录(设为A)能够在Docker容器B中被访问,我们可以在运行容器时使用 -v 或 –mount 标志。以 -v 参数为例,指令如下:

docker run -v /path/to/host/A:/path/in/container/B image_name
其中,/path/to/host/A 是主机上的路径,/path/in/container/B 是容器内的路径。这个命令会在容器B中创建一个名为B的目录,该目录映射到主机上的目录A。容器B内部对目录B的任何改变都会在主机的目录A中反映出来。

容器里面的C目录映射到主机D

对于容器内的目录C映射到主机的目录D,我们可以使用Docker的volume参数进行操作。首先创建一个新的volume:

docker volume create --driver local --opt o=bind --opt type=none --opt device=/path/to/host/D volumeC
然后,在运行容器时将容器中的目录C与此volume进行挂载:

docker run -v volumeC:/path/in/container/C image_name

设置容器自启动

创建容器时设置:

docker run -d --restart=always 容器ID/name
# Docker 容器的重启策略如下:
–restart具体参数值详细信息:
no        // 默认策略,容器退出时不重启容器;
on-failure   // 在容器非正常退出时(退出状态非0)才重新启动容器;
on-failure:3 // 在容器非正常退出时重启容器,最多重启3次;
always     // 无论退出状态是如何,都重启容器;
unless-stopped // 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。

修改已有容器:

docker update --restart=always 容器ID/name

参考文章:

留下评论

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