Docker概念及基础使用

Docker


一,首先什么是Docker?

Docker是一种开源的容器化平台,用于快速,简单的构建,发布和运行应用程序。它可以将程序进行打包到一个为容器的独立环境运行。它可以在任何环境中以相同的方式运行。与虚拟机不同,容器共享主机操作系统内核,更加轻量级。

二,使用Docker的好处?

通过Docker,开发人员可以更加快速的构建环境。用于解决平时环境搭建,环境测试,集群测试,环境不同等问题。同时运维人员可以更加方便的进行扩展和管理应用程序。而且Docker所带来的隔离性对部署的环境也更加安全。

三,为什么说Docker安全?

Docker利用Linux内核命名空间和控制组功能来实现容器之间的隔离性。每个容器都有自己的文件系统,进程,网络等。与主机隔离从而减少攻击。其次轻量级意味这运行更快,资源消耗更低,同时减少了表面攻击。其次Docker提供了签名和验证的机制,确保镜像的完整性和来源可信性。

四,Docker基本组成及架构?

  1. Docker Client 客户端
  2. Docker daemon 守护进程
  3. Docker Container 容器
  4. Docker Image 镜像
  5. Docker Registry 仓库

Docker是C/S(客户端client-服务器server)架构模式。客户端连接守护进程,再通过命令向守护进程发起请求,守护进程通过一系列操作返回结果。客户端可以连接本地或远程的守护进程,客户端和服务器通过socket或API进行通信。

客户端------连接守护进程------守护进程对容器进行管理------容器的启动需要拉去镜像------镜像的存放地点是仓库

通俗说法:

主要记住:仓库,镜像,容器。

就好比你做一道菜(容器)------做出的菜谱(镜像)------菜谱量产公之于众(仓库)
指令与参数:

  1. docker run : 运行一个容器。
    • -d:在后台运行容器。
    • -it:交互式地运行容器。
    • --name:指定容器的名称。
    • --rm:容器停止后自动删除。
    • -v:挂载卷到容器。
    • -p:将主机端口映射到容器端口。
    • --network:指定容器连接的网络。
    • --env:设置环境变量。
    • --restart:设置容器重启策略。
  2. docker build : 根据 Dockerfile 构建一个镜像。
    • -t:给镜像指定一个标签。
  3. docker pull: 从镜像仓库拉取一个镜像。
  4. docker push: 将一个镜像推送到镜像仓库。
  5. docker images: 列出本地所有镜像。
  6. docker ps : 列出正在运行的容器。
    • -a:列出所有容器,包括停止的。
  7. docker logs: 查看容器的日志。
  8. docker exec : 在运行的容器中执行命令。
    • -it:交互式地执行命令。
  9. docker stop : 停止一个运行中的容器。
    • -t:指定等待容器停止的超时时间。
  10. docker start: 启动一个停止的容器。
  11. docker restart: 重启一个容器。
  12. docker rm : 删除一个容器。
    • -f:强制删除运行中的容器。
  13. docker rmi : 删除一个镜像。
    • -f:强制删除镜像。
  14. docker container prune: 清理所有停止的容器。
  15. docker image prune: 清理未被使用的镜像。
  16. docker network: 管理 Docker 网络。
  17. docker volume: 管理 Docker 卷。
  18. docker inspect: 查看 Docker 对象的详细信息。

指令运行示例:

css 复制代码
docker run --name my-nginx-container -p 80:80 -d nginx

Docker-Compose


**作用:**是一个用于定义和运行多容器Docker的应用工具,运行使用YAML文件的形式来配置应用程序。然后通过命令可以启动所有服务。

特性:

  • 语法简单:使用简单的YAML文件定义应用程序,网络,卷。
  • 多容器管理:可以对容器进行批量操作,如启动,停止,启动删除。管理更加方便。
  • 服务依赖和连接:可指点服务之间进行依赖关系,确保正确顺序的启动和连接。
  • 环境配置和参数配置:支持使用环境变量和参数化配置使用更灵活。
  • 跨平台支持:可以在各种操作系统上运行,包括 Linux、Windows 和 macOS。

