目录
镜像:类似于虚拟机镜像,可以理解为一个只读的模板。(一个镜像由镜像ID唯一标识)
容器:是从镜像创建的应用运行实例。可以启动、开始、停止、删除,容器之间都是彼此相互隔离、互不相见的。容器可以看作是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。一个Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。<仓库名>:<标签> 也叫做镜像名称,类似于“系统:系统型号”,比如“ubuntu:16.04”,有别的系统,也有别的型号。
一、Docker镜像操作
1、镜像的拉取与上传
docker pull [OPTIONS] NAME[:TAG] # 从官方Docker Hub镜像源下载镜像
# NAME: 镜像仓库名称,用来区分镜像
# TAG: 镜像的标签,往往用来表示版本信息
docker pull ubuntu:18.04 # 从Docker Hub下载ubuntu:18.04镜像
"""
选项说明:
-a, --all-tags=true|false: 是否获取仓库中的所有镜像,默认为否
--disable-content-trust: 取消镜像的内容校验,默认开启为True
"""
docker pull -a ubuntu #从Docker Hub下载REPOSITORY为ubuntu的所有镜像
docker push username/ubuntu:18.04 #将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
2、登录镜像仓库
#登录镜像仓库
docker login local.harbor.com 用户名/密码
docker login -u asialee -p root12345 local.harbor.com
#镜像上传
docker push local.harbor.com/library/ai-detect
3、列出镜像
docker images 或
docker image ls
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID,唯一标识,若两个镜像的ID相同,表示他们指向了同一个镜像,只是标签名称不同
- CREATED:镜像最后更新时间
- SIZE: 镜像大小
4、查看镜像详细信息
- 可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字参数等。返回的是一个json格式的消息。
docker inspect ubuntu:18.04
5、删除镜像
docker rmi ubuntu:18.04 #删除 ubuntu:18.04 镜像,注意删除镜像先删除容器
6、清理镜像
- 使用Docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用过的镜像,可以对他们进行清理。
docker image prune [OPTIONS]
"""
选项说明:
-a, -all: 删除所有无用镜像,不光是临时文件;
-filter filter: 只清理符合给定过滤器的镜像;
-f, -force: 强制删除镜像,而不进行提示确认。
"""
7、创建镜像
docker build: 配合 Dockerfile 文件创建镜像;
docker commit: 从容器创建一个新的镜像;
docker import: 基于本地模板导入。
8、通过容器提交镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# docker commit [选项] 已有容器的id/已有容器的名称 镜像名称:[标签]
"""
选项说明:
-m, --message="": 说明信息;
-a, --author="": 作者信息;
-p, --pause=true: 生成过程中停止容器的运行,一般不用;
"""
docker commit -a "Lee" -m "explain" 9ab4a4428d6b rubbish:v1
docker commit f7507396068a vehicle_detect:v1
9、镜像的保存和加载
#保存镜像
docker save -o ubuntu_18.04.tar ubuntu:18.04
docker save m2>m2.tar //保存m2镜像到m2.tar文件
docker save m2 -o /home/m2.tar
#导出镜像到本地,然后可以通过复制tar文件分享给别人。
#载入镜像
docker load -i ubuntu_18.04.tar
docker load<m2.tar
#将tar文件再导入到本地镜像库,可以导入镜像及其相关的元数据信息(包括标签等)。
10、镜像重命名
docker tag ubuntu:18.04 username/ubuntu:18.04 #将镜像ubuntu:18.04标记为 username/ubuntu:18.04 镜像
二、Docker容器操作
1、查看Docker客户端的所有命令选项
runoob@runoob:~# docker
2、查看指定的Docker命令使用方法
runoob@runoob:~# docker ps --help #查看 docker ps 指令的具体使用方法
3、查看容器
docker ps #查运行的容器
docker ps -a #查看所有容器
docker ps -a | grep ubuntu #查找特定容器
docker ps -l #查询最后一次创建的容器
(1)查看容器详情
- 会以json格式返回包括容器ID,创建时间,路径,状态,镜像,配置等内在的各项信息。
docker inspect 容器名称/容器ID
(2)查看容器内进程
- 会打印出容器内的进程信息,包括PID,用户,时间,命令等。
docker top d6954f7436aa
(3)查看统计信息
- 会返回CPU,内存,存储,网络等使用情况的统计信息。
docker stats d6954f7436aa
(4)查看容器内部的标准输出
docker logs 容器ID [OPTIONS]
"""
选项说明:
-details: 打印详细信息;
-f, -follow: 持续保持输入;
-since string: 输出从某个时间开始的日志;
-tail string: 输出最近的若干日志;
-t, -timestamps: 显示时间戳信息;
-until string: 输出某个时间之前的日志。
"""
docker logs d6954f7436aa #查看容器内部的标准输出
#-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出
docker logs -f d6954f7436aa
(5)查看容器内文件系统的变更
docker container diff d6954f7436aa
(6)查看指定容器的端口映射情况
docker port d6954f7436aa
"""
PORTS
0.0.0.0:32769->5000/tcp #Docker开放了 5000 端口(默认 Python Flask 端口)
映射到主机端口32769上。
"""
4、容器的启动和暂停
docker start b750bbbcfd88 #使用 docker start 启动一个已停止的容器
docker start -i 5c6ce895b979 #重启容器后进入交互式
docker stop b750bbbcfd88 #停止一个容器
docker restart b750bbbcfd88 #停止的容器可以通过 docker restart 重启
docker pause 容器别名/容器名称/容器ID #容器暂停(暂停一个运行中的容器)
docker unpause 容器别名/容器名称/容器ID #容器恢复运行状态
5、进入容器
docker exec -it 243c32535da7 /bin/bash
6、删除容器
# 删除处于终止或退出状态的容器
docker rm [-f|--force] [-l|--link] [-v|--volume] CONTAINER [CONTAINER...]
"""
选项说明:
-f, --force=false: 是否强行终止并删除一个运行中的容器;
-l, --link: 删除容器的连接,但保留容器;
-v, --volume: 删除容器挂载的数据卷。
"""
$ docker rm 1e560fca3906 #注意删除容器前先停止容器
$ docker rm -f 1e560fca3906
$ docker container prune # 该命令会自动清除掉所有处于停止状态的容器
$ docker kill 容器名称/容器ID # 直接发送SIGKILL信号来强制终止终端
7、docker create新建容器
- 容器并指定端口映射,docker create 新建的容器处于停止状态,所以以下两个语句要配合使用。
docker create [OPTIONS] 镜像名称/(或者)镜像ID /bin/bash
docker start 容器名称/容器ID
8、docker run新建容器
(1)docker run直接新建并启动容器
docker run [OPTIONS] 镜像名称/(或者)镜像ID /bin/bash
"""
create和run的选项说明:
-t, --tty=true|false: 是否分配一个伪终端,默认为false
-i, --interactive=true|false: 允许对容器内的标准输入进行交互,默认为false;
-p, --publish=[]: 指定如何映射到本地主机端口,例如11234-11234:1234-1234;
-v, --volume [=[[HSOT-DIR:]CONTAINER-DIR[:OPTIONS]]]: 挂载主机的文件卷到容器内;
--name="": 指定容器的别名;
--shm-size="": /dev/shm的大小;
--gpus all: 可以使用所有gpu。
# /bin/bash: 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
"""
$ docker run -it ubuntu:18.04 /bin/bash
$ docker run -itd ubuntu:18.04 /bin/bash #-d 指定容器在后台运行,不会进入容器
(2)使用GPU运行容器
docker run -it --gpus all vehicle_detect:v1 /bin/bash #容器使用所有GPU
docker run -it --gpus 2 vehicle_detect:v1 /bin/bash #容器使用两个GPU
docker run -it --gpus ' "device=1,2" ' vehicle_detect:v1 /bin/bash #容器指定GPU运行
(3)使用GPU运行容器并指定端口映射
#-p(小写的)则可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器
docker run -it --gpus all -v /data:/data -p 60049:5050 --shm-size 64G
--name "rubbish_v1" rubbish_detect:v1.0 /bin/bash
docker run -it --gpus all -v /data:/data --net=host --shm-size 8G
-w /data/ --name "rubbish_v1" rubbish_detect:v1.0 /bin/bash
$ docker run -d -P training/webapp python app.py
#指定容器绑定的网络地址127.0.0,通过访问 127.0.0.1:5001 来访问容器的 5000 端口。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
#默认都是绑定tcp端口,如果要绑定UDP端口,可以在端口后面加上 /udp。
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
"""
-d:让容器在后台运行
-p(小写): 是容器内部端口绑定到指定的主机端口
-P(大写):是容器内部端口随机映射到主机的端口。
"""
举例:将nginx镜像运行为一个容器
docker run -d -p 81:80 -it nginx /bin/bash
#其中-d是保持后台运行,-p 是端口映射,将内部的端口80向外部的端口81映射,/bin/bash就表示
启动容器后启动bash。
说明:
-
端口映射与容器互联:在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。容器有自己的内部网络和IP地址,使用docker inspect + 容器ID可以获取该容器的具体信息。
-
当用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:检查本地是否存在指定镜像,不存在就从共有仓库下载;利用镜像创建一个容器,并启动该容器;分配一个文件系统给容器,并在镜像层外面挂载一层可读写层;从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;从网桥的地址池配置一个IP地址给容器;执行用户指定的应用程序;执行完毕后容器被自动终止。
-
某些时候,执行docker run因为命令无法正常执行容器会出错直接退出,此时可以查看退出的错误代码。默认情况下,错误代码包括:125:Docker daemon执行出错,例如制定了不支持的Docker命令参数;126:所指定命令无法执行,例如权限出错;127:容器内命令无法找到。命令执行后出错,会默认返回命令的错误码。
-
PROTS 0.0.0.0:49155->5000/tcp #即本地主机的49155端口被映射到容器的5000端口,访问宿主主机的49155端口即可访问容器内web应用提供的界面。
9、容器的保存与导入
- 导出容器是指导出一个已经创建的容器到另一个文件,不管此时这个容器是否处于运行状态,然后可将导出的tar文件传输到机器上,然后再通过导入命令导入到系统中,实现容器的迁移。
(1)导出本地容器
# 导出一个已经创建的容器到另一个文件,不管此时这个容器是否处于运行状态
docker export [-o|--output[=""]] CONTAINER #-o用来指定导出的tar文件名
docker export -o ubuntu.tar 1e560fca3906 #将容器保存为tar文件
docker export 1e560fca3906 > ubuntu.tar #将导出容器快照到本地文件
(2)导入容器快照
# 导出的文件可以用以下命令导入变成镜像
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|[REPOSITORY[:TAG]]
#将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
docker import ubuntu.tar test/ubuntu:v1
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
说明:
使用docker load导入镜像文件与docker import区别(容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),可从新指定标签等元数据信息。镜像存储文件则保存完整记录,体积更大。)
- - docker save 保存的是镜像(image),docker export 保存的是容器(container)。
- - docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像。
- - docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称。
10、容器与主机之间进行数据拷贝
#主机目录拷贝到容器目录
#将主机/data/test目录拷贝到容器96f7f14e99ab的/data目录下
docker cp /data/test 96f7f14e99ab:/data/
#主机目录拷贝到容器目录,目录重命名
#将主机/data/test目录拷贝到容器96f7f14e99ab中,目录重命名为data
docker cp /data/test 96f7f14e99ab:/data
#容器目录拷贝到主机目录
#将容器96f7f14e99ab的/data目录拷贝到主机的/tmp目录中
docker cp 96f7f14e99ab:/data /tmp/
11、退出容器
exit 或者 Ctrl+P+Q
12、查看容器内的IP
进入容器后,查看docker容器内的IP:cat /etc/hosts
注意事项
- 镜像转文件的命令是: docker save image > /root/image.tar
- 文件转镜像的命令是: docker load < /root/image.tar 或者 docker load -i /root/image.tar
- 错误 1 是: **requested load from stdin, but stdin is empty**
- 结论 : docker load 的时候, < 误写成 >, 会出现这个错误,并且原 tar 包会被修改,修改后就不可用了
- 错误 2 是: **open /var/lib/docker/tmp/docker-import-054903443/repositories: no such file or directory**
- 结论 : 如果你使用过错误1 中的命令,那么即使之后的命令都是正确的,也会遇到上述错误,避免的办法是不要输错命令。倘若已经输错了,那么唯一可用的方法是删除当前的 tar 包,并且重新获取 tar 包。