云安全
云安全概述
阿里云概述
亚马逊AWS概述
云计算导论
云计算概述
云计算的关键技术
虚拟化
分布式文件系统
云存储
数据处理
并行计算
OpenStack
容器
Kubernetes概述
Serverless
Hadoop
云原生
云数据中心
微服务
对象存储OSS
云存储
对象存储
对象文件(Object)
存储桶(存储空间)
通过外网访问OSS
存储桶漏洞
STS访问OSS
权限与访问控制
访问控制
Bucket&RAM Policy
预签名
Docker
01docker概述
02docker安装
03目录结构
04基础操作
05底层原理【理论】
06底层原理【实践】
07DockerFile
08容器反查Dockerfile
09Docker 逃逸
-
+
首页
04基础操作
官方文档:https://docs.docker.com/engine/containers/run/ ## 搜索镜像 > 搜索Docker Hub中的镜像 一常用命令格式: ```bash docker search <搜索的关键词> ```  为什么会这样呢?因为刚才所更换的源是拉取镜像时所用的镜像站,要搜索默认还是会去docker官方站站点搜索。 对搜索结果进项筛选的常用命令: ```bash # 搜索并限制结果数量 docker search --limit 5 <关键词> # 搜索官方镜像 docker search --filter is-official=true <关键词> # 搜索自动构建的镜像 docker search --filter is-automated=true <关键词> # 搜索星数超过指定数量的镜像 docker search --filter stars=100 <关键词> ``` ```bash $ docker search tomcat NAME DESCRIPTION STARS OFFICIAL AUTOMATED tomcat Apache Tomcat is an open source implementati… 2934 [OK] tomee Apache TomEE is an all-Apache Java EE certif… 86 [OK] dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 55 [OK] bitnami/tomcat Bitnami Tomcat Docker Image 37 [OK] kubeguide/tomcat-app Tomcat image for Chapter 1 29 consol/tomcat-7.0 Tomcat 7.0.57, 8080, "admin/admin" 18 [OK] cloudesire/tomcat Tomcat server, 6/7/8 15 [OK] aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 13 [OK] arm32v7/tomcat Apache Tomcat is an open source implementati… 10 rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 6 [OK] unidata/tomcat-docker Security-hardened Tomcat Docker container. 5 [OK] arm64v8/tomcat Apache Tomcat is an open source implementati… 3 fabric8/tomcat-8 Fabric8 Tomcat 8 Image 2 [OK] amd64/tomcat Apache Tomcat is an open source implementati… 2 jelastic/tomcat An image of the Tomcat Java application serv… 2 cfje/tomcat-resource Tomcat Concourse Resource 2 chenyufeng/tomcat-centos tomcat基于centos6的镜像 1 [OK] picoded/tomcat7 tomcat7 with jre8 and MANAGER_USER / MANAGER… 1 [OK] camptocamp/tomcat-logback Docker image for tomcat with logback integra… 1 [OK] oobsri/tomcat8 Testing CI Jobs with different names. 1 ppc64le/tomcat Apache Tomcat is an open source implementati… 1 99taxis/tomcat7 Tomcat7 1 [OK] secoresearch/tomcat-varnish Tomcat and Varnish 5.0 0 [OK] s390x/tomcat Apache Tomcat is an open source implementati… 0 softwareplant/tomcat Tomcat images for jira-cloud testing 0 [OK] # NAME:镜像名称 # DESCPRIPTION:镜像描述 # STARS:用户评价,反应一个镜像的受欢迎程度 # OFFICIAL:是否为官方构建 # AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的 ``` ## 下载镜像 例如:下载 mysql数据库的8.0版本。 > 拉取镜像 常用命令格式(): 如果不申明tag镜像标签信息则默认拉取lastest版本。 ```bash # 拉取镜像(默认最新标签) docker pull <镜像名> # 拉取指定标签的镜像 docker pull <镜像名:标签> # 拉取所有平台的镜像 docker pull --platform linux/amd64 <镜像名:标签> # 拉取时禁用内容信任 docker pull --disable-content-trust <镜像名:标签> # 拉取所有标签的镜像 docker pull -a <镜像名> ``` > 拉取mysql 8.0版本的镜像  ## 查看本地镜像 列出本地镜像: ```bash #列出所有镜像 docker images docker image ls # 列出所有镜像(包括中间层镜像) docker images -a docker image ls -a # 按时间排序 docker images --sort=time # 按大小排序 docker images --sort=size ``` ```bash root@ubuntu:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0 94753e67a0a9 3 weeks ago 780MB root@ubuntu:~# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0 94753e67a0a9 3 weeks ago 780MB root@ubuntu:~# ``` 顶层镜像(top-level images),即用户主动拉取、构建或标记的镜像(通常是我们实际使用的镜像)。 中间层镜像(intermediate images),是 Docker 构建镜像时自动生成的临时层(由 Dockerfile 中的 RUN、COPY 等指令产生),用于缓存构建过程,加速后续构建。它们通常没有标签(或标签为 \<none>),且仅被其他镜像(顶层镜像)依赖,用户一般不需要直接操作。 > image命令 ```bash root@ubuntu:~# docker image Usage: docker image COMMAND Manage images Commands: build Build an image from a Dockerfile history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Display detailed information on one or more images load Load an image from a tar archive or STDIN ls List images prune Remove unused images pull Download an image from a registry push Upload an image to a registry rm Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE ``` ## 容器的创建与启动 > 命令格式 ```txt docker run [参数] 镜像名称/镜像ID [命令] [参数...] ``` > 常用参数 | 参数 | 描述 | 示例 | | -------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | -d 或者 --detach | 让容器在后台运行(detached模式),不占用当前终端 | docker run -d nginx | | --name <容器名称> | 为启动的容器指定名称(默认自动生成随机名称) | docker run --name nginx -d nginx | | -rm | 容器停止后自动删除(适用于一次性脚本等情况) | docker run -rm ubuntu bash (进入bash后容器自动删除) | | -it | 进入交互式模式,用于需要手动操作的场景(i 输入模式,t 终端模式) | docker run -it ubuntu bash | | -p <主机端口>:<容器端口> | 端口映射 ,将主机的端口映射到容器内的端口 | docker run -p 8080:80 -d nginx | | -P 或者 --publish-all | 随机映射容器内所有暴露的端口(EXPOSE 声明的端口)到主机的随机端口(32768+),适合临时测试 | docker run -P -d nginx(随机映射 nginx 的 80 端口) | | -e <键=值>或者 --env | 向容器内设置环境变量(多个变量可多次使用 -e)。 | docker run -e MYSQL_ROOT_PASSWORD=123456 -d mysql(设置 mysql root 密码) | | -v <源>:<目标>或者<br />--volume | 挂载数据卷或本地目录到容器内的路径,格式:<br/>- 命名卷:卷名:容器内路径(推荐,Docker 自动管理卷存储)<br/>- 本地目录:主机目录:容器内路径(需确保主机目录存在)。 | 1. 挂载命名卷:docker run -v mysql_data:/var/lib/mysql -d mysql(数据存到 mysql_data 卷)<br/>2. 挂载本地目录:docker run -v /opt/nginx/html:/usr/share/nginx/html -d nginx(主机目录映射到 nginx 静态文件目录) | | --restart <策略> | 设置容器重启策略(生产环境常用,确保容器故障后自动恢复)<br />策略包括:<br/>no(默认,不重启)、always(总是重启)、on-failure[:次数](失败时重启,可指定次数)、unless-stopped(除非手动停止,否则总是重启)。 | docker run --restart always -d nginx(nginx 故障后自动重启) | > exec命令 用于在**运行中的容器**内部执行命令: ```bash docker exec [选项] 容器名称 命令 [参数...] ``` ```bash # 交互式终端(最常用) docker exec -it 容器名 bash docker exec -it 容器名 sh # 分配伪终端 docker exec -t 容器名 top # 保持标准输入打开 docker exec -i 容器名 cat # 指定执行用户 docker exec -u root 容器名 whoami docker exec -u 1000:1000 容器名 id # 设置环境变量 docker exec -e VAR1=value1 -e VAR2=value2 容器名 env # 使用容器原有的环境变量 docker exec -e LANG=C.UTF-8 容器名 locale ``` | 命令 | 作用对象 | 使用场景 | | ----------- | ---------------- | -------------------- | | docker run | **镜像** | 创建新容器 | | docker exec | **运行中的容器** | 在已有容器内执行命令 | > 启动MySQL容器 ```bash root@ubuntu:~# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0 94753e67a0a9 3 weeks ago 780MB root@ubuntu:~# docker run 94753e67a0a9 2025-10-17 09:04:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.43-1.el9 started. 2025-10-17 09:04:00+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2025-10-17 09:04:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.43-1.el9 started. 2025-10-17 09:04:00+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified You need to specify one of the following as an environment variable: - MYSQL_ROOT_PASSWORD - MYSQL_ALLOW_EMPTY_PASSWORD - MYSQL_RANDOM_ROOT_PASSWORD root@ubuntu:~# docker run -d --name mysql80 -P -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 a1661733a9cab6b9819b53f7eba93e1db246690e44439ab192411d2006d37f26 ``` > 文件拷贝 ```bash # 如果我们需要将文件拷贝到容器内可以使用cp命令 ## docker cp 需要拷贝的文件目录 容器名称:容器目录 docker cp echo-ls mycentos:/etc/echo-ls [root@0e63b59c5aa9 /]# cat /etc/echo-ls anaconda-ks.cfg echo-ls # 也可以将文件从容器内拷贝出来 ## docker cp 容器名称:容器目录 需要拷贝的文件目录 docker cp mycentos:/docker-ls ~/docker-ls [root@localhost ~]# cat docker-ls anaconda-post.log bin dev ...... ``` > 目录挂载 在创建容器的时候,可以将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器,并且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。 但是容器被删除的时候,宿主机的内容并不会被删除,如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。 容器与宿主机之间的数据卷属于引用的关系,数据卷是从外界挂载到容器内部中的,所以可以脱离容器的生命周期而独立存在,正是由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除以后,数据卷仍然不会受到影响,数据卷的生命周期会一直持续到没有容器使用它为止。 ```bash # 创建容量添加 -v 参数,格式为“宿主机目:容器目录”,若容器目录不存在则自动创建,例如: [root@localhost ~]#docker run -id -v /var/docker/:/etc/docker --name mycentos centos:7 fb9cd00cae0a8dce03f94d0802328ff12961984295ae55f24e15feaccaed60fa [root@localhost ~]#docker exec -it mycentos /bin/bash [root@fb9cd00cae0a /]# ls /etc/ DIR_COLORS docker issue openldap rc2.d subgid # 通过查看容器的配置文件可以查看到挂载的源地址 [root@localhost ~]#docker inspect mycentos | grep Mounts -A 5 "Mounts": [ { "Type": "bind", "Source": "/var/docker", "Destination": "/etc/docker", # volume-from挂载继承:将mycentos_two的挂载关系继承到mycentos中。 # 简单来讲就是两者的docker容器共享一个挂载目录 docker run -di --name mycentos --volume-from mycentos_two centos:7 ``` > 匿名挂载 匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volumes 中生成。 ```bash # 创建一个匿名挂载目录通过-v的方式不需要指定宿主机的目录即可 $ docker run -id -v /etc/docker_test --name mycentos centos:7 48ea0a97a1997d8116064c7a2aa36f451186b4e927ae43791006ae6429c5bc1c # 进入到volumes的目录下就会查看到对应容器的匿名文件夹 $ cd /var/lib/docker/volumes/ $ ls backingFsBlockDev c44f7aff34c05ff57fa9a129649e3fd4fda7b773ed63b8ecc5ad7bca2131bed4 metadata.db $ cd c44f7aff34c05ff57fa9a129649e3fd4fda7b773ed63b8ecc5ad7bca2131bed4/ # 需要进入到_data目录下 $ ls _data $ cd _data # 在docker中创建文件后,宿主机的volumes对应容器的目录下就会有该文件 $ docker exec -it mycentos /bin/bash [root@48ea0a97a199 /]# cd /etc/docker_test/ [root@48ea0a97a199 docker_test]# touch test.txt # 在宿住机中查看 [root@localhost _data]# ls test.txt # 若容器过多,通过inspect配置文件中的volume项可以快速定位到匿名目录的名字 $ docker inspect mycentos | grep volume "Type": "volume", "Source": "/var/lib/docker/volumes/c44f7aff34c05ff57fa9a129649e3fd4fda7b773ed63b8ecc5ad7bca2131bed4/_data", # 直接复制Source中的内容 $ cd /var/lib/docker/volumes/c44f7aff34c05ff57fa9a129649e3fd4fda7b773ed63b8ecc5ad7bca2131bed4/_data" ``` > 提示:docker inspect docker inspect 是一个用于获取 Docker 对象(容器、镜像、网络、卷等)详细底层信息的命令。 ```bash docker inspect [对象名称或ID] ``` ```bash # 查看容器所有信息 docker inspect 容器名或ID # 示例 docker inspect my-nginx # 查看镜像所有信息 docker inspect 镜像名:标签 # 示例 docker inspect nginx:latest docker inspect ubuntu:20.04 # 查看容器的IP地址 docker inspect -f '{{.NetworkSettings.IPAddress}}' 容器名 # 查看容器的状态 docker inspect -f '{{.State.Status}}' 容器名 # 查看容器的启动命令 docker inspect -f '{{.Config.Cmd}}' 容器名 # 查看镜像的大小 docker inspect -f '{{.Size}}' 镜像名 ``` > 具名挂载 所谓的具名挂载就是docker容器数据的目录名字并不是随机的,可以通过手动指定。 ```bash $ docker run -id -v mycentos_docker:/etc/docker_test --name mycentos centos:7 e02e21d85570ff82b698f3ab73fc71179b6fa9ded167b5b4c1f0a83b88a39df3 $ docker inspect mycentos | grep volumes "Source": "/var/lib/docker/volumes/mycentos_docker/_data", $ ls /var/lib/docker/volumes/ backingFsBlockDev c44f7aff34c05ff57fa9a129649e3fd4fda7b773ed63b8ecc5ad7bca2131bed4 metadata.db mycentos_docker ``` > 挂载只读 ```bash $ docker run -id -v /etc/docker/:/readonly:ro --name mycentos centos:7 0dcd031349ad88a9b5231e310ac859695582752d3ee2944fde7b05c03460c7e1 $ docker exec -it mycentos /bin/bash [root@0dcd031349ad /]# cd readonly/ [root@0dcd031349ad readonly]# touch 1.txt touch: cannot touch '1.txt': Read-only file system # 如果是ro则表示只读,docker容器没有写入权限。 # 如果是rw则表示可读可写 ``` ## 容器的查看 查看容器 ```bash # 查看正在运行的容器 docker ps 或者 docker ps -all # 查看所用的容器(包括已经停止的容器) docker ps -a #只显示容器ID docker ps q #显示总文件大小 docker ps -s ```  ## 容器的停止 ```bash #停止容器 docker stop 容器的ID或者容器的标签或者容器的名称 # 停止所有运行中的容器 docker stop $(docker ps -q) ```  ## 容器的删除 ```bash # 删除单个容器 docker rm 容器名或容器ID # 删除所有已停止的容器 docker rm $(docker ps -a -q --filter "status=exited") ```  > 常用容器删除参数 | 参数 | 说明 | 示例 | | ------------- | -------------------- | ------------------ | | -f, --force | 强制删除运行中的容器 | docker rm -f nginx | | -v, --volumes | 同时删除关联的匿名卷 | docker rm -v mysql | | -l, --link | 删除指定的链接 | docker rm -l web | ## 导出镜像 容器是动态的运行实例,无法直接保存为 tar,需先通过 docker commit 命令将容器的当前状态 “固化” 为一个新的镜像(类似 “快照”): ```txt docker commit [容器ID或名称] [新镜像名:标签] ``` ```bash docker commit abc123456789 my-ubuntu:v1 ``` ```bash # 将镜像保存为 tar 文件 docker save <镜像名:标签> -o <文件名.tar> # 导出所有镜像 docker save $(docker images -q) -o all_images.tar ```  ## 导入镜像 ```bash # 从 tar 文件加载镜像 docker load -i <文件名.tar> # 从标准输入加载 cat <文件名.tar> | docker load ```  ## 删除镜像 ```bash # 通过镜像名:标签删除 docker rmi 镜像名:标签 # 通过镜像ID删除 docker rmi 镜像ID # 强制删除(即使有容器使用) docker rmi -f 镜像名或ID # 删除所有镜像 docker rmi -f $(docker images -q) ```  > 删除镜像常用参数 | 参数 | 说明 | 示例 | | ----------- | -------------------- | --------------------------- | | -f, --force | 强制删除 | docker rmi -f nginx | | --no-prune | 不删除未标记的父镜像 | docker rmi --no-prune image | ## 构建镜像 构建镜像是将应用及其依赖、运行环境等通过标准化流程打包成可分发、可运行的镜像文件的过程。 > 概念 镜像(Image):是一个只读的分层文件系统,包含运行应用所需的代码、依赖、库、环境变量和配置文件。可理解为 “静态模板”,容器是镜像的 “动态实例”。 构建(Build):通过 docker build 命令解析 Dockerfile 中的指令,将指令转化为镜像的分层文件系统的过程。本质是 “代码化定义环境,自动化生成模板”。 > 核心要素 构建镜像需三个关键要素,缺一不可: - Dockerfile:包含构建指令的文本文件。 - 构建上下文(Build Context):docker build 命令指定的目录(或 URL),包含 Dockerfile 及 COPY/ADD 指令所需的文件(如应用代码、配置文件)。 - Docker 引擎:执行 docker build 命令的 Docker 守护进程(daemon),负责解析指令、分层构建并生成镜像。 > 构建镜像的完整流程 1、准备材料:编写dockerfile文件、整理构建上下文(将应用代码、依赖文件等放入一个目录)。 2、执行构建命令: ```bash docker build [选项] 构建上下文路径 ``` 常用参数: ```txt -t、--tag: 为构建的镜像指定标签 docker build -t <镜像名>:<标签> ... -f, --file: 指定 Dockerfile 的路径(默认使用构建上下文目录中的 Dockerfile),适合 Dockerfile 不在默认位置或有多个 Dockerfile docker build -f <Dockerfile路径> ... --build-arg: 传递构建时变量(需在 Dockerfile 中用 ARG 声明),用于动态定制构建过程(如版本号、依赖地址等)。 # 传递 APP_VERSION=2.0 给 Dockerfile docker build --build-arg APP_VERSION=2.0 -t myapp:v2 . ``` 3、客户端打包并发生上下文: - Docker 客户端(如终端)扫描构建上下文目录,按 .dockerignore 排除文件后,将剩余文件打包成 tar 包。 - 客户端将 tar 包发送给 Docker 守护进程(daemon),守护进程解压后作为构建的 “数据源”。 4、守护进程解析并执行Dockerfile指令。 守护进程按 Dockerfile 指令顺序执行,每步生成一个中间镜像层(Layer): - 基础层:从 FROM 指令指定的基础镜像开始(如 ubuntu:22.04 本身就是一个多层镜像)。 - 指令执行:逐条执行 RUN(执行命令)、COPY(复制文件)等指令,每执行完一条,就对当前容器状态 “提交” 为一个新的中间层(只读)。 - 最终层:所有指令执行完成后,最后一个中间层被标记为目标镜像(即 -t 指定的标签)。 5、缓存机制生效(加速构建) Docker 会对每个中间层生成唯一哈希值(基于指令内容和输入文件),并缓存中间层: - 若某条指令及之前的所有指令未变化,且输入文件(如 COPY 的文件)未修改,直接复用缓存的中间层,跳过执行。 - 若某条指令变化(如 RUN 命令修改)或输入文件变化,该指令及后续所有指令的缓存失效,需重新执行。 6、生成最终的镜像:所有指令执行完成后,守护进程将所有中间层 “逻辑合并”(物理上仍分层存储),生成最终镜像。此时可通过 docker images 查看镜像。
毛林
2025年10月21日 20:12
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码