Docker 使用的简单介绍

Docker 是一种开源的容器化平台,可以让开发者将应用程序及其依赖项打包到一个可移植的容器中,并在任何环境中运行。它能够提供轻量级、可隔离和可复制的运行环境,使应用程序在不同的操作系统和计算机上具有一致的运行行为。使用 Docker,开发者可以将应用程序、服务或整个应用程序堆栈打包成一个镜像,然后在任何支持 Docker 的平台上运行。这样可以提供更快速、一致和可靠的交付过程,同时节省了资源和减少了系统间的冲突。最重要的是,它可以节省许多运行应用时配置环境的时间。

Docker安装

Docker首页

Windows首页恁大个下载标签,点进去下载就好了,主要介绍下Linux下Centos/Debian的安装

Centos

  1. 首先,更新系统的软件包列表:

    sudo yum update
  2. 添加 Docker 的官方软件仓库。执行以下命令安装所需的软件包以添加 Docker 仓库:

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  3. 添加 Docker 的官方 GPG 密钥:

    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  4. 安装 Docker:

    sudo yum install docker-ce
  5. 启动 Docker 服务:

    sudo systemctl start docker
  6. 可以将当前用户添加到 docker 用户组中,以免每次使用 Docker 都需要使用 sudo(可选):

    sudo usermod -aG docker $USER
  7. 验证 Docker 是否成功安装:

    docker --version

Debian/Ubuntu

  1. 同更新软件包列表:

    sudo apt update
  2. 安装所需的软件包以允许 apt 通过 HTTPS 使用存储库:

    sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
  3. 添加 Docker 的官方 GPG 密钥:

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  4. 添加 Docker 的官方存储库:

    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. 更新软件包列表:

    sudo apt update
  6. 安装 Docker:

    sudo apt install -y docker-ce docker-ce-cli containerd.io
  7. 启动 Docker 服务:

    sudo systemctl start docker
  8. 可以将当前用户添加到 docker 用户组中:

    sudo usermod -aG docker $USER
  9. 验证 Docker 是否成功安装:

    docker --version

如果需要其他版本的安装,可以前往docker官方文档页面查找更详细的安装教程

Dockerfile

Dockerfile 是用于定义 Docker 镜像构建过程的文本文件。它包含一系列指令,用于描述如何从一个基础镜像构建出最终的镜像。

简单来说,想要把一个程序打包成docker镜像,一切都得从这个Dockerfile开始,该文件将会为你的docker虚拟机配置你想要的运行环境,依赖与镜像,让用户可以简单地部署你的应用而抛去繁杂的步骤。

Dockerfile中常用到的指令如下:

  • FROM:指定构建所使用的基础镜像,一般是已经存在的镜像名称。
  • LABEL:设置镜像的元数据,包括维护者信息、版本等。
  • RUN:在镜像中执行命令,用于安装依赖项、配置环境等操作。
  • COPY:将主机上的文件或目录复制到镜像中的指定路径。
  • WORKDIR:设置容器中的工作目录,即后续命令的执行路径。
  • CMD:定义容器启动时要执行的命令,可以包含参数和执行命令的方式。
  • EXPOSE:声明容器运行时监听的端口。
  • ENV:设置环境变量。
  • VOLUME:声明容器中的挂载点。
  • ENTRYPOINT:配置容器启动时要执行的命令,与 CMD 类似,但可以通过参数覆盖。

如我要构建一个Python的应用,想要将ubuntu设置为基础镜像,然后在镜像中安装应用所需要的依赖,就可以这样做:

# 设置基础镜像
FROM ubuntu:latest

# 维护者信息
LABEL maintainer="[email protected]"

# 安装应用程序依赖项
RUN apt-get update && apt-get install -y \
    package1 \
    package2

# 复制应用程序文件到镜像中
COPY app /app

# 设置工作目录
WORKDIR /app

# 运行命令
CMD ["python", "app.py"]

构建为Docker镜像

编写完Dockerfile后,就可以将你的应用构建成为docker镜像了。要构建镜像,需要使用docker build命令:

docker build -t image_name:tag

其中,-t 参数用于指定镜像的名称和标签,. 表示使用当前目录作为构建上下文。

运行docker命令建议使用管理员/sudo权限来运行,避免发生奇怪的错误。运行build命令后,如果你的Dockerfile没有问题,那么就会开始下载所需的依赖项及复制文件,根据网络以及电脑自身性能,可能需要等待一段时间。

构建完成后,就可以使用docker image来查看已构建的镜像列表。

导出docker镜像

一旦你使用 Docker 命令构建了一个镜像,可以使用 docker save 命令将其导出为一个 tar 归档文件。导出的 tar 文件包含完整的镜像文件,你可以将其保存在本地或传输到其他环境中。

docker save -o my_image.tar my_image

在其他机器上,你可以使用 docker load 命令来加载这个镜像:

docker load -i my_image.tar

从镜像创建容器

镜像构建完成后,就可以在docker中用构建的镜像创建一个容器了,使用 docker run 命令创建容器并运行镜像:

docker run -d --name container_name image_name:tag

其中,-d 参数表示在后台运行容器,--name 参数用于指定容器的名称。

创建容器后,容器会自动启动,可以使用docker ps命令来查看运行状态,如我创建了一个PostgreSQL的容器,使用docker ps命令查看的结果如下

Administrator@WIN-DLV1580ABUP MINGW64 ~/Desktop
$ docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED      STATUS          PORTS              NAMES
3194d500c244   postgres:latest   "docker-entrypoint.s…"   3 days ago   Up 11 seconds   0.0.0.0:5432->5432/tcp   postgres

