Docker 入门概念

37 阅读6分钟

一、三大概念

  • 镜像:一个只读的打包镜像,用于生成容器。可以自己定义,也可以从 Docker Hub 下载
  • 容器:一个镜像可以生成多个容器
  • Dockerfile:写在应用程序的根目录下,用于创建镜像。

二、Dockerfile

1. FROM

指定基础镜像

2. WORKDIR

指定后续所有命令的工作路径,如果用户不声明,Docker 将默认指定一个路径。

3. COPY <本地源文件路径> <镜像中的目标路径>

将自己写的源代码拷贝到 Docker 镜像中的指定目录。 . 表示当前 Dockerfile 所处的工作路径。

4. RUN

声明创建镜像时要执行的指令,比如要求安装依赖到该镜像中。 指令的操作将影响只读镜像的内容。

5. CMD ["command","args"]

声明容器运行起来后要执行的命令。

6. EXEC

用于在运行中的容器内执行指令。 docker exec -it myredis redis-cli 这是一条 Docker 命令,用于在运行中的 Docker 容器内执行命令。在这个例子中,这条命令执行了 Redis 的 CLI(命令行界面)工具。详细解释如下:

  1. docker exec:这是 Docker 的一条命令,用于在运行中的 Docker 容器内执行命令。

  2. -it:这是 docker exec 的两个参数。-i(或 --interactive)保证即使没有连接也保持 STDIN 打开;-t(或 --tty)为执行的命令分配一个伪 TTY 或终端。

  3. myredis:这是你要在其中执行命令的 Docker 容器的名称或 ID。在这个例子中,容器的名称是 "myredis"。

  4. redis-cli:这是在 Docker 容器内要执行的命令。 redis-cli 是 Redis 的命令行界面工具,使用它可以直接在命令行中执行操作 Redis 数据库的命令。

因此,docker exec -it myredis redis-cli 这个命令的完整含义就是在名为 "myredis" 的 Docker 容器内,启动一个交互式终端来运行 redis-cli 命令,用于操作 Redis 数据库。

二、 Docker 本身的指令

1. docker build

在 Dockerfile 路径下终端执行,构建一个 Images。

2. docker run

运行容器。

  • -p:将宿主机端口映射到容器上的端口,如 -p 8080:5000 允许宿主机通过:8080访问容器的5000 端口
  • -d(--detached):让容器在后台运行。
  • -v:指定 volume,如 -v my-data:/etc/data/a/b/c 将宿主机的文件 my-data 挂载到容器的 /etc/data/a/b/c
  • --link:用于容器间网络通信的工具,可以在两个容器间创建一个安全隧道,使得在不暴露任何端口情况下,源容器可以访问目标容器的服务。
docker run -d -p 8080:8080 --name webapp --link dbcontainer:db some/image

以上命令会启动一个名为 webapp 的新 Docker 容器,并且链接到已经存在的容器 dbcontainer。在 webapp 容器内部,你可以使用别名 db 来作为 dbcontainer 来访问。

然而,需要注意的是,--link 参数在 Docker 17.06 以上版本开始已经被淘汰,用 --network 参数和 Docker 网络来代替。对于新的网络连接和数据共享场景,建议使用用户定义网络(如 bridge,overlay 等类型)或者使用 Volume 进行数据共享。

  • -t: -t 或 --tty 参数用于在创建的容器中分配一个伪终端或终端,以方便用户与 Docker 容器进行交互。
    • 通常,-t 参数与 -i 参数一同使用,以创建一个能从用户接收输入的交互式终端。-i 或 --interactive 参数让 Docker 容器保持 STDIN 打开,即使没有附加。这样,我们可以在终端内运行命令,并看到输出。
    • 例如,docker run -it ubuntu bash 命令会使用 Ubuntu 镜像启动一个新容器,运行 bash,同时在本地终端提供一个交互式 bash shell。这样用户就能在 bash shell 中输入命令,进行与容器的交互操作。
    • 在完成交互后,可以使用 exit 命令来退出这个终端,此时 docker 容器也会停止。

三、Volumes 数据持久化

一个独立于所有容器存在的共享文件夹:

1. docker volume create volumeName

创建 volume

四、使用 docker compose 多容器协作

1. 创建一个 docker-compose.yml

五、实例分析

1. 运行一个 redis 镜像

docker run -p 6379:6379 --name redis -d redis redis-server --requirepass "123456"
  1. docker run: 这是 docker 命令行的一个核心命令,用于启动一个新的容器。

  2. -p 6379:6379: 这个参数表示将容器的 6379 端口映射到宿主机的 6379 端口。

  • 第一个 6379 是宿主机的端口,

  • 第二个 6379 是容器的端口。

  1. --name redis: 这个参数用于给正在创建的容器起一个名字,这里的名字是 "redis"。

  2. -d: 这个参数表示以"后台"模式运行容器,也就是说,容器会在后台运行,不会占用你的命令行窗口

  3. redis: 这是你要运行的镜像的名字。这里使用的是名为 "redis" 的镜像,它是 Redis 数据库的一个官方镜像。

  4. redis-server --requirepass "123456": 这是容器启动后要执行的命令。在这里,我们运行的是 "redis-server",并且通过 "--requirepass" 参数为 Redis 服务器设置了密码,这里的密码是 "123456"。

所以,这条命令的意思是,通过 Docker 运行一个名为 “redis” 的容器,该容器使用的镜像也是 "redis",容器要在后台运行,并监听在主机的 6379 端口,同时在容器内部启动 Redis 服务器,并设置 Redis 的密码为"123456"。

2. 运行一个 nacos 镜像

docker run \
-d -p 8848:8848 \
-p 9848:9848 \
--name nacos2 \
-e MODE=standalone \
-e TIME_ZONE='Asia/Shanghai' \
nacos/nacos-server:v2.1.2
  1. docker run: Docker 的主要命令,用于启动新容器。
  2. -d: 表示在"分离模式"运行,也就是说容器将在后台运行。
  3. -p 8848:8848 和 -p 9848:9848: 这两个参数都是映射端口的命令,其中:
    1. 8848 端口: 这是 Nacos 服务器的默认端口,主要用于处理服务注册与发现、配置管理、命名和元数据等功能的请求。
    2. 9848 端口: 这个端口通常用于 Nacos 集群之间进行节点通信,处理集群间的同步请求,比如复制数据等。这在集群环境中非常重要,但在单机模式下,这个端口实际上并不会被使用。
  4. --name nacos2: 这个是为正在创建的容器命名,这个容器的名字是 "nacos2"。
  5. -e MODE=standalone 和 -e TIME_ZONE='Asia/Shanghai': 为容器设置环境变量
    1. MODE=standalone 设定 Nacos 的运行模式为单机模式,
    2. TIME_ZONE='Asia/Shanghai' 设定容器内的时间区域为上海(东八区)。
  6. nacos/nacos-server:v2.1.2: 这是 Docker 镜像的名字和版本,表示使用 Nacos 官方发布的 2.1.2 版本的镜像来创建容器。