文件前缀:

(常用)

  1. version:指定 Docker Compose 文件的版本号。
  2. services:定义了 Docker 容器的服务列表,每个服务都可以包含一个或多个容器。
  3. image:指定容器所使用的镜像名称。
  4. container_name:定义容器的名称。
  5. ports:定义容器内部端口与主机端口的映射关系。
  6. volumes:定义容器的数据卷,用于持久化存储容器内部的数据。
  7. restart:定义容器退出后的重启策略。

(不常用)

  1. environment:设置容器的环境变量。
  2. networks:定义容器所连接的网络。
  3. depends_on:定义容器之间的依赖关系。
  4. build:指定 Dockerfile 的路径,用于构建镜像。
  5. command:指定容器启动时执行的命令。
  6. healthcheck:定义容器的健康检查。
  7. labels:为容器添加元数据标签。
  8. links:定义容器之间的链接关系。
  9. entrypoint:指定容器的入口点。
  10. logging:定义容器的日志配置。
  11. ulimits:设置容器的资源限制。
  12. tmpfs:将临时文件系统挂载到容器中。
  13. extra_hosts:为容器添加额外的主机名解析。

YAML示例:

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 路径 进行指定)

  1. docker-compose up: 构建并启动所有服务。
  2. docker-compose down: 停止并移除所有服务。
  3. docker-compose start: 启动已创建但已停止的服务。
  4. docker-compose stop: 停止正在运行的服务,但不会移除容器。
  5. docker-compose restart: 重启所有服务。
  6. docker-compose pause: 暂停正在运行的容器。
  7. docker-compose unpause: 取消暂停正在运行的容器。
  8. docker-compose ps: 显示服务的状态。
  9. docker-compose logs: 查看服务的日志。
  10. docker-compose exec: 在服务容器内执行命令。
  11. docker-compose build: 构建服务。
  12. docker-compose pull: 拉取服务的镜像更新。
  13. docker-compose rm: 移除已停止的服务容器。
  14. docker-compose config: 验证并显示 Docker Compose 文件的配置。
  15. docker-compose version: 显示 Docker Compose 版本信息。

Dockerfile


**作用:**Dockerfile是用来定义docker-image(镜像)。里面包括了一系列指令,以及创建所需要的操作步骤。通过Dockerfile可以构建特定的应用程序。

特性:

  1. 可重复性: Dockerfile 中定义了创建 Docker 镜像步骤,确保了镜像的构建过程是可重复的。这意味着在不同的环境中,只要 Dockerfile 的内容不变,构建的镜像都会保持一致。
  2. 版本控制: Dockerfile 可以与版本控制系统(如 Git)一起使用,方便团队共享和管理。通过将 Dockerfile 存储在版本控制系统中,团队成员可以追踪镜像构建过程的变化,并在需要时进行修改和更新。
  3. 可读性: Dockerfile 使用简单的文本格式编写,易于阅读和理解。每个指令都描述了一个特定的操作步骤,使得整个构建过程清晰可见。
  4. 可定制性: Dockerfile 提供了丰富的指令和选项,允许开发人员对镜像的构建过程进行高度定制。可以根据实际需求选择不同的基础镜像、安装特定的软件包、设置环境变量等。
  5. 缓存机制: Docker 在构建镜像时会利用缓存,如果某个步骤的指令在之前已经执行过并且没有发生变化,那么 Docker 将会复用之前的结果,从而加快构建速度。这一特性使得 Dockerfile 可以高效地构建镜像,节省时间和资源。
  6. 可扩展性: Dockerfile 支持继承和多阶段构建等高级特性,使得构建过程更加灵活和可扩展。通过多阶段构建,可以将应用程序的不同组件分开构建,从而降低镜像的大小和复杂度。

