Docker学习中...(2)Docker的三大组件

mac2025-08-06  4

Docker学习中…(1)更新完成

Docker的三大组件

镜像 -> image
容器 -> container
仓库 -> repository
镜像
镜像image:(image是只读的) >可以使用DockerFile来build出来一个image >也可以使用docker pull来从Docker Hub上拉取镜像:"docker pull 镜像名:[tag]",tag可以省略默认会取仓库中最新版本,会随仓库中的最新版本变更而变更,生产不可以用,不稳定 例: sudo docker pull mysql:5.6 >>如果权限不够需要加sudo,可以使用分组命令将docker分组处理 sudo groupadd docker sudo gpasswd -a 用户名 docker 运行docker version 如果不行就重启docker服务: service docker restart 还不行就重启系统sudo reboot >可以使用inspect来获取镜像的详细信息,包括作者、适应架构、各层(layer)的数字摘要,返回的json串,可以使用-f后面加json串中的key来获取value 命令: 返回所有信息:"docker inspect 镜像名",读取指定key的value:"docker inspect -f{{"参数"}} 镜像名" 例(所有信息): docker inspect lijinlong666/dockerpythontest1 例(json串中的Size): docker inspect -f{{".Size"}} lijinlong666/dockerpythontest1 >可以使用history来查看镜像的各层具体内容 例: docker history lijinlong666/dockerpythontest1 >删除和清理镜像可以使用rmi或者prune命令 rmi: 删除没有依赖容器的镜像可以使用:"docker rmi 镜像名或id",可以加参数-f来强制忽略依赖来删除数据:"docker rmi -f 镜像名或者id" prune: 清理系统遗留下来的临时镜像和一些没有被使用的镜像:"docker image prune 参数"{ 可以加参数: -a:删除所有无用镜像,不止临时镜像 -f:强制删除镜像,不需要确认 -filter: 删除符合给定过滤器的镜像 例: docker image prune -f } >创建镜像: >>基于已有镜像容器创建镜像: 命令: "docker commit 容器名或容器id 新镜像名(库):版本" 可以加参数以设置更多信息: -a,--author="":作者名->如: "docker commit -a "作者" 容器名或容器id" -c,--change=[]:提交的时候执行的Dockerfile指令->如:"CMD、RUN等" -m,--message="":提交消息->如:"docker commit -m "消息" 容器名或容器id" -p,--pause=true:提交时暂停容器运行 例: docker commmit -a "lijinlong" -m "测试基于已有镜像创建新镜像" -p cca5386de02e lijinlong666/test:1.0 >>基于本地模板导入镜像 命令: cat 镜像.tar.gz|docker import - 镜像名 >>基于Dockerfile来创建镜像 命令: vim Dockerfile docker build -t 镜像名 目录->如:docker build -t ljl/text . >存出镜像 将镜像存储为tar文件 命令: docker save [参数] 输出镜像名 镜像名 例: docker save -o ubuntu_18.04.tar ubuntu:18.04 参数有 -o,-output string >载入镜像 将镜像文件导入到镜像库中,导入的镜像与原镜像一致 docker load [参数] 镜像文件名 例: "docker load < ubuntu_18.04.tar"或"docker load -i ubuntu_18.04.tar" 参数有: -i,-input string >上传镜像 >>上传镜像默认上传到Docker Hub上 >>要上传必须先登录:"docker login" >>上传的镜像可以使用:"docker push 用户名/镜像名:版本"
容器
>container(container是可读可写的,因为要运行程序或安装软件) >是通过image创建的,所以必须有image >类比与面向对象->image是一个类,container是类的实例化对象 >各自负责的功能: image是负责app的存储和分发的,container是负责运行app的 >可以通过docker container ls 来查看运行中的容器 >可以通过docker container ls -a (或: docker ps -a)来查看运行中和运行后终止的容器 >其中command下显示的是运行容器所执行的命令(也就是CMD(运行后就结束)) >运行容器: 由于直接使用"docker run 镜像名"执行的容器运行完就直接关闭了,没有交互式的运行。所以可以使用"docker run -it 镜像名 /bin/bash"来交互式的运行容器,并进入容器中。可以使用"ctrl+d"或者"exit"来退出交互式容器 >>docker run执行容器时有时由于命令无法执行容器会出错直接退出,可以查看错误代码来判断是什么原因,默认情况常见的错误: >>>125:Docker daemon执行出错,例如:指定了不支持的Docker命令参数 >>>126:所指定的命令无法执行,例如:权限出错 >>>127:容器内命令无法找到 命令执行出错后会默认返回命令的退出错误码 >进入运行中的容器:docker exec -it 容器id /bin/sh >创建容器: >>"docker [contarner] create -it 镜像名",例:{docker create -it ubuntu:latest}创建出来的容器处于停止状态,可以使用"docker start 容器id",来启动容器 >>"docker run 镜像名 要执行的命令",例:{docker run ubuntu /bin/echo 'hello docker'},等同于创建容器后执行。 >删除容器: docker rm 容器id或容器名 >>批量删除容器: docker container ls -aq可以显示除所有容器的id,效果和"docker container ls -a| awk {'print$1'}显示第一列是一样的 直接使用: docker rm $(docker container ls -aq) 如果有启动也有启动后的容器,我们要删除启动后的容器可以使用: docker rm $(docker container ls -f "status=exited" -q) >>删除指定容器:docker rm 容器id或容器名 >>>删除时可以挂载的参数: -f 是否强行终止并删除一个运行中的容器,默认为false -l 删除容器的连接,但保留容器 -v 删除容器挂载的数据卷 如: docker rm -f 容器id >>删除所有容器:docker rm $(docker ps -aq) >显示运行中的容器: docker ps,加-a可以显示执行完的container,加-q可以显示第一行id >查看容器运行日志: docker logs 容器id >暂停容器: docker pause 容器id 暂停后启动容器: docker unpause 容器id >终止容器: docker stop 容器id 终止后可以重新启动: docker start 容器id 重启容器[先停止,然后启动]: docker restart 容器id >容器的导入导出[可对容器导出后进行迁移然后导入]: >>导出: docker export [-o 导出文件名.tar] 容器id -o 可以用来指定导出后的文件名 >>导入: docker import 镜像文件名 - 仓库名/镜像名:[tag] >查看容器 >>>查看容器具体信息:"docker inspect 容器id"(会以json格式返回包括容器id、创建时间、路径、状态、镜像、配置等在内的各项信息) >>>查看容器内进程:"docker top 容器id"(和在linux系统中top类似) >>>查看统计信息:"docker stats 容器id"(会显示cpu、内存、存储、网络等情况的统计信息) >>>>参数: -a 输出所有容器统计信息,默认仅在运行中的容器 -no-stream 不持续输出,默认会自动更新持续实时结果 -no-trunc 不截断输出信息 >从容器中复制文件到本地 >>docker cp 本地 容器 >>docker cp 容器 本地 >查看容器的文件系统变更 >>docker diff 容器名或容器id >查看容器端口所映射的主机端口 >>docker port 容器名或容器id >更新容器配置 >>docker update 参数 容器名或容器id >>>参数查看: docker update --help >>>例:docker update --blkio-weight 100 容器名 [生产环境状态下,为提高可用性和安全性,要为容器配置合理的资源来管理容器的消耗。还要指定合适的容器重启策略,来自动重启退出的容器。还可以使用HXPorxy等辅助工具来实现负载均衡,自动切换故障的容器。]
Docker仓库
>概述: >>注册服务器(Registry)是存放仓库的地方(注册服务器可以存在多个仓库), 仓库(Repository)是存放镜像的地方(仓库可以存放多个镜像)。 >>例:一个仓库地址 private-registry.com/repositoryname private-registry.com是注册服务器 repositoryname是仓库名 >Docker Hub公共镜像市场(官方) >>地址:hub.docker.com 登录平台注册,然后可以在linux服务器上使用"docker login"来进行登录。 退出登录可以使用"docker logout"。 登录后本地会自动创建.docker/config.json文件,用来存放用户的认证信息。 登录成功后就从Docker Hub上可以上传镜像了 >>查询镜像 docker search 镜像名 一般官方的为不带仓库的,非官方的带仓库名 centos 官方 lijinlong666/centos 非官方 >>拉去镜像 docker pull 镜像名:标签[不加标签默认latest] >>自动创建镜像(自动更新) 自动更新是Docker Hub提供的自动化服务,主要解决的是代码项目发生变化后自动重新构建镜像,可以通过用户给定的一个目标网站(目前只支持GitHub和BitBuchet)。 >第三方镜像市场(阿里云、腾讯云、网易云等) >>阿里云:https://dev.aliyun.com/search.html >搭建本地私有仓库 >>待补充
练习
自己通过Dockerfile创建一个练习docker image > 创建一个hello.c文件(其他文件可以,但需要环境存在) >> yum install -y gcc #c语言需要的环境 yum install -y glibc-static #c语言需要的环境 vim hello.c #include<stdio.h> int main() { printf("docker demo1"); } > 将写好的c语言文件编译成可执行文件 >> gcc -static hello.c -o hello > 编写Dockerfile >> FROM scratch #不依赖其他 ADD hello / #add到hello的根目录下 CMD ["/hello"] #根目录下的hello > build Dockerfile >> docker build -t lijinlong666/hello . > 查看docker image >> docker images > 运行image >> docker run lijinlong666/hello 容器:
构建自己的Docker镜像
例: 通过pull下来的镜像,进行交互式运行后在其中修改后(比如:yum install -y vim),然后commit出一个镜像 (假设我们有一个centos的镜像) docker run -it centos #交互式运行centos镜像 yum install -y vim #安装vim exit #退出镜像 docker ps -a #查看容器(包含已运行) docker commit 容器names 新镜像名 #commit一个容器到新镜像 docker images #查看所有镜像 例: 通过Dockerfile来构建镜像 vim Dockerfile #创建编写Dockerfile FROM centos #依赖centos RUN yum install -y vim #安装vun docker build -t lijinlong666/centos-vim . #通过build新镜像 docker images #查看所有镜像
Docker网络
列举当前机器上有那些网络: docker network ls
最新回复(0)