目录
一、Docker镜像操作
1、镜像的拉取与上传
2、登录镜像仓库
3、列出镜像
4、查看镜像详细信息
5、删除镜像
6、清理镜像
7、创建镜像
8、通过容器提交镜像
9、镜像的保存和加载
10、镜像重命名
二、Docker容器操作
1、查看Docker客户端的所有命令选项
2、查看指定的Docker命令使用方法
3、查看容器
(1)查看容器详情
(2)查看容器内进程
(3)查看统计信息
(4)查看容器内部的标准输出
(5)查看容器内文件系统的变更
(6)查看指定容器的端口映射情况
4、容器的启动和暂停
5、进入容器
6、删除容器
7、docker create新建容器
8、docker run新建容器
(1)docker run直接新建并启动容器
(2)使用GPU运行容器
(3)使用GPU运行容器并指定端口映射
9、容器的保存与导入
(1)导出本地容器
(2)导入容器快照
10、容器与主机之间进行数据拷贝
11、退出容器
12、查看容器内的IP
镜像:类似于虚拟机镜像,可以理解为一个只读的模板。(一个镜像由镜像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 包。