19、Docker基础与Dockerfile使用指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Docker基础与Dockerfile使用指南

1. Docker基础命令

Docker提供了一系列命令来管理容器、镜像、网络和卷等组件。下面将详细介绍一些常用的Docker命令。

1.1 容器启动与停止
  • 启动容器 :使用 docker start 命令可以启动一个或多个容器。例如,启动名为 mycontainer othercontainer lastcontainer 的容器:
admin@myhome:~$ docker start mycontainer othercontainer lastcontainer

若要查看容器的输出,可以在启动时使用 -a 选项:

admin@myhome:~$ docker start -a mycontainer
  • 停止容器 :使用 docker stop 命令停止一个或多个运行在后台的容器。同样可以同时停止多个容器:
admin@myhome:~$ docker stop mycontainer othercontainer lastcontainer

还可以使用 -t 选项指定在发送 SIGKILL 信号之前等待容器停止的时间(以秒为单位),例如等待10秒后停止容器:

admin@myhome:~$ docker stop -t 10 mycontainer
1.2 查看容器列表

使用 docker ps 命令可以列出运行或停止的容器。
- 不带任何选项运行 docker ps ,将显示运行中的容器及其容器ID、名称、镜像、命令、创建时间和状态:

admin@myhome:~$ docker ps
  • 使用 -a 选项可以查看所有容器:
admin@myhome:~$ docker ps -a
  • 使用 --quiet -q 选项仅显示容器ID:
admin@myhome:~$ docker ps --quiet
  • 使用 --filter -f 选项根据特定条件过滤输出,例如过滤出名称为 ubuntu 的容器:
admin@myhome:~$ docker ps --filter "name=ubuntu"
  • 使用 -s 选项可以查看容器占用的磁盘空间:
admin@myhome:~$ docker ps -s
1.3 登录Docker注册表

使用 docker login 命令登录到Docker注册表。默认情况下,它将连接到Docker Hub注册表。若要登录到其他注册表,可以指定服务器URL作为参数:

admin@myhome:~$ docker login quay.io

运行 docker login 命令时,系统会提示输入用户名和密码。也可以使用 --username -u 选项指定用户名, --password -p 选项指定密码,但出于安全考虑不建议这样做。还可以使用 --password-stdin -P 选项通过标准输入传递密码:

admin@myhome:~$ echo "mypassword" | docker login --username myusername --password-stdin

例如,登录到AWS ECR:

admin@myhome:~$ aws ecr get-login-password | docker login --username AWS --password-stdin 1234567890.dkr.ecr.region.amazonaws.com

也可以使用 --token -t 选项指定令牌:

admin@myhome:~$ docker login --token usertokenwithrandomcharacters
1.4 拉取和推送镜像
  • 拉取镜像 :使用 docker pull 命令拉取Docker镜像,后跟镜像名称和标签。默认情况下,将拉取 latest 标签的镜像。例如,从Docker Hub拉取最新版本的 alpine 镜像:
admin@myhome:~$ docker pull alpine

拉取特定版本的 alpine 镜像,如版本3.12:

admin@myhome:~$ docker pull alpine:3.12

若要从其他注册表拉取镜像,可以在镜像名称中指定注册表URL:

admin@myhome:~$ docker pull myregistry.com/myimage:latest
  • 推送镜像 :构建新镜像后,可以使用 docker push 命令将其推送到镜像注册表。默认情况下,它将尝试上传到Docker Hub注册表:
admin@myhome:~$ docker push myimage

若要推送特定版本的镜像,如版本1.0,需要先在本地为镜像打标签,然后再推送到注册表:

admin@myhome:~$ docker tag myimage:latest myimage:1.0
admin@myhome:~$ docker push myimage:1.0

同样,可以在镜像名称中指定注册表URL将镜像推送到其他注册表:

admin@myhome:~$ docker push myregistry.com/myimage:latest

在推送镜像之前,需要使用 docker login 命令登录到目标注册表。

1.5 管理镜像

使用 docker image 命令管理镜像。
- 列出本地可用的镜像:

admin@myhome:~$ docker image ls

也可以使用 docker images 命令达到相同的效果:

admin@myhome:~$ docker images
  • 从Docker注册表拉取镜像:
admin@myhome:~$ docker image pull ubuntu
  • 构建镜像:
