【4.0】Docker容器操作

发布时间 2023-08-29 15:57:41作者: Chimengmeng

【一】Docker容器操作

  • Docker容器是基于Docker镜像创建的运行实例。
  • 把镜像运行成容器,并且一个镜像,可以运行出多个容器

【二】运行容器

  • 使用以下命令可以将一个Docker镜像运行为一个或多个容器:
docker run 镜像名称
  • 每次运行此命令,将创建一个新的容器实例。
    • 可以根据需要多次执行该命令来创建多个容器,每个容器可以与相同的镜像关联。
  • 例如:
docker run nginx
  • 这将在后台创建一个基于nginx镜像的新容器,并默认使用最新标签的镜像。

【二】查看正在运行的容器

  • 要查看当前正在运行的Docker容器,可以使用以下命令:
docker ps
  • 这将列出正在运行的容器的相关信息,例如容器ID、镜像、创建时间等。

【三】查看所有容器

  • 要查看所有的Docker容器,包括正在运行的和已停止的容器,可以使用以下命令:
docker ps -a
  • 类似于 docker ps 命令,输出的结果中将包含所有容器的相关信息。

【四】查看最后一次运行的容器

  • 如果只想查看最后一次运行的容器的信息,可以使用以下命令:
docker ps -l
  • 这将列出最后一次运行的容器的详细信息,包括容器ID、镜像、创建时间等。

【五】启动停止的容器

  • 要启动已经停止的Docker容器,可以使用以下命令:
docker start 容器ID/容器名称
  • 通过提供容器ID或名称,可以将停止的容器重新启动。

  • 例如:

docker start my-container
  • 这将启动名为my-container的停止状态容器。

【六】停止运行的容器

  • 要停止正在运行的Docker容器,可以使用以下命令:
docker stop 容器ID
  • 提供要停止的容器的ID,可以将其停止并退出运行状态。

  • 例如:

docker stop 7d5e
  • 这将停止ID为7d5e的容器。

【七】停止所有在运行的容器

  • 如果要停止所有当前正在运行的Docker容器,可以使用以下命令:
docker stop `docker ps -q`
  • 该命令会结合使用docker ps -q命令来获取正在运行的容器的ID列表,并将每个容器依次停止。
  • 需要注意的是,停止容器时应谨慎操作,确保不会停止正在使用或有其他依赖关系的容器。

【八】run 参数 - 目录映射(-v)

  • Docker是一种容器化平台,可以帮助开发者将应用程序和其依赖项打包到一个可移植的容器中。
  • 在Docker中,使用容器映射(Volume Mapping)可以实现宿主机和容器之间文件的共享和同步更新。

【1】操作步骤

(1)运行容器并进行映射:

  • 您可以使用docker run命令来创建并运行一个容器,并通过-v参数指定宿主机和容器之间的目录映射关系。
  • 例如,以下命令将创建一个名为dreamcentos的容器,将宿主机的/home/dream/目录映射到容器中的/home/目录:
docker run -id --name=dreamcentos -v /home/dream/:/home/ centos:7
  • 这样,在容器内部的/home目录中的文件会与宿主机的/home/dream目录中的文件进行同步。

(2)进入容器内部:

  • 使用docker exec命令可以进入已经在运行的容器内部,以便在容器内执行命令。
  • 例如,以下命令将进入名为dreamcentos的容器的交互式终端:
docker exec -it dreamcentos /bin/bash

(3)切换到容器内的/home路径下:

  • 在容器内部,可以使用cd命令切换到特定的目录。
  • 例如,要切换到容器内的/home目录,可以执行以下命令:
cd /home

(4)容器内部修改文件影响外部:

  • 当您在容器内修改映射的文件时,相应目录下的宿主机文件也会被修改。
  • 例如,在容器内部使用编辑器修改了/home目录中的文件,该文件的变化会被同步到宿主机的/home/dream目录中的文件。

(5)外部修改文件影响内部:

  • 同样地,当您在宿主机上修改映射的文件时,容器内相应目录下的文件也会被修改。
  • 例如,在宿主机上使用编辑器修改了/home/dream目录中的文件,该文件的变化会立即同步到容器内的/home目录中的文件。

