docker学习总结
文章目录
前言
使用Docker来部署微服务具有以下几个优点:
轻量级和可移植性:Docker容器可以映射到主机操作系统中的进程,这意味着它们比虚拟机更轻量级且更易于移植。Docker镜像还可以在不同的平台上运行,并且与容器无关。
一致性和可重复性:Docker容器为所有开发人员提供相同的运行时环境,从而消除了“在我的机器上工作”的问题。制作Docker镜像是一个可重复过程,并且生成的镜像可以在任何地方运行。
版本控制和管理:Docker镜像包含了整个应用程序及其依赖项,因此可以轻松地进行版本控制和管理,以确保每个部署实例都是相同的。
隔离性:每个Docker容器都有自己的文件系统、网络和资源,因此它们可以隔离彼此,防止互相干扰或影响。
快速部署和扩展:Docker容器可以非常快速地部署,在几秒钟内启动并运行。多个容器可以同时运行,以支持更高的负载,并可以轻松地进行水平扩展。
一、什么是docker
容器化 (Containerization) 是一种虚拟化技术,它允许我们将应用程序及其所有依赖项封装到一个可移植的容器中。容器提供了隔离和安全性,使得应用程序在不同环境中运行时具有相同的用户体验。
Docker 是一种基于容器化技术的开源平台,它可以帮助我们快速创建、部署和运行应用程序。Docker 构建在 Linux 容器上,提供了一个简单而强大的 API,使得通过容器化技术管理应用程序变得更加容易。
使用 Docker 可以让我们轻松地运行多个应用程序,并且使得应用程序能够在不同的计算机上运行。
上图中:Docker 仓库是用来存储和管理 Docker 镜像的地方,可以把它看做一个集中的仓库。Docker 镜像是一个打包好的应用程序运行环境,里面包含了所需的文件和配置等信息。Docker 容器是 Docker 镜像的运行实例,可以将其理解为在 Docker 环境中启动的一个进程。Dockerfile 是用来描述如何构建 Docker 镜像的文件,其中包含了一系列指令以及镜像的元数据信息。
Docker Compose 是一个工具,用于定义和运行多个 Docker 容器的应用程序。可以通过编写一个 YAML 文件来描述应用程序的服务、网络和数据卷等组件,并通过 docker-compose 命令来控制这些组件的生命周期。
二、docker基本操作
以下是docker的基本操作以及示例:
1、基本操作
-
查看docker版本
docker version
-
检索镜像
docker search nginx
这个命令会在Docker Hub上查找nginx镜像。
-
下载镜像
docker pull nginx
这个命令会下载最新版本的nginx镜像。
-
列出本地镜像列表
docker images
-
运行容器
docker run -it --name mynginx -p 8080:80 nginx -
这个命令会运行一个名为mynginx的容器,并将容器中的80端口映射到主机的8080端口。-it参数可以让我们进入容器内部并与之交互。-d 是在后台运行
-
停止容器
docker stop mynginx
这个命令会停止名为mynginx的容器。
-
启动容器
docker start mynginx
这个命令会启动名为mynginx的容器。
-
删除容器
docker rm mynginx
这个命令会删除名为mynginx的容器。
-
查看正在运行的容器
docker ps
这个命令会列出正在运行的容器。
-
查看容器日志
docker logs mynginx
这个命令会输出名为mynginx的容器的日志。
2、镜像推送到阿里云
$ docker login --username=hzl1500876109 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/szu_liang/study1:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/szu_liang/study1:[镜像版本号]
这个镜像版本号就是到时候在study1 拉取的时候的号
$ docker pull registry.cn-hangzhou.aliyuncs.com/szu_liang/study1:[镜像版本号]
3、数据卷
Docker 数据卷的概念
Docker数据卷是Docker容器中持久化数据的一种方式。它允许将文件或目录从主机文件系统映射到Docker容器中,从而在容器和主机之间共享数据。
由于容器是易于销毁和重新创建的,如果您将数据存储在容器内部,则可能会丢失这些数据。而使用数据卷可以解决这个问题,因为这可以将数据存储在主机文件系统上,以便即使容器被删除,也能保留数据。
Docker 数据卷的用途
数据卷在Docker容器中有多种用途:
-
共享数据:数据卷允许容器和主机之间共享数据。这对于需要在许多容器之间共享数据的应用程序非常有用,例如数据库或Web服务器。
-
持久化数据:如果容器被删除,容器内的所有数据也将被删除,但是使用数据卷,可以将数据存储在主机的文件系统中,从而使得数据可以持久化存在。
-
备份数据:使用数据卷可以轻松地备份数据,因为数据存储在主机文件系统中。
Docker 数据卷的命令
在Docker中,有几种方法可以创建、管理和使用数据卷,包括以下命令:
-
docker volume create
:创建一个新的数据卷。 -
docker volume ls
:列出所有可用的数据卷。 -
docker volume rm
:删除一个或多个数据卷。 -
docker run -v
:在运行容器时,使用-v选项来将数据卷挂载到容器中。 -
docker inspect
:检查容器,数据卷和其他Docker对象的详细信息。
Docker 数据卷的举例
以下是一些使用Docker数据卷的示例:
- 将配置文件存储在数据卷中,并将其应用于多个Web服务器容器。
$ docker volume create config
$ docker run -d --name webserver1 -v config:/config mywebserver
$ docker run -d --name webserver2 -v config:/config mywebserver
- 将数据库文件存储在数据卷中,并将其应用于多个数据库服务器容器。
$ docker volume create dbdata
$ docker run -d --name dbserver1 -v dbdata:/var/lib/mysql mysql
$ docker run -d --name dbserver2 -v dbdata:/var/lib/mysql mysql
- 使用数据卷备份数据。
$ docker volume create backup
$ docker run --rm -v backup:/backup -v /data:/data busybox tar cvf /backup/backup.tar /data
三、dockerfile
Dockerfile 是用来定义 Docker 镜像的蓝图,它是一个文本文件,包含了一条条构建镜像所需的指令和命令。
1、 基础知识
首先,在 Dockerfile 中,每个命令都会创建一个新的镜像层。这意味着,如果您对 Dockerfile 进行更改并重新构建镜像,则将仅重建已更改的层,而不会重新构建整个镜像。这使得镜像构建过程更快更高效。
其次,当编写 Dockerfile 时,使用 RUN
指令来运行任何 Linux 命令或 Shell 脚本。例如,我们可以使用 RUN apt-get update && apt-get install -y curl
来安装 curl 工具。我们还可以使用 ENV
指令来设置环境变量,例如 ENV GOPATH /go
。
最后,构建 Golang 应用程序通常需要两个步骤:编译和运行。我们可以将这些步骤分别映射到 Dockerfile 中的不同阶段,以便我们可以更好地控制容器的大小和复杂性。我们可以使用 FROM
指令选择基础镜像,例如 FROM golang:1.16-alpine3.14
。我们还可以使用 COPY
和 WORKDIR
指令将文件复制到容器中,并设置工作目录。
2、 基本操作
例子:创建一个 Dockerfile 并使用它来构建 Golang 应用程序的 Docker 镜像。
首先,在您的项目根目录中创建一个名为 Dockerfile 的新文件:
# 使用 Golang 1.16 Alpine 做为基础镜像
FROM golang:1.16-alpine3.14
# 将当前目录的所有文件复制到 /go/src/app 目录中
COPY . /go/src/app
# 设置工作目录为 /go/src/app
WORKDIR /go/src/app
# 下载 Redis 依赖项
RUN apk add --no-cache git \
&& go get github.com/go-redis/redis/v8
# 编译应用程序
RUN go build -o main .
# 运行应用程序
CMD ["/go/src/app/main"]
在这个 Dockerfile 中,我们首先选择了 golang:1.16-alpine3.14
作为基础镜像。然后,我们将当前目录的所有文件复制到 /go/src/app
目录中,并将工作目录设置为 /go/src/app
。然后,我们使用 apk add
命令下载 Git 工具并使用 go get
命令下载 Redis 依赖项。最后,我们使用 go build
命令编译应用程序,并使用 CMD
指令指定 Docker 镜像启动后默认执行的命令。
接下来,我们可以使用以下命令构建 Docker 镜像:
docker build -t my-golang-app .
这将基于当前目录中的 Dockerfile 文件构建名为 my-golang-app
的新 Docker 镜像。请注意,.
参数表示 Dockerfile 文件位于当前目录中。
最后,我们可以使用以下命令运行 Docker 容器:
docker run --rm -it my-golang-app
这将启动一个新的 Docker 容器,并在其中运行我们的 Golang 应用程序。由于我们在 Dockerfile 中使用了 CMD
指令,因此应用程序将自动启动。如果您需要覆盖默认的 CMD 命令,您可以在 docker run 命令中指定自己的命令。
四、dockercompose
docker Compose是一个用于定义和运行多个Docker容器应用程序的工具。通过Docker Compose,可以使用YAML文件来配置应用程序的服务,并使用单个命令即可从配置中创建和启动所有服务。
1、基本命令
docker-compose up
启动应用程序容器,同时会创建并启动所有定义的服务。如果当前目录下没有 docker-compose.yml
文件,则需要通过 -f/--file
参数指定文件位置。
docker-compose up [OPTIONS] [SERVICE...]
常用选项:
-d/--detach
:在后台启动容器。--build
:构建镜像并启动容器。--force-recreate
:强制重新创建容器。--no-deps
:不启动依赖的服务容器。--quiet-pull
:安静地拉取镜像。--remove-orphans
:删除孤儿容器。--scale SERVICE=NUM
:启动指定数量的服务容器。
docker-compose down
停止并删除应用程序容器及其所属的服务容器。如果当前目录下没有 docker-compose.yml
文件,则需要通过 -f/--file
参数指定文件位置。
docker-compose down [OPTIONS]
常用选项:
-v/--volume
:删除关联的数据卷。--rmi
:删除相关的镜像。--remove-orphans
:删除孤儿容器。--timeout
:等待容器停止的时间(默认 10 秒)。
docker-compose ps
显示当前运行的容器信息,包括容器 ID、状态、服务名等。
docker-compose ps [OPTIONS] [SERVICE...]
常用选项:
--services
:只显示服务名。--filter
:根据指定条件筛选容器信息。
docker-compose logs
查看指定服务的日志信息。
docker-compose logs [OPTIONS] [SERVICE...]
常用选项:
-f/--follow
:跟随输出新的日志信息。--tail
:输出最后多少条日志信息。--timestamps
:显示时间戳。
docker-compose exec
在指定的服务容器中执行命令。
docker-compose exec [OPTIONS] SERVICE COMMAND [ARGS...]
常用选项:
-d/--detach
:在后台执行命令。--privileged
:使用特权模式(以 root 用户身份)执行命令。
2、docker compose文件编写格式
Docker Compose 的配置文件采用 YAML 格式,通常命名为 docker-compose.yml
。下面是一个简单的示例:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
volumes:
- .:/code
db:
image: postgres
配置文件主要由三个部分组成:
version
指定 Docker Compose 文件的版本号,当前支持的版本有 1、2、2.1、3 和 3.1。
services
定义应用程序的服务,每个服务都是一个单独的容器。服务定义包括以下几个字段:
build
:构建镜像所需的 Dockerfile 文件路径。image
:使用现有的镜像。ports
:将容器内部端口映射到主机的端口。volumes
:将主机上的目录或文件挂载到容器内部。environment
:设置容器的环境变量。depends_on
:指定依赖的服务。
networks
定义应用程序的网络配置。
driver
:指定网络驱动,默认为bridge
。name
:指定网络名称。external
:指定外部网络的名称。
版权声明:
本文为[UPUP小亮]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44545838/article/details/130820144