admin@myhome:~$ docker image build -t <image_name> .
  • 为镜像创建标签:
admin@myhome:~$ docker image tag <image> <new_image_name>
  • 删除镜像:
admin@myhome:~$ docker image rm <image>

还可以使用 docker image prune 命令删除所有未使用的镜像(悬空镜像)。

1.6 在容器中执行命令

使用 docker exec 命令在运行的Docker容器中执行命令,基本语法如下:

docker exec CONTAINER COMMAND ARGUMENTS

其中, CONTAINER 是要执行命令的容器的名称或ID, COMMAND 是要在容器中运行的命令, ARGUMENTS 是命令的额外参数(可选)。例如,在名为 mycontainer 的容器中运行 ls 命令:

admin@myhome:~$ docker exec mycontainer ls
1.7 获取容器日志

使用 docker logs 命令获取Docker容器生成的日志:

docker logs CONTAINER_NAME_OR_ID

可以传递以下额外选项:
| 选项 | 描述 |
| ---- | ---- |
| --details, -a | 显示日志的额外详细信息 |
| --follow, -f | 跟踪日志输出 |
| --since, -t | 仅显示自特定日期以来的日志(例如,2013-01-02T13:23:37) |
| --tail, -t | 显示日志末尾的行数(默认显示所有行) |

例如:

admin@myhome:~$ docker logs CONTAINER_ID
1.8 删除容器和镜像
  • 删除容器 :使用 docker rm 命令删除一个或多个Docker容器:
docker rm CONTAINER_NAME_OR_ID

例如:

admin@myhome:~$ docker rm CONTAINER_ID

若要列出所有容器,可以使用 docker ps -a 命令。
- 删除镜像 :使用 docker rmi 命令删除一个或多个Docker镜像:

docker rmi IMAGE

例如:

admin@myhome:~$ docker rmi IMAGE_ID
1.9 管理Docker网络

使用 docker network 命令管理Docker网络,除了常见的创建、删除和列出操作外,还可以将运行的Docker容器连接(和断开)到不同的网络。

常见操作如下:
- 创建新网络:

admin@myhome:~$ docker network create mynetwork
  • 检查网络:
admin@myhome:~$ docker network inspect mynetwork
  • 删除网络:
admin@myhome:~$ docker network rm mynetwork
  • 列出网络:
admin@myhome:~$ docker network ls
  • 将容器连接到网络:
admin@myhome:~$ docker network connect mynetwork CONTAINER_NAME_OR_ID
  • 断开容器与网络的连接:
admin@myhome:~$ docker network disconnect mynetwork CONTAINER_NAME_OR_ID

此外,还可以使用一些网络插件来扩展Docker,例如:
- Contiv - VPP :使用Vector Packet Processing(VPP)技术为容器提供高效、可扩展和可编程的网络解决方案,适用于企业和服务提供商环境。
- Weave Net :允许容器相互通信,无论它们运行在哪个主机上。它创建一个跨多个主机的虚拟网络,使容器能够以高可用、冗余和负载均衡的方式部署。
- Calico :使用纯基于IP的网络方法,提供简单性和可扩展性。允许管理员定义和执行网络策略。

1.10 管理Docker卷

使用 docker volume 命令管理Docker中的卷。可以列出可用的卷、清理未使用的卷或创建卷以供后续使用。

Docker支持多种卷驱动程序,常见的有:
| 驱动程序 | 描述 |
| ---- | ---- |
| local | 默认驱动程序,使用UnionFS将数据存储在本地文件系统上 |
| awslogs | 可以将应用程序生成的日志存储在Amazon CloudWatch Logs中 |
| cifs | 允许将SMB/CIFS(Windows)共享挂载为Docker卷 |
| GlusterFS | 将GlusterFS分布式文件系统挂载为Docker卷 |
| NFS | 将网络文件系统(NFS)挂载为Docker卷 |

常见操作示例:
- 列出卷:

docker volume ls
  • 创建卷:
docker volume create <volume - name>
  • 检查卷:
docker volume inspect <volume - name>
  • 删除卷:
docker volume rm <volume - name>
  • 在启动新容器时将卷挂载到容器:
docker volume create myvolume
docker run -v myvolume:/opt/data alpine
2. Dockerfile基础

Dockerfile是一个具有预定结构的文本文件,包含一组用于构建Docker镜像的指令。其目的是自动化Docker镜像的构建过程,使镜像能够轻松重现和分发。

