Docker概念及基础使用
一,首先什么是Docker?
Docker是一种开源的容器化平台,用于快速,简单的构建,发布和运行应用程序。它可以将程序进行打包到一个为容器的独立环境运行。它可以在任何环境中以相同的方式运行。与虚拟机不同,容器共享主机操作系统内核,更加轻量级。
二,使用Docker的好处?
通过Docker,开发人员可以更加快速的构建环境。用于解决平时环境搭建,环境测试,集群测试,环境不同等问题。同时运维人员可以更加方便的进行扩展和管理应用程序。而且Docker所带来的隔离性对部署的环境也更加安全。
三,为什么说Docker安全?
Docker利用Linux内核命名空间和控制组功能来实现容器之间的隔离性。每个容器都有自己的文件系统,进程,网络等。与主机隔离从而减少攻击。其次轻量级意味这运行更快,资源消耗更低,同时减少了表面攻击。其次Docker提供了签名和验证的机制,确保镜像的完整性和来源可信性。
四,Docker基本组成及架构?
- Docker Client 客户端
- Docker daemon 守护进程
- Docker Container 容器
- Docker Image 镜像
- Docker Registry 仓库
Docker是C/S(客户端client-服务器server)架构模式。客户端连接守护进程,再通过命令向守护进程发起请求,守护进程通过一系列操作返回结果。客户端可以连接本地或远程的守护进程,客户端和服务器通过socket或API进行通信。
客户端——连接守护进程——守护进程对容器进行管理——容器的启动需要拉去镜像——镜像的存放地点是仓库
通俗说法:
主要记住:仓库,镜像,容器。
就好比你做一道菜(容器)——做出的菜谱(镜像)——菜谱量产公之于众(仓库)
指令与参数:-
docker run
: 运行一个容器。-
-d
:在后台运行容器。 -
-it
:交互式地运行容器。 -
--name
:指定容器的名称。 -
--rm
:容器停止后自动删除。 -
-v
:挂载卷到容器。 -
-p
:将主机端口映射到容器端口。 -
--network
:指定容器连接的网络。 -
--env
:设置环境变量。 -
--restart
:设置容器重启策略。
-
-
docker build
: 根据 Dockerfile 构建一个镜像。-
-t
:给镜像指定一个标签。
-
-
docker pull
: 从镜像仓库拉取一个镜像。 -
docker push
: 将一个镜像推送到镜像仓库。 -
docker images
: 列出本地所有镜像。 -
docker ps
: 列出正在运行的容器。-
-a
:列出所有容器,包括停止的。
-
-
docker logs
: 查看容器的日志。 -
docker exec
: 在运行的容器中执行命令。-
-it
:交互式地执行命令。
-
-
docker stop
: 停止一个运行中的容器。-
-t
:指定等待容器停止的超时时间。
-
-
docker start
: 启动一个停止的容器。 -
docker restart
: 重启一个容器。 -
docker rm
: 删除一个容器。-
-f
:强制删除运行中的容器。
-
-
docker rmi
: 删除一个镜像。-
-f
:强制删除镜像。
-
-
docker container prune
: 清理所有停止的容器。 -
docker image prune
: 清理未被使用的镜像。 -
docker network
: 管理 Docker 网络。 -
docker volume
: 管理 Docker 卷。 -
docker inspect
: 查看 Docker 对象的详细信息。
指令运行示例:
docker run --name my-nginx-container -p 80:80 -d nginx
Docker-Compose
**作用:**是一个用于定义和运行多容器Docker的应用工具,运行使用YAML文件的形式来配置应用程序。然后通过命令可以启动所有服务。
特性:
- 语法简单:使用简单的YAML文件定义应用程序,网络,卷。
- 多容器管理:可以对容器进行批量操作,如启动,停止,启动删除。管理更加方便。
- 服务依赖和连接:可指点服务之间进行依赖关系,确保正确顺序的启动和连接。
- 环境配置和参数配置:支持使用环境变量和参数化配置使用更灵活。
- 跨平台支持:可以在各种操作系统上运行,包括 Linux、Windows 和 macOS。
(常用)
-
version
:指定 Docker Compose 文件的版本号。 -
services
:定义了 Docker 容器的服务列表,每个服务都可以包含一个或多个容器。 -
image
:指定容器所使用的镜像名称。 -
container_name
:定义容器的名称。 -
ports
:定义容器内部端口与主机端口的映射关系。 -
volumes
:定义容器的数据卷,用于持久化存储容器内部的数据。 -
restart
:定义容器退出后的重启策略。
(不常用)
-
environment
:设置容器的环境变量。 -
networks
:定义容器所连接的网络。 -
depends_on
:定义容器之间的依赖关系。 -
build
:指定 Dockerfile 的路径,用于构建镜像。 -
command
:指定容器启动时执行的命令。 -
healthcheck
:定义容器的健康检查。 -
labels
:为容器添加元数据标签。 -
links
:定义容器之间的链接关系。 -
entrypoint
:指定容器的入口点。 -
logging
:定义容器的日志配置。 -
ulimits
:设置容器的资源限制。 -
tmpfs
:将临时文件系统挂载到容器中。 -
extra_hosts
:为容器添加额外的主机名解析。
YAML示例:
version: '3'
services:
# 定义 Nginx 服务
nginx:
image: nginx # 使用的 Docker 镜像
container_name: nginx # 容器名称
ports:
- "80:80" # 将主机的 80 端口映射到容器的 80 端口
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # 将主机的 nginx.conf 文件挂载到容器内的 /etc/nginx/nginx.conf,以只读模式
restart: always # 容器停止后总是重新启动
指令:(需要在当前yaml所在位置,或通过 -f 路径 进行指定)
-
docker-compose up
: 构建并启动所有服务。 -
docker-compose down
: 停止并移除所有服务。 -
docker-compose start
: 启动已创建但已停止的服务。 -
docker-compose stop
: 停止正在运行的服务,但不会移除容器。 -
docker-compose restart
: 重启所有服务。 -
docker-compose pause
: 暂停正在运行的容器。 -
docker-compose unpause
: 取消暂停正在运行的容器。 -
docker-compose ps
: 显示服务的状态。 -
docker-compose logs
: 查看服务的日志。 -
docker-compose exec
: 在服务容器内执行命令。 -
docker-compose build
: 构建服务。 -
docker-compose pull
: 拉取服务的镜像更新。 -
docker-compose rm
: 移除已停止的服务容器。 -
docker-compose config
: 验证并显示 Docker Compose 文件的配置。 -
docker-compose version
: 显示 Docker Compose 版本信息。
Dockerfile
**作用:**Dockerfile是用来定义docker-image(镜像)。里面包括了一系列指令,以及创建所需要的操作步骤。通过Dockerfile可以构建特定的应用程序。
特性:
- 可重复性: Dockerfile 中定义了创建 Docker 镜像步骤,确保了镜像的构建过程是可重复的。这意味着在不同的环境中,只要 Dockerfile 的内容不变,构建的镜像都会保持一致。
- 版本控制: Dockerfile 可以与版本控制系统(如 Git)一起使用,方便团队共享和管理。通过将 Dockerfile 存储在版本控制系统中,团队成员可以追踪镜像构建过程的变化,并在需要时进行修改和更新。
- 可读性: Dockerfile 使用简单的文本格式编写,易于阅读和理解。每个指令都描述了一个特定的操作步骤,使得整个构建过程清晰可见。
- 可定制性: Dockerfile 提供了丰富的指令和选项,允许开发人员对镜像的构建过程进行高度定制。可以根据实际需求选择不同的基础镜像、安装特定的软件包、设置环境变量等。
- 缓存机制: Docker 在构建镜像时会利用缓存,如果某个步骤的指令在之前已经执行过并且没有发生变化,那么 Docker 将会复用之前的结果,从而加快构建速度。这一特性使得 Dockerfile 可以高效地构建镜像,节省时间和资源。
- 可扩展性: Dockerfile 支持继承和多阶段构建等高级特性,使得构建过程更加灵活和可扩展。通过多阶段构建,可以将应用程序的不同组件分开构建,从而降低镜像的大小和复杂度。
-
FROM
: 指定基础镜像,后面跟随基础镜像的名称和版本标签。 -
MAINTAINER
: 设置镜像的作者信息(已被弃用,建议使用LABEL maintainer
)。 -
RUN
: 在容器中执行命令,可以用于安装软件包、下载文件等操作。 -
CMD
: 容器启动时执行的默认命令。 -
EXPOSE
: 声明容器运行时监听的端口。 -
ENV
: 设置环境变量。 -
ADD
: 将文件或目录复制到容器中,功能类似于COPY
,但支持自动解压缩。 -
COPY
: 将文件或目录复制到容器中。 -
ENTRYPOINT
: 指定容器启动时执行的命令。 -
WORKDIR
: 设置工作目录,后续的命令都会在这个目录下执行。 -
USER
: 指定运行容器时的用户名或 UID。 -
VOLUME
: 创建一个挂载点,用于让容器访问宿主机上的目录。 -
ARG
: 定义构建参数,用于在构建过程中传递变量。 -
ONBUILD
: 在构建过程中为其他指令设置触发器,即构建子镜像时执行。 -
STOPSIGNAL
: 设置容器停止时发送的信号。 -
HEALTHCHECK
: 检查容器的健康状态。 -
SHELL
: 指定默认的 shell 环境。 -
LABEL
: 添加元数据标签。
构建过程:
这里只是打个比方,所以比较简单,拿go语言举例
第一步:目录建造和结构
go-gin/
├── Dockerfile//必须命名dockerfile
├── go.mod
├── go.sum
└── main.go//主文件
第二步:main.go内容
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
fmt.Println("Hello,Word!")//👈只留这行也可以,主要演示效果
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
第三步:dockerfile内容
# 阶段一
# 使用语言版本作为基础构建
FROM golang:1.20.3-alpine as builder
# 为构建阶段设置环境变量
ENV GOOS linux
ENV GOPROXY https://goproxy.cn,direct
# 设置工作目录为 /app
WORKDIR /app
# 将当前目录下的所有文件复制到工作目录
COPY . .
# 更新 go.mod 文件并下载依赖
RUN go mod tidy && go mod download
# 在构建阶段编译应用程序
RUN go build -o my-app main.go
# 阶段二
# 使用 alpine 镜像作为最终运行阶段
FROM alpine
# 设置工作目录为 /app
WORKDIR /app
# 从构建阶段复制编译好的 my-app 可执行文件到最终阶段的工作目录
COPY --from=builder /app/my-app /app
# 暴露容器的 8888 端口
EXPOSE 8080
# 在容器启动时运行 my-app 可执行文件
CMD ["./my-app"]
第四步:执行指令
docker build -t server .
-
-t
参数用于设置镜像的名称及标签。 -
server
是你为镜像设置的名称。 -
.
是 Dockerfile 所在的目录路径,因为是当前目录所以 . 就可以。
第五步:查看结果
查看一下容器ID
docker ps -a
打印一下容器日志看看,容器ID
docker logs ID
按上述操作正常流程的结果。第一行是可以看见Hello,Word!就是成功了。
Hello,Word!
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ping --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
Docker存在那些隐患或缺点
- 安全性风险: Docker 容器共享主机内核,如果容器中的应用程序存在漏洞,攻击者可能通过容器漏洞进一步入侵主机或其他容器。
- 容器逃逸: 在某些情况下,恶意用户可能会利用 Docker 容器的漏洞进行容器逃逸,即从容器中获取主机权限。
- 资源限制: Docker 容器共享主机资源,如果不正确配置容器的资源限制,可能会导致容器之间资源竞争,影响性能和稳定性。
- 容器生命周期管理: 随着容器数量的增加,管理和监控容器的生命周期可能变得复杂,特别是在大规模部署的情况下。
- 网络配置: Docker 容器需要适当的网络配置才能与其他容器和外部系统通信,不正确的网络配置可能导致网络故障或安全风险。
- 数据持久性: 默认情况下,Docker 容器的文件系统是临时的,容器停止后文件系统中的数据将会丢失。需要特别的配置来实现数据持久化。
- 版本控制和镜像管理: 镜像版本控制和管理可能会变得混乱,尤其是在多个团队或开发者之间共享镜像时。
- 复杂性: Docker 平台及其生态系统是庞大而复杂的,需要一定时间和精力来学习和掌握。
尽管存在这些隐患和挑战,但通过合适的配置和最佳实践,可以最大程度地减少 Docker 使用中的风险,并确保安全和可靠的容器化环境。文章来源:https://www.toymoban.com/news/detail-853839.html
上述内容如果有开发经验,应该很快能明白,并且更加牢固。如果是新手也没关系,明白一些基础概念,了解一些指令基础也是好的文章来源地址https://www.toymoban.com/news/detail-853839.html
到了这里,关于Docker概念及基础使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!