文件前缀:

  1. FROM: 指定基础镜像,后面跟随基础镜像的名称和版本标签。
  2. MAINTAINER: 设置镜像的作者信息(已被弃用,建议使用 LABEL maintainer)。
  3. RUN: 在容器中执行命令,可以用于安装软件包、下载文件等操作。
  4. CMD: 容器启动时执行的默认命令。
  5. EXPOSE: 声明容器运行时监听的端口。
  6. ENV: 设置环境变量。
  7. ADD: 将文件或目录复制到容器中,功能类似于 COPY,但支持自动解压缩。
  8. COPY: 将文件或目录复制到容器中。
  9. ENTRYPOINT: 指定容器启动时执行的命令。
  10. WORKDIR: 设置工作目录,后续的命令都会在这个目录下执行。
  11. USER: 指定运行容器时的用户名或 UID。
  12. VOLUME: 创建一个挂载点,用于让容器访问宿主机上的目录。
  13. ARG: 定义构建参数,用于在构建过程中传递变量。
  14. ONBUILD: 在构建过程中为其他指令设置触发器,即构建子镜像时执行。
  15. STOPSIGNAL: 设置容器停止时发送的信号。
  16. HEALTHCHECK: 检查容器的健康状态。
  17. SHELL: 指定默认的 shell 环境。
  18. LABEL: 添加元数据标签。

构建过程:

这里只是打个比方,所以比较简单,拿go语言举例

第一步:目录建造和结构

go 复制代码
go-gin/
├── Dockerfile//必须命名dockerfile
├── go.mod
├── go.sum
└── main.go//主文件

第二步:main.go内容

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内容

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"]

第四步:执行指令

vbscript 复制代码
docker build -t server .
  • -t 参数用于设置镜像的名称及标签。
  • server 是你为镜像设置的名称。
  • . 是 Dockerfile 所在的目录路径,因为是当前目录所以 . 就可以。

第五步:查看结果

查看一下容器ID

css 复制代码
docker ps -a

打印一下容器日志看看,容器ID

docker logs ID

按上述操作正常流程的结果。第一行是可以看见Hello,Word!就是成功了。

csharp 复制代码
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存在那些隐患或缺点


  1. 安全性风险: Docker 容器共享主机内核,如果容器中的应用程序存在漏洞,攻击者可能通过容器漏洞进一步入侵主机或其他容器。
  2. 容器逃逸: 在某些情况下,恶意用户可能会利用 Docker 容器的漏洞进行容器逃逸,即从容器中获取主机权限。
  3. 资源限制: Docker 容器共享主机资源,如果不正确配置容器的资源限制,可能会导致容器之间资源竞争,影响性能和稳定性。
  4. 容器生命周期管理: 随着容器数量的增加,管理和监控容器的生命周期可能变得复杂,特别是在大规模部署的情况下。
  5. 网络配置: Docker 容器需要适当的网络配置才能与其他容器和外部系统通信,不正确的网络配置可能导致网络故障或安全风险。
  6. 数据持久性: 默认情况下,Docker 容器的文件系统是临时的,容器停止后文件系统中的数据将会丢失。需要特别的配置来实现数据持久化。
  7. 版本控制和镜像管理: 镜像版本控制和管理可能会变得混乱,尤其是在多个团队或开发者之间共享镜像时。
  8. 复杂性: Docker 平台及其生态系统是庞大而复杂的,需要一定时间和精力来学习和掌握。

尽管存在这些隐患和挑战,但通过合适的配置和最佳实践,可以最大程度地减少 Docker 使用中的风险,并确保安全和可靠的容器化环境。


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

相关推荐
iangyu4 小时前
docker常用命令
运维·docker·容器
老齐谈电商7 小时前
开源电商erp系统启航电商ERP系统centos Docker部署
docker·开源·centos
-$_$-8 小时前
【黑马点评】 使用RabbitMQ实现消息队列——1.Docker与RabbitMQ环境安装
分布式·docker·rabbitmq
芯的一天8 小时前
windows下DockerDesktop命令行方式指定目录安装
windows·docker
帅气的人1239 小时前
使用 docker-compose 启动 es 集群 + kibana
elasticsearch·docker
獨枭10 小时前
Ubuntu 通过 Docker 搭建 GitLab
ubuntu·docker·gitlab
zixingcai10 小时前
dockertop提示Failed to fetch extensions
docker
雪域迷影19 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
莹雨潇潇20 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
tangdou3690986551 天前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器