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 使用中的风险,并确保安全和可靠的容器化环境。

上述内容如果有开发经验,应该很快能明白,并且更加牢固。如果是新手也没关系,明白一些基础概念,了解一些指令基础也是好的

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: