Docker指南
什么是Docker
Docker是帮助在隔离环境运行应用程序的工具。
始终需要确保应用程序可以在隔离的环境中运行,以使应用程序按预期在不同的机器/服务器上运行。这对于能够在本地计算机上开发应用程序并使它们在已部署的环境中按预期运行非常重要。对于开发人员而言,无论他们如何配置计算机,都能在任何计算机上按预期运行应用程序以快速启动并运行并与其他开发人员进行协作也很重要。
之所以很难在不同的计算机上运行应用程序,是因为必须安装所有正确版本的应用程序依赖项,才能使其按预期运行。
Docker具有4种类型的“object”,可用来创建这些隔离的环境
映像,容器,卷和网络。
用户最常直接使用的两个对象是 Docker Images 和 Docker Containers
Docker镜像包含运行应用程序所需的代码,而Docker容器是从Docker映像运行代码的隔离环境。可以将Docker镜像视为Docker容器使用的蓝图和代码。Docker镜像可以保存到映像注册表中,以供其他人下载镜像。最受欢迎的Docker镜像注册表是https://hub.docker.com/。您可以将镜像注册表视为Docker镜像的NPM等效。
Volumes用于持久化运行Docker容器生成的数据。通过将数据保存到Docker卷,即使已删除,重新创建或重新启动Docker容器,它也将允许应用程序具有相同的数据。如果两个不同的容器应该访问相同的数据,则Docker卷也很有用,因为两个容器都可以指向同一卷。
Networks用于确保容器彼此隔离,还用于允许容器彼此通信。
虚拟机
经常谈论VM与Docker,因为它们都可用于创建隔离的环境。
使用Docker,应用程序可以在称为容器的隔离环境中运行,并且这些容器中的每个容器在计算机上共享相同的操作系统内核。
Docker Engine
Docker引擎需要在任何想要做与Docker相关的事情的机器上安装和运行。启动引擎意味着一个长时间运行的后台进程(也与该dockerd命令相对应的Docker守护程序)开始创建可以通过REST API与之交互的服务器。Docker CLI是大多数人与REST API交互以管理Docker对象的方式,但是第三方应用程序也能够直接与REST API交互或通过Docker引擎SDK进行交互。
Dockerfile
Dockerfile 是一个文件,其中包含有关如何构建映像的说明。该文件通常从指定一个基础映像开始,该基础映像将用作要构建的Docker映像的基础。
例如,如果构建基于python的API,则可以使用由安装了Python的Linux操作系统组成的基本映像。在指定基本映像之后,将使用其他指令,这些指令可以指定有关如何构建Docker映像
一般操作
1. 容器设置环境变量
2. 需要暴露出去的端口
3. 复制文件到镜像中
4. 安装依赖
5. 启动容器执行
......
例子-Nodejs
# Linux已安装Node的镜像作为基础镜像
FROM node:12.16.1-alpine3.11
# 安装一些依赖
RUN apk add --no-cache make g++
# 暴露端口
EXPOSE 3000
# 指定工作目录
WORKDIR /usr/src/app
# 复制本地文件到Docker容器工作目录中
COPY . .
# 安装应用需要的依赖
RUN yarn install
# 命令行启动容器
CMD [ "yarn", "start" ]
有关更多列表https://docs.docker.com/engine/reference/builder/
如果应防止将某些文件复制到Docker映像中,.dockerignore
则可以在指定不应复制到Docker映像中的文件Dockerfile
所在位置的同一级别添加文件。可能需要防止将包含敏感信息的.env
文件(例如,持有API密钥的文件)或不必要的大文件添加到Docker映像中。在文件中指定要忽略的文件时,https://docs.docker.com/engine/reference/builder/#dockerignore-file.dockerignore
。
Docker镜像
构建镜像
使用该docker build
命令创建Docker映像。构建Docker镜像时,会为它们提供该--tag
选项指定的标签。标记镜像是一种为Docker镜像提供名称/版本的方法,以了解从映像存储库中提取哪个景象以及运行容器时应使用哪个镜像。
docker build -t myapp -f .
镜像列表
列出Docker主机上可用的Docker映像。
docker images
拉取镜像
从Hub仓库 拉取下载
docker pull nginx
移除镜像
要删除docker映像,请使用docker rmi
或docker image rm
命令。
docker rmi xxx
这是两个有用的命令,可一次清除所有
docker rmi $(docker images -a -q )#删除所有图像
docker rmi $(docker images -a -q )-f #与上面相同,但是也强制删除与正在运行的容器关联的image
导入导出镜像
在某些情况下,将Docker映像保存到文件,然后通过该文件将映像加载到Docker主机可能会很有用。
docker export CONTAINER 命令导出一个容器到文件,不管此时该容器是否处于运行中的状态。
docker export busybox > busybox.tar
执行以上命令后会在当前文件夹下生成 busybox.tar 文件,我们可以将该文件拷贝到其他机器上,通过导入命令实现容器的迁移。
通过docker export命令导出的文件,可以使用docker import命令导入,执行完docker import后会变为本地镜像,最后再使用docker run命令启动该镜像,这样我们就实现了容器的迁移。
Docker容器
Docker容器是用于运行应用程序的隔离环境。Docker容器由其相应的Docker镜像描述。
运行容器
docker run myapp
验证是否运行docker ps
参数
--name 自定义名称
-d 后台执行
-p 暴露端口
查看日志
docker logs
运行状态
docker stop xxx
docker kill xxx
docker start xxx
删除容器
docker rm
列出容器
docker ps
docker ps -a # 包含已停止的容器
正在运行的容器中执行命令
docker exec -it my_app
获取容器详细信息
docker inspect
Docker Volumn
用于将数据持久存储在Docker容器中。这意味着可以停止和重新启动容器,并且可以维护应用程序的数据/状态。Docker卷还可以通过使所有容器指向同一卷来允许多个不同的容器共享数据。
Docker卷保存在主机文件系统上的Docker存储目录中。Docker存储目录/var/lib/docker/volumes
位于Linux上,但是对于用户来说Docker将这些卷保存在哪里并不重要,因为用户将依赖Docker CLI与卷进行交互。
通过在启动容器时将-v
(--volume
)选项传递给docker run
命令,可以将卷安装到容器上。
docker run
-d
--name my-app
-v my-volume:/usr/src /app my-app:1.0
Docker Network
Docker网络用于允许容器彼此良好隔离,如果容器需要能够彼此通信,也可以使用它们。
Docker网络具有不同的驱动程序,可支持不同类型的网络。默认驱动程序称为“桥接”驱动程序,当启动容器而不指定特定网络时,该容器将在名为“ bridge”的桥接网络上运行。但是,如果不同的容器需要相互通信,则Docker建议使用用户定义的桥接网络。
创建自定义网络
docker network create
使用
#使用--network带有docker run以下选项的选项连接到用户定义的网络
docker run
-d
--name my-app
--network my-network
my-app
删除未使用的图像,容器和卷
当用户使用Docker时,计算机的硬盘驱动器很快会因旧的和未使用的Docker对象(即映像,容器和卷)而变得肿。
以下是一些有用的命令的清单,这些命令可以清除旧的映像,容器和卷:
docker system prune #清除与容器无关的图像,容器,卷和网络
docker system prune -a #与上面相同,但包括停止的容器和未使用的映像
docker volume prune #删除未连接到容器的卷(也称为“悬挂”卷)
docker rmi $ { docker images -a -q )#删除所有与现有容器不相关的图像
docker image prune -a #与上述命令相同
docker rmi $(docker images -a -q )-f #与上述相同,但也强制删除与现有容器(正在运行或已停止)关联的图像
docker rm $(docker ps -a -q )#删除所有容器
docker rm $(docker ps -a -q )-f #与上面相同,但是也强制删除正在运行的容器
Docker Compuse
Docker Compose是一种工具,可简化与Docker引擎的通信。与Docker引擎的每次交互都可以通过常规的Docker CLI完成,Docker Compose允许docker-compose.yml
使用docker-compose
CLI命令与Docker引擎进行交互,从而在文件中定义容器。这使您可以将配置详细信息从常规docker
CLI命令中移出,并放入Docker Compose文件中。
在使用可以运行任何命令之前docker-compose
,需要在文件中指定服务docker-compose.yml
。服务描述应为正在运行的容器使用什么映像以及与该容器相关的任何其他配置,例如环境变量,要公开的端口,要使用的卷等。