可以看到status处的描述是Up 11 seconds,说明这个容器在11秒前被开启,容器开启成功了。

创建容器参数

如果你是使用Docker Desktop创建容器的化,可以发现,除了容器名(Container name)和映射端口号(Ports),还有两个其他的可选项。它们分别是卷(Volumes)和环境变量(Enviroment variables),那么,这两个可选项的作用又是什么呢?

image-20230715201648750

Volumes(卷)

Volumes 提供了一种持久化存储容器数据的机制,可以将容器内的特定路径与主机上的目录或其他容器进行绑定,实现数据的共享和持久化。继续拿创建PostgreSQL容器来举例。在创建PostgreSQL容器时,一条完整的指令如下:

docker run --name postgres \
    --restart=always \
    -e POSTGRES_PASSWORD=password \
    -p 5432:5432 \
    -v /data/postgresql:/var/lib/postgresql/data \
    -d postgres:14.2 
  • --name:上文讲过,不记得可以倒回去看
  • --restart=always:表示容器退出时,docker会总是自动重启这个容器
  • -p:端口映射,格式为容器内端口:外部机器端口
  • -d:使用的镜像
  • -v:把宿主机的真实路径/data/postgresql作为容器内路径/var/lib/postgresql/data的映射

通过-v参数来绑定目录后,通过访问宿主机上的/data/posrgresql目录,就可以访问到容器内/var/lib/postgresql/data的数据,实现在隔离的环境下仍然能够访问部分数据。再例:

docker run -v /host/path:/container/path image_name

上述命令将主机上的 /host/path 目录与容器内的 /container/path 目录进行绑定。

上面讲的是通过命令行的方式添加目录绑定,除了命令行,还可以通过在Dockerfile中通过VOLUME来声明容器中的挂载点,如:

VOLUME /container/path

这样在构建镜像时,指定了 VOLUME 的路径会成为容器的挂载点,可以通过 docker run 命令来进行挂载。

Enviroment variables(环境变量)

上面代码还有一个参数没有讲,就是-e,即Enviroment variables(环境变量)的首字母。环境变量是在容器内部设置的键值对,用于配置应用程序的行为或传递运行时所需的参数。通过设定环境变量,可以让容器中的程序通过代码读取用户所设置的值,从而对代码进行配置。环境变量通常被用来传递数据库连接信息、API密钥、调试标志等。

环境变量的设置可以在 Dockerfile 中通过 ENV 指令或者在命令行中使用 -e 参数来进行配置。然后,你可以在应用程序的代码中使用操作系统提供的方法(如 Python 中的 os.environ)来读取这些环境变量的值。

在 Docker 中使用环境变量的方法也有两种:命令行方式和 Dockerfile 中的指令方式。

  • 命令行方式: 使用 -e 参数来设置容器内的环境变量,例如:

    docker run -e VARIABLE_NAME=value image_name

    上述命令将在容器内设置名为 VARIABLE_NAME 的环境变量,并赋值为 value

  • Dockerfile 中的指令方式: 使用 ENV 指令来设置容器内的环境变量,例如:

    ENV VARIABLE_NAME=value

    在构建镜像时,指定了 ENV 的环境变量会被嵌入到镜像中,并在容器运行时自动生效。

读取环境变量(以python为例)

在Python中,可以通过os模块来读取环境变量

例:

import os

# 读取单个环境变量
variable_value = os.environ.get('VARIABLE_NAME')
print(variable_value)

# 读取所有环境变量
all_variables = os.environ
for variable, value in all_variables.items():
    print(f'{variable}: {value}')

在上述示例中,首先使用 os.environ.get('VARIABLE_NAME') 方法读取名为 VARIABLE_NAME 的环境变量的值,并将其存储在 variable_value 变量中。如果环境变量不存在,则返回 None

另外,使用 os.environ 自身可以获取一个包含所有环境变量的字典。我们可以遍历这个字典,获取每个环境变量的名称和值。

import os

# 获取所有环境变量的字典
env_variables = os.environ

# 遍历所有环境变量
for variable, value in env_variables.items():
    print(f'{variable}: {value}')

删除容器/镜像

如果不需要用到某个容器了,想要删掉该容器,可以执行ps查看容器id后暂停并删除容器

docker ps
docker stop [容器id]
docker rm [容器id]

此操作删除的是你的容器,如果需要删除镜像,需要使用rmi来删除。

docker images
docker rmi [镜像id]

通过使用docker images命令可以查到想删除的镜像的id,然后执行rmi删除即可

补充

这里是有用到就来补充板块,会更新一些平时没学到但常用的用法

构建镜像设置时区

我们也可以在写Dockerfile 文件构建镜像的时候,设置好时区

# 设定时区
ENV TZ=Asia/Shanghai
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

如果在构建Dockerfile的时候没有修改时区,但后续发现时区不对,可以在终端进行修改(进入终端方式下文有)

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

or

rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

进入容器的终端界面

docker exec -it [容器id] bash

查看容器的日志

docker container logs [容器id]

查看容器的ip地址

如果在使用外部ip访问docker,可以通过docker映射到宿主机的地址来进行访问。但如果要在本地访问docker容器,就需要通过docker容器的ip来进行访问,以下是获取docker容器ip的命令

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [容器id]
最后修改:2023 年 07 月 21 日
如果觉得我的文章对你有用,能不能v我50参加疯狂星期四