查看版本
- docker version:查看镜像版本
拉取镜像
- docker pull:拉取镜像
- 命令格式一般为 docker pull [Registry]/[Repository]/[Image]:[Tag]
- Registry:注册服务器。默认会从 docker.io 拉取镜像,一般国内操作会替换成 阿里,腾讯等等国内镜像
- Repository:为镜像仓库,通常把一组相关联的镜像归为一个镜像仓库,library为 Docker 默认的镜像仓库。
- image:镜像名称
- tag:镜像的标签,如果你不指定拉取镜像的标签,默认为latest。
- 实际上执行docker pull busybox命令,都是先从本地搜索,如果本地搜索不到busybox镜像则从 Docker Hub 下载镜像。
重命名、查看、删除镜像
- docker tag:重命名镜像
- 命令格式为 docker tag [SOURCE_IMAGE][:TAG] [TARGET_IMAGE][:TAG]
- [SOURCE_IMAGE][:TAG]:原始镜像及版本
- [TARGET_IMAGE][:TAG]:命名后的镜像及版本
- docker image is:查看镜像
- docker images:查看镜像
- docker image ls busybox:查看busybox镜像
- docker images |grep busybox:查询所有镜像再过滤得到的结果也是查询 busybox镜像
- docker rmi 镜像名称/id:删除镜像(rmi:rm image)
- docker run 加上–rm退出容器以后,这个容器就被删除了,方便在临时测试使用
构建镜像
- docker commit:从运行中的容器提交为镜像
- docker build:从 Dockerfile 构建镜像
推荐
创建并启动容器
-
docker run:创建并启动镜像
- –name:指定容器名称,不填写则会默认一个名称(
名字需要在镜像前
) - -d:后台运行容器,并返回容器id,即启动守护式容器。
- docker容器后台运行,就必须有一个前台进程
- -i则让容器的标准输入保持打开(终端的 STDIN 打开),
即交互模式运行容器通常与-t同时使用
- it:
-t让docker分配一个伪终端并绑定到容器的标准输入上,同时使用 -it 参数可以让我们进入交互模式。 在交互模式下,用户可以通过所创建的终端来输入命令
- -P:随机端口映射
- -p:指定端口映射
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- -v:把 Docker 容器的某个目录或文件挂载到主机上,保证容器被重建后数据不丢失。-v参数冒号前面为主机目录,冒号后面为容器内目录。
docker run -v /var/lib/registry/data:/var/lib/registry
- –e:指定容器内的环境变量
-e REGISTRY_HTTP_ADDR=0.0.0.0:443
- –name:指定容器名称,不填写则会默认一个名称(
-
docker run --name testNginx -d -p 80:80 nginx:安装nginx 名称修改为 textNginx 容器退出后不自动关闭
使用以下命令创建一个名为 busybox 的容器并进入 busybox 容器。
docker run --rm --name=busybox -it busybox sh
启动流程
- docker会检查本地是否存在busybox镜像,如果不存在会从dockerhub拉取
- 使用busybox镜像创建并启动一个容器
- 分配文件系统,并在镜像只读层外创建一个读写层
- 从docker IP池中分配一个IP给容器
- 执行命令运行镜像
docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出
docker run -dit -p 8088:80 639f /bin/bash
在容器中,执行以下命令创建一个文件并写入内容:
- Linux touch:若文件不存在,系统会建立一个新的文件。
- Linux echo:字符串的输出
touch hello.txt && echo "I love Docker. " > hello.txt
此时在容器的根目录下,已经创建了一个 hello.txt 文件,并写入了 "I love Docker. "。下面,我们新打开-
-
另一个命令行窗口,运行以下命令提交镜像:
docker commit busybox busybox:hello
docker image ls命令查看镜像:
-
第二种方式是最重要也是最常用的镜像构建方式:Dockerfile。Dockerfile 是一个包含了用户所有构建命令的文本。通过docker build命令可以从 Dockerfile 生成镜像。
使用 Dockerfile 构建镜像具有以下特性:
- Dockerfile 的每一行命令都会生成一个独立的镜像层,并且拥有唯一的 ID;
- Dockerfile 的命令是完全透明的,通过查看 Dockerfile 的内容,就可以知道镜像是如何一步步构建的;
- Dockerfile 是纯文本的,方便跟随代码一起存放在代码仓库并做版本管理。
Dockerfile 常用的指令
Dockerfile 指令 指令简介 FROM Dockerfile 除了注释第一行必须是 FROM ,FROM 后面跟镜像名称,代表我们要基于哪个基础镜像构建我们的容器。 RUN RUN 后面跟一个具体的命令,类似于 Linux 命令行执行命令。 ADD 拷贝本机文件或者远程文件到镜像内 COPY 拷贝本机文件到镜像内 USER 指定容器启动的用户 ENTRYPOINT 容器的启动命令 CMD CMD 为 ENTRYPOINT 指令提供默认参数,也可以单独使用 CMD 指定容器启动参数 ENV 指定容器运行时的环境变量,格式为 key=value ARG 定义外部变量,构建镜像时可以使用 build-arg = 的格式传递参数用于构建 EXPOSE 指定容器监听的端口,格式为 [port]/tcp 或者 [port]/udp WORKDIR 为 Dockerfile 中跟在其后的所有 RUN、CMD、ENTR FROM centos:7 COPY nginx.repo /etc/yum.repos.d/nginx.repo RUN yum install -y nginx EXPOSE 80 ENV HOST=mynginx CMD ["nginx","-g","daemon off;"]
-
第一行表示我要基于 centos:7 这个镜像来构建自定义镜像。这里需要注意,每个 Dockerfile 的第一行除了注释都必须以 FROM 开头。
-
第二行表示拷贝本地文件 nginx.repo 文件到容器内的 /etc/yum.repos.d 目录下。这里拷贝 nginx.repo 文件是为了添加 nginx 的安装源。
-
第三行表示在容器内运行yum install -y nginx命令,安装 nginx 服务到容器内,执行完第三行命令,容器内的 nginx 已经安装完成。
-
第四行声明容器内业务(nginx)使用 80 端口对外提供服务。
-
第五行定义容器启动时的环境变量 HOST=mynginx,容器启动后可以获取到环境变量 HOST 的值为 mynginx。
-
第六行定义容器的启动命令,命令格式为 json 数组。这里设置了容器的启动命令为 nginx ,并且添加了 nginx 的启动参数 -g ‘daemon off;’ ,使得 nginx 以前台的方式启动。
镜像的实现原理
Docker 镜像是由一系列镜像层(layer)组成的,每一层代表了镜像构建过程中的一次提交。
Docker 镜像是静态的分层管理的文件组合,镜像底层的实现依赖于联合文件系统(UnionFS)
退出容器
- exit:退出并关闭容器
- ctrl+p+q:退出不关闭容器
删除容器
- docker rm 容器id/名称:删除容器,容器必须是停止状态
- docker rm -f:强制终止正在运行的容器
查询所有容器
- docker ps:查看所有启动的镜像
- docker ps -a:查看所有镜像,包括未运行的
- docker ps -q:静默模式,只显示容器编号
- docker ps -l:列出最近使用的容器 不常用
- docker container ls --all:查看所有容器列表
启动、重启、关闭、删除容器
- docker start 容器id/名称:启动容器
- docker restart 容器id/容器名称:重启容器
- docker stop 容器id/名称:停止容器
- docker kill 容器id/名称:强制停止容器
- docker rm 容器id/名称:删除容器
- docker rm -f 容器id/名称:强制删除容器
- docker rm -f $(docker ps -aq):强制删除所有容器
查看容器日志
- docker logs 容器id/容器名称:查看容器log,如果没有log说明容器启动失败
- docker logs 容器id -f:停留在日志中
- docker logs -tf --tail 10 容器id
- -t:加入时间戳
- -f:跟随打印最新的日志
- -tail 数字:显示后多少条
- docker logs -f --tail 100 0b83f42a0efa
查看容器运行进程
- docker top 容器id
查看容器运行细节
- docker inspect 容器id
进入正在运行的容器并以命令交互
- docker exec -it 容器id/名称 /bin/bash:以交互模式(重新分配一个终端) 进入容器中,可以使用exit退出并且不会关闭
- docker attach 容器id:使用最开始创建的中断进入,exit 会退出容器
复制容器文件到主机
- docker cp 容器id:容器内路径 主机路径
导出容器、导入镜像、创建一个新的镜像
- docker export 容器id/容器名称:导出容器 例如 :
docker export busybox > busybox.tar
导出busybox容器执行后会在当前文件夹下生成 busybox.tar 文件 - docker import 容器id/容器名称:导入镜像,例如:
docker import busybox.tar busybox:test
busybox.tar 被导入成为新的镜像,镜像名称为 busybox:test - docker commit -m=“修改内容” -a=“作者” 原容器id/容器名称 新容器名称:容器版本号
- -m:镜像描述
- -a:作者
docker commit -m=“create tomcat” -a=“CodingAnHour” 45678vvvd mytomcat:1.0
从tomcat容器创建一个新的镜像
查看数据键
- docker volume ls :查看数据键
容器数据卷,持久化
持久化优点:
- 容器的某个目录或文件挂载到主机上,保证容器被重建后数据不丢失
- 容器间继承和共享数据
- 示例:
-
1、命令挂载
- docker run -v /var/lib/registry/data:/var/lib/registry (其他配置) 镜像id
- -v:冒号前面为主机目录,冒号后面为容器内目录。
挂载时如果出现没有权限问题,可以直接在挂载目录后增加
--privileged=true
…Permission denied
-
2、Dockerfile挂载
- dockerfile的 VOLUME 指令可以在镜像中创建挂载点
- VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的
Dockerfile
FROM ubuntu VOLUME ["/data1","/data2"]
-
查看容器信息 docker inspect 容器id
容器继承
–volumes-from标志创建一个安装该卷的新容器
- 创建一个容器
docker run --name mybusybox01 -it -d -v /host/data:/var/data busybox
- 创建第二个容器
docker run --name mybusybox02 -it -d --volumes-from mybusybox01 busybox
- 创建第三个容器
docker run --name mybusybox03 -it -d --volumes-from mybusybox02 busybox
- 在任意容器中 /var/data目录下的文件被所有容器共享,引用同一个数据键
- 删除其中一个容器,其他容器目录下文件不会发生变化
查看镜像历史信息
- docker history 镜像id/镜像名称:tag
容器配置root权限
容器内root只是外部的一个普通用户权限。
--privileged=true
:获取宿主机root权限docker run -it (其他配置) --privileged=true 镜像id
其他
- docker diff 容器di/名称:查看容器改动历史
- docker history nginx v2:查看nginx v2的镜像
- docker login:登陆
- docker search:搜索
- docker inspect mysql:查看mysql信息 mounts:中把name的数据键mounts到destination中
- docker pause:容器暂停
- docker unpasue:启动已停止运行的容器。由暂停->启动
- docker system df:查看容器或镜像所占用的空间
busybox 是一个集成了数百个 Linux 命令(例如 curl、grep、mount、telnet 等)的精简工具箱,只有几兆大小,被誉为 Linux 系统的瑞士军刀。