一、操作镜像
1. 查找镜像
在 Docker Hub 中查找符合名字的镜像(通常需要魔法上网),常规用法:docker search 镜像名,如果想使用更多参数可以通过 docker search --help 查看。
以 nginx 为例,通过 docker search nginx 可以在 Docker Hub 中找到所有名字里包含 nginx 的镜像,查询结果的结构大概为:
- NAME:镜像名称
- DESCRIPTION:镜像描述
- STARS:镜像受欢迎程度
- OFFICIAL:是否为官方镜像
通过这种方式虽然可以找到镜像,但是不能查找镜像的具体版本,想使用镜像的最新版本通过这种方式查询是可以的,如果想使用指定的镜像版本,还是需要登录 Docker Hub 官网 查看(同样需要魔法上网)。
2. 拉取镜像
从 Docker Hub 中拉取镜像到本地(最好魔法上网,国内镜像仓库都不太好用),常规用法 docker pull 镜像名[:版本号],如果想使用更多参数可以通过 docker pull --help 查看。
如果不指定版本号,默认下载 latest 版本(最新版),以 nginx 为例,通过 docker pull nginx 会下载最新版,指定版本的话为:docker pull nginx:1.29.1
3. 查看本地镜像列表
列出已下载到本地的所有镜像,常规用法 docker images,如果想使用更多参数可以通过 docker images --help 查看。
执行结果的结构大概为:
- REPOSITORY:镜像名
- TAG:版本
- IMAGE ID:镜像ID
- CREATED:镜像发布时间
- SIZE:镜像大小
4. 删除本地镜像
常规用法 docker rmi -f 镜像名:版本号,如果想使用更多参数可以通过 docker rmi --help 查看。以 nginx 为例,通过 docker rmi -f nginx:1.29.1 删除。
另外,删除所有镜像的简便写法为 docker rmi -f $(docker images -a -q)
5. 将本地镜像以压缩包形式存储
可以将已经下载好的本地镜像,以压缩包的形式保存到本地磁盘,以便发送给其他人引用。常规用法 docker save -o /存储路径/文件名.tar|zip 镜像名:版本号,如果想使用更多参数可以通过 docker save --help 查看
以 nginx 为例,可以通过 docker save -o /Users/ougaii/dev-tools/nginx.zip nginx:1.29.1 将 nginx 镜像保存到本地。
6. 将压缩包格式的镜像导入到 Docker
常规用法 docker load -i 文件路径,如果想使用更多参数可以通过 docker load --help 查看。
以存储在本地 Users/ougaii/dev-tools/nginx.zip 的文件为例,可以通过 docker load -i /Users/ougaii/dev-tools/nginx.zip 导入
7. 查看镜像的构建层次
镜像是分层的,一个镜像的内部可能引用另一个镜像(一般称为基础镜像),想查看一个镜像的全部层次,可以使用这个命令。常规用法 docker history 镜像ID(前四位即可),如果想使用更多参数可以通过 docker history --help 查看。
以 nginx 为例,假设其镜像ID为 d5f28ef21aab,可以通过 docker history d5f2 查看 nginx 镜像的全部构建层次。执行结果的结构大概为:
- IMAGE:当前层次的镜像ID
- CREATED:当前层的镜像的构建时间
- CREATED BY:构建当前层镜像的 Dockerfile 中的指令
- SIZE:当前层占用的大小
- COMMENT:注释
8. 通过容器生成镜像
有的时候通过镜像创建容器后,我们会修改容器中的内容,让容器更满足我们的业务需求。为了实现复用,可以通过修改后的容器生成新的镜像后,我们就可以将这个新的镜像导出成压缩包,或上传到 Docker Hub。
常规用法 docker commit -a 作者名 -m "本层镜像的注释" 容器名或容器ID(容器ID只需要写四位即可) 自定义镜像名:自定义版本号,如果想使用更多参数可以通过 docker commit --help 查看。
假设本地有一个容器,容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker commit -a ougaii -m "change content" fcf3 new-ougaii-nginx:1.0 和 docker commit -a ougaii -m "change content" sweet_shockley new-ougaii-nginx:1.0 都可以生成名字为 new-ougaii-nginx,版本号为 1.0 的新镜像。
二、操作卷(数据外挂到宿主机)
1. 数据卷的作用
数据卷的作用就是把容器内的数据存储到宿主机上(也可以存储在云服务器或远程主机),就算容器被误删除了,数据仍然可以保留,算是一种数据的持久化方案。数据卷和容器的关系是一对多,一个数据卷可以被多个容器共享使用。
当把容器中的路径映射到数据卷时,称为数据卷中的一个挂载点,一个数据卷可以有很多挂载点。数据卷可以看作是宿主机中的一个根目录,每个挂载点就是一个子目录。
2. 创建数据卷
常用命令 docker volume create 自定义数据卷名,如果想使用更多参数可以通过 docker volume create --help 查看。假设创建一个名字为 test 的数据卷,命令为 docker volume create 自定义数据卷名
3. 查看本地数据卷
通过 docker volume ls 可以查看本地的所有数据卷,如果想使用更多参数可以通过 docker volume ls --help 查看。
命令执行后的结果结构大概如下:
- DRIVER:数据卷的存储方式,通常为 local 代表存储到宿主机
- VOLUME NAME:数据卷名称
想查看指定数据卷的详细信息,可以通过 docker volume inspect 数据卷名称 查看,如果想使用更多参数可以通过 docker volume inspect --help 查看。
命令执行后的结果是一个JSON格式的字符串,其结构大概如下:
- CreatedAt:数据卷的创建时间
- Driver:数据卷的存储方式,如 local 宿主机存储
- Labels:用户给数据卷设置的标签,可以用来组织、分类数据卷
- Mountpoint:数据卷在宿主机上的实际存储路径
- Name:数据卷名称
- Options:创建数据卷时指定的选项。对于 local 宿主机存储,这个字段通常为空。
- Scope:指定数据卷作用域范围是单节点Docker,还是集群Docker。
Mountpoint 这个属性要特别强调一下,因为 Docker 的运行需要依赖 Linux,所以当我们在 Windows 或者 Mac 中使用 Docker 时一般会有两种做法:
- 在系统中安装一个虚拟机,然后在虚拟机中安装 Linux 操作系统,最后在 Linux 操作系统中安装 Docker。
- 在系统中安装 Docker 官方的 Docker Desktop(本质就是一个帮我们预装好了 Linux 系统和 Docker 的虚拟机)。
因为 Docker 在 Windows 和 Mac 中,并不是直接安装在真实主机中,所以 Mountpoint 显示的数据卷存储路径,并不是我们真实主机中操作系统的存储路径,而是虚拟机中操作系统的路径。
4. 删除数据卷
常规用法 docker volume rm 数据卷名,如果想使用更多参数可以通过 docker volume rm --help 查看。
假设本地有数据卷名为 test,可以使用 docker volume rm test 删除数据卷。
三、操作网络
1. 网络的作用
在同一个 Docker 中,两个容器是不能直接访问的。假设 容器1 的内部想访问 容器2,我们需要在容器1 中通过 宿主机的IP:容器2的暴露端口 的方式才能访问,很麻烦,也很绕,而且 宿主机IP 还可能会变。
通常这种同一 Docker 中,容器互相访问的情况,我们都会创建一个网络,然后将两个容器加入到同一网络,这样同一网络中的容器可以直接通过 容器名:容器暴露端口 的方式访问,既方便,也不怕 宿主机IP 变化。
2. 创建网络
常用命令 docker network create 网络名,如果想使用更多参数可以通过 docker network create --help 查看。
假设创建一个名字为 test 的网络,命令为 docker network create test
3. 查看已有网络
列出当前 Docker 中的全部网络,常用命令 docker network ls,如果想使用更多参数可以通过 docker network ls --help 查看。
命令执行后的结果结构大概为:
- NETWORK ID:网络ID
- NAME:网络名
- DRIVER:网络的实现方式。默认是 bridge(桥接)
- SCOPE:指定网络的作用域范围是单节点Docker,还是集群Docker。
如果想查看指定网络的详细信息,比如网络中的容器等,可以通过 docker network inspect 网络名 的方式,如果想使用更多参数可以通过 docker network inspect --help 查看。
假设查看名字为 test 的网络,命令为 docker network inspect test
4. 将容器添加到网络
常用命令 docker network connect 网络名 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker network connect --help 查看。
假设想把一个容器ID为 fcf3650f5c4f 的容器加入到名为 test 的网络,可以通过 docker network connect test fcf3 实现。
5. 将容器移出网络
常用命令 docker network disconnect 网络名 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker network disconnect --help 查看。
假设想把一个容器ID为 fcf3650f5c4f 的容器从名为 test 的网络中移除,可以通过 docker network disconnect test fcf3 实现。
6. 删除网络
常用命令 docker network rm 网络名,如果想使用更多参数可以通过 docker network rm --help 查看。
假设想删除名为 test 的网络,可以通过 docker network rm test 实现。
四、操作容器
1. 查看本地已有容器
查看正在运行的容器:docker ps,查看全部容器 docker ps -a,如果想使用更多参数可以通过 docker ps --help 查看。
执行结果的结构大概为:
- CONTAINER ID:容器ID
- IMAGE:创建容器的镜像,格式为:镜像名:版本号
- COMMAND:容器启动时要执行的命令,对应制作 Dockerfile 镜像文件时的 CMD 和 ENTRYPOINT
- CREATED:容器创建时间
- STATUS:容器当前状态是运行中还是停止
- PORTS:和宿主机的端口映射
- NAMES:容器名字
2. 创建容器
通过本地已有镜像创建容器,常规用法 docker create --name 自定义容器名 --network 要加入的网络名 -p 宿主机端口:对应的容器内端口 -v 数据挂载信息 镜像名:版本号,如果想使用更多参数可以通过 docker create --help 查看。
常规用法中的参数,除了 《镜像名: 版本号》 是必须的,其他都是按需添加,参数含义如下:
- name:给创建的容器起个名字,不加该参数时,默认是一个随机名
- network:指定这个容器需要加入的网络,不加该参数时,会加入一个默认的桥接网络中,但是这个网络中,容器间不能直接访问。
- p:宿主机端口和容器端口的对应关系,格式为
宿主机端口:容器端口,当使用桥接模式网络时(bridge),容器会有自己的一套IP体系,且容器的IP不能直接被外部访问,外部只能访问宿主机的IP,然后通过端口映射关系把请求转发到容器内部对应端口的应用上。当使用主机网络模式时(host),容器会沿用主机的IP,所以主机网络模式时不需要这个参数。 - v:把容器内的数据保存到宿主机中,参数值有两种格式,并分别对应两种叫法和两种原理,所以使用时要注意,以免数据丢失:
- 数据挂载: 格式为
宿主机中的路径:容器内的路径,这种方式是以宿主机中的内容作为初始数据来源(启动容器时,会直接覆盖容器中的内容),启动后宿主机中的数据和容器内的数据是双向同步的。 - 卷映射:
数据卷名:容器内的路径,这种方式还要区分数据卷内的挂载点是否为空,当挂载点为空时,以容器中的内容作为初始数据来源(启动容器时,会把内容直接写到数据卷的挂载点中),如果挂载点不是空,以数据卷中挂载点的内容作为初始数据来源(启动容器时,会把数据卷中挂载点的数据写到容器中)。但不论是哪种,启动后数据卷中挂载点的数据和容器内的数据是双向同步的。
- 数据挂载: 格式为
- e:这个参数我在常规用法中没有罗列出来,这个参数用来给容器传递环境变量,有些镜像创建出来的容器,需要传入一些环境变量,这个时候就可以用这个参数传递。格式为
-e 环境变量名=环境变量值,比如用 MySQL的镜像创建容器时,就必须指定 MYSQL_ROOT_PASSWORD 环境变量来设置初始密码,这个时候就可以通过-e MYSQL_ROOT_PASSWORD=123456来传递。
假设现在要根据 nginx:1.29.1 镜像来创建一个容器,要求这个容器名为 ougaii-nginx、容器要加入到名为 ougaii-net 的网络、容器中的路径 /usr/share/nginx/html 要挂载到名为 ougaii-data 的数据卷中、访问宿主机的80端口时,要转发到容器中的80端口上,我们就可以通过 docker create --name ougaii-nginx --network ougaii-net -p 80:80 -v ougaii-data:/usr/share/nginx/html nginx:1.29.1 实现。
3. 启动容器
启动本地已经存在的容器,常规用法 docker start 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker start --help 查看。
以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker start fcf3 和 docker start sweet_shockley 都可以启动容器。
4. 停止容器
关闭正在运行的容器,常规用法 docker stop 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker stop --help 查看。
以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker stop fcf3 和 docker stop sweet_shockley 都可以关闭容器。
5. 重启容器
不管是正在运行的容器,还是已经停止的容器,都可以通过重启容器来再次运行,常规用法 docker restart 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker restart --help 查看。
以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker restart fcf3 和 docker restart sweet_shockley 都可以重启容器。
6. 查看容器对于宿主机的资源使用情况
查看容器对于宿主机的资源使用情况,常规用法 docker stats 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker stats --help 查看。
以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker stats fcf3 和 docker stats sweet_shockley 都可以查看容器对于宿主机资源的使用情况,如果命令中不指定容器名或容器ID,则会查看所有正在运行的容器。
执行结果的结构大概为:
- CONTAINER ID:容器 ID
- NAME:容器名
- CPU %:容器进程占用的宿主机 CPU 百分比
- MEM USAGE / LIMIT:当前容器的内存使用量以及容器的内存限制
- MEM %:容器在宿主机物理内存中的实际占用百分比
- NET I/O:容器网络接口在宿主机上的流量(显示的是从容器启动后的累积数据),I:接收的流量,O:输出的流量。
- BLOCK I/O:容器文件系统对宿主机磁盘的读写(显示的是从容器启动后的累积数据),I:读入的大小,O:输出的大小。
- PIDS:容器内运行的进程数量
7. 查看容器的日志
查看容器中主进程的日志,简单说就是打印容器内部控制台中的信息。假设容器中运行的是一个 Java 程序,则会打印出所有输出到容器控制台的信息。常规用法 docker logs 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker logs --help 查看。
以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker logs fcf3 和 docker logs sweet_shockley 都可以查看容器日志。
8. 删除容器
删除本地容器,常规用法 docker rm -f 容器名或容器ID(容器ID只需要写四位即可),如果想使用更多参数可以通过 docker rm --help 查看。
以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker rm -f fcf3 和 docker rm -f sweet_shockley 都可以删除容器。
9. 进入容器内部
进入正在运行的容器内部,然后像访问 Linux 系统一样,访问容器。常规用法 docker exec -it 容器名或容器ID(容器ID只需要写四位即可) 命令行解释器,如果想使用更多参数可以通过 docker exec --help 查看。
命令参数中的 《命令行解释器》 比较复杂,因为这个是需要根据基础镜像来决定的,可以通过上面介绍的 docker history 命令分析出镜像中基础镜像使用的系统类型,然后通过系统类型来决定 《命令行解释器》的具体值。 《命令行解释器》和操作系统的对应关系如下:
- /bin/bash:Ubuntu、Debian、CentOS、RHEL
- /bin/sh:Alpine Linux
其实可以通过对应关系看到,常见的《命令行解释器》基本上就这两种,所以可以直接依次尝试一下,这样可以避免使用 docker history 命令分析基础镜像。
以 nginx 为例,假设 容器ID为 fcf3650f5c4f,容器名为 sweet_shockley,通过 docker exec -it fcf3 /bin/bash 和 docker exec -it sweet_shockley /bin/bash 都可以进入到容器内部。
10. docker run 命令
docker run 是一个基于 docker pull + docker create + docker start 的复合命令,当执行 docker run 时,如果镜像不存在就去 Hub 下载,然后根据镜像创建容器,最后启动容器。常规用法为 docker run -d --name 自定义容器名 --network 要加入的网络名 -p 宿主机端口:对应的容器内端口 -v 数据挂载信息 镜像名:版本号,如果想使用更多参数可以通过 docker run --help 。
常规用法中罗列出来的参数,基本和前文中 docker create 记载的一样,可以参考前文中对 docker create 的记载。
和前文 docker create 部分相比,唯一多出来的参数就是 -d,作用是让容器在后台启动。当我们用 docker start 启动容器时,容器默认就是后台启动,但是当使用 docker run 启动容器时,它会在前台启动,并阻塞命令行。
假设想下载 nginx:1.29.1 镜像,并创建和启动容器,要求这个容器后台启动,容器名为 ougaii-nginx、容器要加入到名为 ougaii-net 的网络、容器中的路径 /usr/share/nginx/html 要挂载到名为 ougaii-data 的数据卷中、访问宿主机的80端口时,要转发到容器中的80端口上,我们就可以通过 docker run -d --name ougaii-nginx --network ougaii-net -p 80:80 -v ougaii-data:/usr/share/nginx/html nginx:1.29.1 实现。
这个命令每执行一次,就会创建一次容器,所以当容器停止后,最好用 docker start 或 docker restart 再次启动,这个命令只适合第一次构建时使用(拉取、创建、启动容器),第一次构建时,可以通过这个复合命令来简化我们的工作。
三、将镜像推送到 Hub 仓库
将自己的镜像推送到 Docker Hub 官网 (需要魔法上网)。
先使用 docker login -u Docker账号 在命令行中登录 Docker,然后再使用 docker push 镜像名 将本地镜像推送到 Docker Hub。一定要注意,命令中的 《镜像名》部分,必须满足格式 Dokcer用户名/镜像名:版本号。
假设我在 Docker 官网的用户名是 ougaii,那么我要推送的镜像名必须以 ougaii/ 开头,现在我自定义了一个镜像,名字为 ougaii/new-ougaii-nginx,版本是 3.0,这时的推送命令就是 docker push ougaii/new-ougaii-nginx:3.0,推送后,就可以在自己的 Docker Hub 中 Repositories 里看见这个镜像了, 然后其他人就可以下载了。

1万+

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