【2】映射文件的优点

  • 通过映射文件,可以方便地在容器和宿主机之间进行数据共享和同步更新。
  • 这对于开发和部署项目非常有用。
    • 例如,在部署Django项目时,您可以将Django容器与宿主机上的代码进行映射,以实现代码的更新和自动重启。
  • 另外,如果您运行MySQL容器,并将配置文件和数据存储分别放置在宿主机的映射目录中,即使删除了容器,重建时也能保留数据库表数据。

【3】小结

(1)使用步骤

# 1 运行容器并做映射(宿主机--》有docker软件)
# (1.1)映射文件目录
docker run -id --name=dreamcentos  -v /home/dream/:/home centos:7
# (1.1)映射指定文件
docker run -id --name=dreamcentos  -v /home/dream/aa.txt:/aa.txt centos:7

# 2 进入到容器内部
docker exec -it dreamcentos /bin/bash

# 3 到home路径下
cd /home

# 4 容器内部修改文件---》会影响外部

# 5 外部修改文件---》影响内部

(2)其他优点

  • 有个django容器,做好映射,代码放在宿主机上即可,以后更新了代码,只要重启容器,代码就是最新了
  • 运行mysql容器---》mysql配置文件放在宿主机上做好映射
    • mysql容器---》表数据,放到容器中---》如果删了容器---》数据库全没了
    • 表数据,放在宿主机上---》把容器删除---》表数据还在----》再启动一个容器做好映射---》数据都还在

【九】run 参数 - 端口映射(-p)

  • -p参数:端口映射

    • 容器中启动一个mysql5.7 --》容器中的3306监听,宿主机3306没人监听,做端口映射后,宿主机的3306就被docker的这个容器监听了
    • 启动的mysql的root密码是123456
  • 启动mysql容器

docker run -id --name=mysql -p 3307:3306  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  • -e MYSQL_ROOT_PASSWORD=
    • 官方文档 固定参数 配置环境变量
netstat -nlp |grep 3307 查看本机80端口占用情况
  • 以后访问宿主机80端口就等于访问容器的3306端口

【十】文件拷贝(宿主机执行)

  • 容器的文件copy到宿主机上(不是在容器内执行)
docker cp 容器名称:容器目录 需要拷贝的文件或目录
docker cp  f6ce8be027de:/aa.txt /aa.txt
  • 宿主机的文件copy到容器中
docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp /home/lqz/aa.txt f6ce8be027de:/aa.txt

【十一】查看容器IP地址

# 查看容器的详细描述,很多
docker inspect 容器名称  
docker inspect 7f412212f708 --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
  • 在多个容器之间是可以ping通的(容器和宿主机也可以)

【十二】无状态的服务(在容器中尽量运行无状态的服务)

  • mysql reids
    • 有状态,运行过程中产生数据,保存,容器删除,数据就没了
  • uwsgi+django 无状态的服务
    • 停止 Django 项目再重启,不会造成数据丢失

【拓展】run运行容器

  • 运行容器有两个步骤:创建容器:create,运行容器:run
  • 通常情况下,如果容器没有创建,直接执行run,就会创建并运行,所以你只需要会run就行了

【1】运行容器

  • 在运行容器时,可以使用以下命令,并根据需要选择不同的参数:
docker run [OPTIONS] IMAGE
  • 常用选项:

    • -i

      • 表示以交互模式运行容器。

      • -t

        • 表示为容器分配一个伪终端,以便进入容器命令行。

        • -d

          • 表示以守护进程模式在后台运行容器。

            • 注意:如果只使用 -i-t 两个参数,容器创建后会自动进入容器。
            docker -it centos
            # 执行上述命令,如果本地没有centos镜像,就会先去官方拉取镜像安装再运行镜像
            
    • --name

    • 为容器指定一个名称。

    • 如果不指定,将自动生成一个随机名称。
      - -v
      - 表示目录或文件的映射关系(宿主机目录:容器内目录)。
      - 可以使用多个 -v 进行多个映射。

      • -p
        • 表示端口映射关系(宿主机端口:容器内端口)。
          • 可以使用多个 -p 进行多个端口映射。

【2】示例

  • 创建一个不进入容器的后台运行的Python 3.9容器
docker run -id --name python3 python:3.9
  • 创建并进入一个CentOS容器,并在容器内安装Vim:
docker run -it --name mycentos centos:7
yum install vim -y
exit
  • 通过启动已创建的CentOS容器:
docker start mycentos
  • 在已运行的容器中执行命令:
    • exec : 执行命令
