Docker 使用的简单介绍
Docker 是一种开源的容器化平台,可以让开发者将应用程序及其依赖项打包到一个可移植的容器中,并在任何环境中运行。它能够提供轻量级、可隔离和可复制的运行环境,使应用程序在不同的操作系统和计算机上具有一致的运行行为。使用 Docker,开发者可以将应用程序、服务或整个应用程序堆栈打包成一个镜像,然后在任何支持 Docker 的平台上运行。这样可以提供更快速、一致和可靠的交付过程,同时节省了资源和减少了系统间的冲突。最重要的是,它可以节省许多运行应用时配置环境的时间。
Docker安装
Windows首页恁大个下载标签,点进去下载就好了,主要介绍下Linux下Centos/Debian的安装
Centos
首先,更新系统的软件包列表:
sudo yum update
添加 Docker 的官方软件仓库。执行以下命令安装所需的软件包以添加 Docker 仓库:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加 Docker 的官方 GPG 密钥:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker:
sudo yum install docker-ce
启动 Docker 服务:
sudo systemctl start docker
可以将当前用户添加到 docker 用户组中,以免每次使用 Docker 都需要使用 sudo(可选):
sudo usermod -aG docker $USER
验证 Docker 是否成功安装:
docker --version
Debian/Ubuntu
同更新软件包列表:
sudo apt update
安装所需的软件包以允许 apt 通过 HTTPS 使用存储库:
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
添加 Docker 的官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
添加 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
更新软件包列表:
sudo apt update
安装 Docker:
sudo apt install -y docker-ce docker-ce-cli containerd.io
启动 Docker 服务:
sudo systemctl start docker
可以将当前用户添加到 docker 用户组中:
sudo usermod -aG docker $USER
验证 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),那么,这两个可选项的作用又是什么呢?
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]