2.1 Dockerfile结构

Dockerfile由一系列命令组成,每行一个命令。每个命令在UnionFS中创建一个新层,最终的镜像由所有层的联合组成。创建的层越少,生成的镜像就越小。

常见的Dockerfile命令如下:
- FROM
- COPY
- ADD
- EXPOSE
- CMD
- ENTRYPOINT
- RUN
- LABEL
- ENV
- ARG
- VOLUME
- USER
- WORKDIR

完整的命令列表可以在官方Docker文档网站上找到:https://docs.docker.com/engine/reference/builder/ 。

2.2 常用命令详解
2.2.1 FROM

Dockerfile以 FROM 命令开头,指定要使用的基础镜像。例如:

FROM ubuntu:20.04

也可以使用 as 关键字为构建命名:

FROM ubuntu:20.04 as builder1

docker build 会尝试从公共Docker Hub注册表下载Docker镜像,也可以使用其他注册表或私有注册表。

2.2.2 COPY和ADD

COPY 命令用于将文件或目录从主机机器复制到容器文件系统。例如:

COPY . /var/www/html

ADD 命令也用于向Docker镜像添加文件或目录,但它具有比 COPY 更多的功能。它可以自动提取TAR存档文件,检查源字段中是否存在URL,如果存在则从URL下载文件,并且有 --chown 选项来设置目标文件的所有权。一般建议在大多数情况下使用 COPY ,仅在需要 ADD 提供的额外功能时才使用它。

2.2.3 EXPOSE

EXPOSE 命令在Dockerfile中告知Docker容器在运行时监听指定的网络端口,但它实际上并不发布这些端口。它用于向用户提供容器打算发布哪些端口的信息。例如,如果容器在端口80上运行Web服务器,可以在Dockerfile中包含以下行:

EXPOSE 80

可以指定端口监听TCP还是UDP,在指定端口号后添加斜杠和 TCP UDP 关键字(例如, EXPOSE 80/udp )。如果只指定端口号,默认是TCP。要使端口可用,需要在运行 docker run 命令时使用 -p --publish 选项发布端口:

admin@myhome:~$ docker run -p 8080:80 thedockerimagename:tag
2.2.4 ENTRYPOINT和CMD

ENTRYPOINT 命令指定容器启动时始终要运行的命令,它不能被传递给 docker run 命令的任何命令行选项覆盖。它用于将容器配置为可执行文件。例如,如果容器运行Web服务器,可以使用 ENTRYPOINT 命令指定启动Web服务器的命令:

ENTRYPOINT ["nginx", "-g", "daemon off;"]

CMD 命令用于指定从镜像启动容器时要运行的命令。如果希望容器在启动时可以接受不同的参数,可以使用 CMD 设置默认参数,这些参数在容器启动时可以被覆盖。例如:

ENTRYPOINT ["/usr/bin/python"]
CMD ["main.py","arg1","arg2"]

一般规则是,如果希望应用程序接受自定义参数,可以使用 ENTRYPOINT 启动进程,使用 CMD 传递参数。

2.2.5 RUN

RUN 命令用于在容器内部执行命令,每次执行时会在镜像中创建一个新层。它用于安装软件包、创建目录、设置环境变量等。例如,安装软件包:

RUN apt - get update && apt - get install - y python3 python3 - dev

创建目录:

RUN mkdir /var/www

通过掌握这些Docker基础命令和Dockerfile的使用方法,你可以更高效地管理和构建Docker容器和镜像。

Docker基础与Dockerfile使用指南

3. Dockerfile命令综合示例

为了更好地理解和运用上述Dockerfile命令,下面给出一个完整的Dockerfile示例,该示例将构建一个简单的Python Flask应用镜像。

# 基于Python 3.9官方镜像作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到工作目录
COPY . /app

# 安装应用依赖
RUN pip install --no-cache-dir -r requirements.txt

# 暴露Flask应用默认端口
EXPOSE 5000

# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0

# 设置启动命令
CMD ["flask", "run"]