docker exec 容器ID 命令
  • 例如,在一个已经运行的容器中执行 ls 命令:
docker exec f82e8578b9b1 ls
  • 进入容器内部(执行进程):
docker exec -it 容器ID /bin/bash
  • 可以使用 -it 参数进入容器的交互式终端。
  • 退出容器:
exit

【3】特别注意

  • 需要特别注意的是,如果使用 -it 进入容器内部,并在容器内敲击 exit 退出,则容器的进程会终止。
  • 为了保持容器的运行状态,需要有一个前台进程在运行并且阻塞,否则容器将停止。
  • 上述内容是在使用容器时需要特别注意的两个方面。

  • 首先,在使用-it参数进入容器的交互模式时,如果在容器内部敲击exit命令退出,会导致容器的进程终止。

    • 这是因为容器进程的生命周期是依赖于前台进程的,当退出容器的交互模式时,相当于关闭了容器中正在运行的主进程,从而导致容器的进程终止。
  • 其次,为了保持容器的运行状态,需要有一个前台进程在运行并且阻塞。

    • 这是因为容器是一个独立的运行环境,如果没有前台进程在运行并且阻塞,容器会认为任务已经完成,从而自动停止。
    • 所以,在设计容器时,应该保证容器中至少有一个前台进程一直在运行,以保持容器的持续运行状态。
    • 可以通过启动一个与容器同生命周期的应用程序或者监控进程来实现。
  • 总结,以上两个注意事项提醒我们在使用容器时需要注意交互模式下避免误操作导致容器进程终止,并且要确保有前台进程在运行并且阻塞,以保持容器的持续运行状态。

【补充】run参数详解

  • 在运行Docker容器时,可以使用docker run命令,并根据需求选择合适的参数。
  • 以下是对每个常用选项的详细解释,以及附带案例和应用场景。

【1】-i 交互模式

  • 使用-i选项时,Docker容器会以交互模式运行,允许用户与容器进行交互。

  • 示例:

docker run -i ubuntu:latest
  • 在这个示例中,我们运行一个Ubuntu容器,并进入交互模式。

  • 可以在容器中执行命令,例如安装软件、修改配置文件等。

  • 应用场景:

    • 需要手动操作或输入命令来与容器进行交互的场景。

【2】-t 伪终端

  • 使用-t选项时,Docker容器将为其分配一个伪终端,进入容器后可以使用容器的命令行界面。

  • 示例:

docker run -it ubuntu:latest
  • 在这个示例中,我们运行一个Ubuntu容器,并进入容器的命令行界面。

  • 可以在这个界面下执行多个命令,并进行交互式操作。

  • 应用场景:

    • 需要在容器中进行命令行操作的场景。

【3】-d 守护进程模式

  • 使用-d选项时,Docker容器将在后台以守护进程的方式运行,不会占用当前终端。

  • 示例:

docker run -d nginx:latest
  • 在这个示例中,我们以守护进程模式运行一个Nginx容器,容器将在后台运行并提供Web服务。

  • 应用场景:

    • 需要让容器在后台持续运行,不占用当前终端的场景,如Web服务器、数据库等。

【4】--name 指定容器名称

  • 使用--name选项时,可以为容器指定一个自定义名称,方便后续对容器进行识别和管理。

  • 示例:

docker run --name my_container nginx:latest
  • 在这个示例中,我们创建一个名为my_container的Nginx容器。

  • 应用场景:

    • 需要对容器进行标识和管理的场景。

【5】-v 目录映射关系

  • 使用-v选项时,可以将宿主机的目录或文件与容器内的目录进行映射,实现数据的共享。

  • 示例:

docker run -v /host/directory:/container/directory nginx:latest
  • 在这个示例中,将宿主机的/host/directory目录与容器的/container/directory目录进行映射。

  • 应用场景:

    • 需要在容器和宿主机之间共享数据的场景,如上传文件至容器、保存容器生成的数据等。

【6】-p 端口映射关系

  • 使用-p选项时,可以将宿主机的端口与容器内的端口进行映射,实现对容器服务的访问。

  • 示例:

docker run -p 8080:80 nginx:latest
  • 在这个示例中,将宿主机的8080端口映射到容器的80端口,以便通过该端口访问容器内运行的Nginx服务。

  • 应用场景:

    • 需要从宿主机访问容器内运行的服务的场景,如Web应用、数据库等。