Docker
本文最后更新于 2025-02-11,墨迹未干时,知识正鲜活。随着时间推移,文章部分内容可能需要重新着墨,请您谅解。Contact
Docker教程:从安装到卸载
目录
什么是 Docker
AI解释:Docker 是一个开放平台,用于开发、传输和运行应用程序。它通过将应用程序及其依赖打包到一个可移植的容器中,确保应用程序能够在任何环境下一致运行。容器相比传统的虚拟机更加轻量、高效。
Docker安装
-
Windows: 下载 Docker Desktop 并按照安装向导进行安装。
-
macOS: 下载 Docker Desktop 并按照安装向导进行安装。
-
Linux: 根据不同发行版,使用包管理器安装 Docker。我主用Ubuntu和Debian系统,所以以 Ubuntu 为例:
sudo apt update sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docker
安装完成后,验证命令:
docker --version
一、基础命令
1. 查看 Docker 版本
docker --version
查看当前安装的 Docker 版本。
2. 拉取镜像
docker pull <镜像名>:<标签>
从 Docker Hub 或指定仓库拉取镜像。例如:
docker pull nginx:latest
常用标签示例:
latest
: 最新版本- 特定版本号,如
python:3.9
3. 列出本地镜像
docker images
查看本地存储的所有 Docker 镜像。
常用选项:
-a
或--all
: 显示所有镜像,包括中间镜像--filter
: 过滤结果,例如docker images --filter "dangling=true"
4. 运行容器
docker run [选项] <镜像名>:<标签>
创建并启动一个新的容器。例如运行一个交互式的 Ubuntu 容器:
docker run -it ubuntu:latest /bin/bash
常用选项:
-d
: 后台运行容器(detached 模式)-p <宿主机端口>:<容器端口>
: 端口映射--name <容器名称>
: 指定容器名称-v <宿主机路径>:<容器路径>
: 绑定挂载卷--rm
: 容器停止后自动删除
示例:
docker run -d --name mynginx -p 8080:80 nginx:latest
5. 停止容器
docker stop <容器ID或名称>
停止正在运行的容器。
6. 启动已停止的容器
docker start <容器ID或名称>
启动一个已停止的容器。
7. 删除容器
docker rm <容器ID或名称>
删除一个或多个容器。注意:容器必须先停止才能删除。
常用选项:
-f
或--force
: 强制删除运行中的容器-v
: 删除与容器关联的卷
示例:
docker rm -f mynginx
8. 删除镜像
docker rmi <镜像名>:<标签>
删除一个或多个镜像。
常用选项:
-f
或--force
: 强制删除镜像-no-prune
: 不删除父镜像
示例:
docker rmi nginx:latest
二、中级命令
1. 列出正在运行的容器
docker ps
查看当前正在运行的容器。
常用选项:
-a
或--all
: 查看所有容器,包括已停止的-q
或--quiet
: 仅显示容器ID--filter
: 过滤结果,例如docker ps --filter "status=exited"
2. 查看容器日志
docker logs <容器ID或名称>
查看指定容器的日志输出。
常用选项:
-f
或--follow
: 实时跟随日志--tail <行数>
: 显示最后的行数-t
: 显示时间戳
示例:
docker logs -f --tail 100 mynginx
3. 进入运行中的容器
docker exec -it <容器ID或名称> /bin/bash
以交互模式进入容器内部。
常用选项:
-d
或--detach
: 后台运行命令-u <用户>
: 以指定用户身份运行
示例:
docker exec -it mynginx /bin/bash
4. 构建镜像
docker build -t <镜像名>:<标签> <Dockerfile所在目录>
根据 Dockerfile
构建一个新的镜像。例如:
docker build -t myapp:latest .
常用选项:
-f <Dockerfile路径>
: 指定 Dockerfile 文件--no-cache
: 禁用缓存--build-arg <变量>=<值>
: 传递构建参数
示例:
docker build -t myapp:1.0 -f Dockerfile.prod .
5. 标记镜像
docker tag <源镜像> <目标镜像>
为镜像添加新标签。
示例:
docker tag myapp:latest myrepo/myapp:v1.0
6. 推送镜像到仓库
docker push <仓库地址>/<镜像名>:<标签>
将本地镜像推送到远程仓库。
前提:需要先登录到目标仓库。
docker login <仓库地址>
示例:
docker push myrepo/myapp:v1.0
7. 查看容器的资源使用情况
docker stats
实时查看各容器的 CPU、内存等资源使用情况。
常用选项:
--no-stream
: 仅显示一次--format
: 自定义输出格式
8. 复制文件到容器
docker cp <本地路径> <容器ID或名称>:<容器内路径>
将本地文件或目录复制到容器内。
示例:
docker cp ./config.json mynginx:/etc/nginx/conf.d/
9. 从容器复制文件
docker cp <容器ID或名称>:<容器内路径> <本地路径>
将容器内的文件或目录复制到本地。
示例:
docker cp mynginx:/var/log/nginx/access.log ./access.log
三、高级命令
1. 管理数据卷
数据卷用于持久化容器的数据。
-
创建数据卷:
docker volume create <卷名>
示例:
docker volume create mydata
-
列出数据卷:
docker volume ls
-
查看数据卷详细信息:
docker volume inspect <卷名>
-
删除数据卷:
docker volume rm <卷名>
注意:卷不能被使用中时才能删除。
-
清理未使用的卷:
docker volume prune
2. 网络管理
Docker 提供多种网络驱动,支持容器间的通信。
-
创建自定义网络:
docker network create <网络名>
常用网络驱动:
bridge
: 默认桥接网络host
: 容器使用宿主机网络overlay
: 用于 Swarm 集群中的跨主机网络macvlan
: 允许将容器分配到真实网络
示例:
docker network create mynetwork
-
查看网络列表:
docker network ls
-
查看网络详细信息:
docker network inspect <网络名>
-
删除网络:
docker network rm <网络名>
-
连接容器到网络:
docker network connect <网络名> <容器名>
-
断开容器与网络的连接:
docker network disconnect <网络名> <容器名>
3. Docker Compose
Docker Compose 用于定义和管理多容器的 Docker 应用,通过 docker-compose.yml
文件进行配置。
-
安装 Docker Compose:
对于较新的 Docker 版本,Docker Compose 已集成。如需单独安装,请参考官方文档。
-
编写
docker-compose.yml
:示例:
version: '3' services: web: image: nginx:latest ports: - "8080:80" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example
-
启动服务:
docker-compose up
-
在后台运行服务:
docker-compose up -d
-
停止服务:
docker-compose down
-
构建服务:
docker-compose build
-
查看服务状态:
docker-compose ps
-
查看服务日志:
docker-compose logs docker-compose logs -f # 实时跟随
4. Docker Swarm
Docker Swarm 是 Docker 提供的原生集群管理和容器编排工具。
-
初始化 Swarm:
docker swarm init
-
添加节点到 Swarm:
在管理节点执行:
docker swarm join-token worker
获取加入令牌后,在其他主机上执行:
docker swarm join --token <token> <manager-ip>:<port>
-
查看 Swarm 节点:
docker node ls
-
部署服务到 Swarm:
docker service create --name <服务名> <镜像名>
示例:
docker service create --replicas 3 --name myweb nginx:latest
-
查看服务:
docker service ls docker service ps <服务名>
-
更新服务:
docker service update <选项> <服务名>
示例:更新镜像版本
docker service update --image nginx:1.19 myweb
-
删除服务:
docker service rm <服务名>
5. 多阶段构建
多阶段构建可用于优化镜像大小,通过在 Dockerfile
中使用多个 FROM
指令。
示例:
# 第一阶段:构建应用
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 第二阶段:运行应用
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/myapp
CMD ["myapp"]
构建镜像:
docker build -t myapp:latest .
6. 使用 Secret 和 Config
在 Swarm 模式下,管理敏感信息(如密码、密钥)和配置文件。
-
创建 secret:
echo "my_password" | docker secret create my_password -
-
查看 secrets:
docker secret ls
-
在服务中使用 secret:
在
docker-compose.yml
中指定 secrets。示例:
version: '3.7' services: db: image: mysql:5.7 secrets: - db_password secrets: db_password: external: true
-
创建 config:
docker config create my_config ./config_file.conf
-
查看 configs:
docker config ls
7. 性能优化与调试
-
查看镜像层次结构:
docker history <镜像名>:<标签>
-
分析镜像大小:
使用工具如 Dive 进行镜像分析。
安装并使用:
dive <镜像名>:<标签>
-
容器资源限制:
运行容器时设置 CPU 和内存限制:
docker run -m 512m --cpus=1.0 <镜像名>
选项解释:
-m
或--memory
: 设置内存限制--cpus
: 设置 CPU 限制
-
监控容器性能:
使用
docker stats
实时监控,或集成 Prometheus 等监控工具。 -
调试容器:
-
使用
docker inspect
查看容器详细信息:docker inspect <容器ID或名称>
-
使用
docker events
监听 Docker 守护进程事件:docker events
-
使用
docker top
查看容器内的进程:docker top <容器ID或名称>
-
四、进阶命令与概念
1. 插件管理
Docker 支持多种插件(如网络插件、存储插件等),用于扩展其功能。
-
安装插件:
docker plugin install <插件名>
示例:
docker plugin install vieux/sshfs
-
列出已安装插件:
docker plugin ls
-
启用插件:
docker plugin enable <插件名>
-
禁用插件:
docker plugin disable <插件名>
-
删除插件:
docker plugin rm <插件名>
2. 镜像仓库管理
使用私有仓库存储和管理企业内部镜像。
-
部署私有仓库:
docker run -d -p 5000:5000 --name registry registry:2
访问镜像仓库:
localhost:5000
-
推送镜像到私有仓库:
为镜像打标签:
docker tag myimage localhost:5000/myimage docker push localhost:5000/myimage
-
从私有仓库拉取镜像:
docker pull localhost:5000/myimage
-
配置镜像仓库为不安全(仅用于测试):
修改 Docker 守护进程配置文件(如
/etc/docker/daemon.json
):{ "insecure-registries" : ["localhost:5000"] }
重启 Docker 服务:
sudo systemctl restart docker
3. 安全性管理
确保 Docker 环境和容器的安全性是至关重要的。
-
扫描镜像漏洞:
使用工具如 Trivy 来扫描镜像中的漏洞。
安装 Trivy 并扫描镜像:
trivy image <镜像名>:<标签>
示例:
trivy image nginx:latest
-
用户命名空间:
配置 Docker 使用用户命名空间隔离容器权限,提高安全性。
配置步骤:
-
编辑 Docker 守护进程配置文件
/etc/docker/daemon.json
:{ "userns-remap": "default" }
-
创建用户映射文件
/etc/subuid
和/etc/subgid
,添加如下内容:docker:100000:65536
-
重启 Docker 服务:
sudo systemctl restart docker
-
-
限制容器权限:
使用
--cap-drop
和--cap-add
限制容器的 Linux 能力。示例:运行时移除所有能力,仅保留基本能力:
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx:latest
-
只读文件系统:
运行容器时设置文件系统为只读:
docker run --read-only <镜像名>
-
使用 AppArmor 或 SELinux:
配置 Docker 与安全模块集成,进一步限制容器行为。
4. 自动化与 CI/CD 集成
将 Docker 命令集成到持续集成和持续部署流程中,如使用 Jenkins、GitLab CI、GitHub Actions 等工具自动构建和部署镜像。
-
示例:GitLab CI 配置
在
.gitlab-ci.yml
中添加 Docker 构建与推送任务:stages: - build - push build_image: stage: build script: - docker build -t myrepo/myapp:$CI_COMMIT_SHA . tags: - docker push_image: stage: push script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker push myrepo/myapp:$CI_COMMIT_SHA only: - master
-
示例:GitHub Actions 配置
创建
.github/workflows/docker.yml
:name: CI on: push: branches: [ master ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push uses: docker/build-push-action@v2 with: push: true tags: user/app:latest
五、实用技巧
1. 清理未使用的资源
docker system prune
清理未使用的容器、网络、镜像和缓存数据。
常用选项:
-a
: 删除所有未使用的镜像(非悬空镜像)--volumes
: 同时删除未使用的数据卷
示例:
docker system prune -a --volumes
2. 导出和导入镜像
-
导出镜像为 tar 文件:
docker save -o myimage.tar <镜像名>:<标签>
示例:
docker save -o nginx_latest.tar nginx:latest
-
从 tar 文件导入镜像:
docker load -i myimage.tar
示例:
docker load -i nginx_latest.tar
-
导出容器为 tar 文件(仅文件系统,无历史记录):
docker export -o mycontainer.tar <容器ID或名称>
-
从 tar 文件导入容器为镜像:
cat mycontainer.tar | docker import - mynewimage:latest
3. 备份和恢复容器数据
-
使用
docker commit
将容器的当前状态保存为新镜像:docker commit <容器ID或名称> <新镜像名>:<标签>
示例:
docker commit mynginx mynginx_backup:latest
-
备份数据卷:
-
启动一个临时容器,将数据卷挂载到宿主机路径。
docker run --rm -v mydata:/data -v $(pwd):/backup busybox tar cvf /backup/mydata_backup.tar /data
-
恢复数据卷:
docker run --rm -v mydata:/data -v $(pwd):/backup busybox tar xvf /backup/mydata_backup.tar -C /data
-
4. 使用标签管理镜像版本
合理使用标签管理镜像版本,避免混淆和覆盖。
-
列出所有标签的镜像:
docker images --all
-
使用语义版本:
避免使用
latest
标签,采用明确的版本号,如v1.0
,v2.1.3
。
5. 利用 Docker Hub 和其他公共仓库
-
搜索镜像:
docker search <关键词>
示例:
docker search redis
-
查看镜像详情:
在浏览器中访问 Docker Hub 并搜索相关镜像,查看文档和使用说明。
6. 使用 Aliyun Docker Registry 加速器(中国用户)
由于网络限制,Docker Hub 在中国的访问速度较慢。您可以配置阿里云 Docker 加速器以提升速度。
-
获取加速器地址:
登录阿里云控制台,找到容器镜像服务,获取加速器的URL,例如
https://<your-region>.mirror.aliyuncs.com
-
配置 Docker 守护进程:
编辑
/etc/docker/daemon.json
:{ "registry-mirrors": ["https://<your-region>.mirror.aliyuncs.com"] }
-
重启 Docker:
sudo systemctl restart docker
六、最佳实践
1. 减少镜像层数
在 Dockerfile
中合并相关命令,减少镜像层数,有助于优化镜像大小和构建速度。
示例:
RUN apt-get update && apt-get install -y \
package1 \
package2 && \
rm -rf /var/lib/apt/lists/*
2. 使用 .dockerignore
文件
创建 .dockerignore
文件,排除不必要的文件和目录,减少上下文大小,加快构建速度。
示例:
node_modules
.git
*.log
3. 最小化基础镜像
选择合适的基础镜像,尽量使用体积小、安全性高的镜像,如 alpine
,避免使用不必要的软件包。
示例:
FROM alpine:3.14
4. 定期更新镜像
保持镜像和依赖的更新,及时应用安全补丁,避免使用过时的组件。
5. 分层缓存优化
合理利用 Docker 分层缓存机制,将变化频率高的指令放在后面,减少无效的重建。
示例:
# 安装依赖
COPY package.json .
RUN npm install
# 复制应用代码
COPY . .
6. 避免在容器内存储重要数据
使用数据卷或外部存储,确保数据的持久性和安全性。
7. 使用多用户模式
在容器内使用非 root 用户,增强安全性。
示例:
FROM ubuntu:latest
RUN useradd -m myuser
USER myuser
8. 定期扫描镜像漏洞
使用工具如 Trivy、Clair 等定期扫描镜像中的漏洞,及时修复。
结语
想学好docker,还有后面的k8s,多看看官方文档,多尝试些开源项目对学习大有裨益。
官方文档:Docker Documentation