以下是对这个Dockerfile的详细解释:
1. FROM :指定基础镜像为Python 3.9的精简版,这是一个官方维护的镜像,包含了Python 3.9的运行环境。
2. WORKDIR :设置容器内的工作目录为 /app ,后续的操作都将在这个目录下进行。
3. COPY :将主机当前目录下的所有文件复制到容器的 /app 目录中。
4. RUN :在容器内执行 pip install 命令,安装应用所需的依赖, --no-cache-dir 选项用于避免缓存,减少镜像大小。
5. EXPOSE :告知Docker容器将监听5000端口,这是Flask应用的默认端口。
6. ENV :设置两个环境变量, FLASK_APP 指定Flask应用的入口文件, FLASK_RUN_HOST 指定Flask应用监听的主机地址。
7. CMD :指定容器启动时执行的命令,即启动Flask应用。

4. 构建和运行基于Dockerfile的镜像

有了上述的Dockerfile,我们可以按照以下步骤构建和运行镜像:

4.1 构建镜像

在包含Dockerfile的目录下,执行以下命令来构建镜像:

docker build -t my-flask-app:latest .
  • -t 选项用于为镜像指定标签,这里将镜像命名为 my-flask-app ,标签为 latest
  • . 表示使用当前目录作为构建上下文。
4.2 运行容器

镜像构建完成后,可以使用以下命令运行容器:

docker run -p 5000:5000 my-flask-app:latest
  • -p 选项用于将主机的5000端口映射到容器的5000端口,这样就可以通过主机的5000端口访问容器内的Flask应用。
5. Docker镜像构建优化

在构建Docker镜像时,为了减少镜像大小、提高构建速度,可以采取以下优化策略:

5.1 减少镜像层

如前文所述,每个 RUN 命令都会创建一个新的镜像层,过多的镜像层会增加镜像大小。可以将多个 RUN 命令合并为一个,例如:

RUN apt-get update && apt-get install -y python3 python3-dev && rm -rf /var/lib/apt/lists/*

这样可以减少不必要的中间层,从而减小镜像大小。

5.2 使用多阶段构建

对于一些复杂的应用,可能需要在构建过程中安装一些构建工具,但这些工具在运行时并不需要。可以使用多阶段构建来解决这个问题,例如:

# 第一阶段:构建阶段
FROM python:3.9-slim as builder
WORKDIR /app
COPY . /app
RUN pip install --no-cache-dir -r requirements.txt

# 第二阶段:运行阶段
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /app /app
EXPOSE 5000
CMD ["flask", "run"]

在这个示例中,第一阶段使用一个较大的基础镜像来安装依赖,第二阶段使用一个较小的基础镜像,只复制运行所需的文件,从而减小最终镜像的大小。

5.3 清理不必要的文件

RUN 命令中,及时清理安装过程中产生的临时文件和缓存,例如:

RUN apt-get update && apt-get install -y some-package && apt-get clean && rm -rf /var/lib/apt/lists/*
6. Docker容器管理最佳实践

在使用Docker容器时,遵循以下最佳实践可以提高容器的安全性和性能:

6.1 最小化容器权限

Dockerfile 中使用 USER 命令指定非root用户来运行容器,避免容器以root权限运行带来的安全风险,例如:

RUN useradd -m myuser
USER myuser
6.2 合理使用资源限制

在运行容器时,可以使用 --memory --cpus 等选项来限制容器的内存和CPU使用,避免容器占用过多资源影响其他容器或主机的性能,例如:

docker run --memory=512m --cpus=0.5 my-container
6.3 定期清理容器和镜像

使用 docker rm docker rmi 命令定期清理不再使用的容器和镜像,释放磁盘空间,例如:

docker rm $(docker ps -aq -f status=exited)
docker rmi $(docker images -q -f dangling=true)
7. 总结

本文详细介绍了Docker的基础命令,包括容器的启动、停止、查看,镜像的拉取、推送、管理,网络和卷的操作等。同时,深入讲解了Dockerfile的结构和常用命令,通过一个完整的示例展示了如何使用Dockerfile构建和运行镜像。此外,还介绍了镜像构建优化和容器管理的最佳实践,希望这些内容能帮助你更好地使用Docker,提高开发和运维效率。

以下是一个简单的mermaid流程图,展示了使用Dockerfile构建和运行镜像的基本流程:

graph LR
    A[编写Dockerfile] --> B[构建镜像]
    B --> C[运行容器]
    C --> D[使用应用]

通过掌握这些知识和技巧,你可以更加熟练地运用Docker来管理和部署应用,为开发和运维工作带来便利。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值