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来管理和部署应用,为开发和运维工作带来便利。

3999

被折叠的 条评论
为什么被折叠?



