linux/Docker
【深度探索区块链】
//查看主机上的镜像文件列表 docker images //从镜像仓库下载镜像文件 docker pull hyperledger/fabric-peer //给镜像文件打标签 docker tag hyperledger/fabric-tools:x86_64-1.0.0 hyperledger/fabric-tools:latest //从镜像中启动容器 docker run -it --name cli ubuntu / bin/bash #cli是容器名称 #ubuntu是镜像名称 #-it是以交互方式启动 #bin/bash是启动容器时执行的命令 //查看容器日志 docker logs -f cli //查看主机上的容器,-a会显示已停止的容器 docker ps -a //查看容器映射的端口 docker port peer0.org1.example.com //删除容器,cli为容器名称或id docker rm cli //查看帮助文档 docker --help
docker ps --help //查看docker ps的帮助指令
【获取容器相关信息】
0.docker version #查看版本号 1.docker run ...#创建并启动一个容器 Eg1:docker run -d -p 80:80 --name webserver nginx 参数: -d: 后台运行容器并返回容器ID -p: 端口映射,格式为:主机(宿主)端口:容器端口 --name: 为容器指定一个名称 #该命令:用nginx镜像启动一个容器,命名为webserver,并映射了80端口。以便用浏览器访问nginx服务器 //地址栏访问:http://localhost 即显示nginx Eg2: docker run \ #运行容器的命令 -it \ #这是两个参数,一个是 -i:交互式操作,一个是 -t 终端(若要进入 bash 执行一些命令并查看返回结果,需要交互式终端) --rm \ #容器退出后随之将其删除 ubuntu:16.04 \ #用ubuntu:16.04 镜像为基础来启动容器 bash #放在镜像名后的是"命令",希望有个交互式Shell应用bash //退出容器:exit 2.docker ps #显示状态为运行(Up)的容器 3.docker ps -a #显示所有容器,包括运行中(Up)的和退出的(Exited) 4.docker stop 容器NAMES #停止容器运行,发送信号SIGTERM 5.docker start 容器NAMES #启动一个停止状态的容器 6.docker restart 容器NAMES #重启一个容器 7.docker rm 容器NAMES #删除一个容器 8.docker diff 容器名(webserver) #查看具体的改动(本示例修改nginx启动显示为Hello Docker!) //docker中 启动所有的容器命令 docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) //docker中关闭所有的容器命令 docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) //docker中删除所有的容器命令 docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2) //docker中删除所有的镜像 docker rmi $(docker images | awk '{print $3}' |tail -n +2) //tail -n +2 表示从第二行开始读取
Docker与宿主机间互拷文件
//从容器里拷备文件到宿主机 docker cp containerid:/usr/local/*.js /dir //从宿主机拷备文件到容器 docker cp /dir/*.js containerid:/usr/local/
***慎用docker commit
//定制镜像 docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] docker commit \ --author "shiyufeng <shiyufeng@gmail.com>" \ #修改作者 --message "modify default webpage" \ #本次修改内容 webserver \ nginx:v2 //查看新定制的镜像 docker image ls nginx //查看镜像内的历史记录 docker history nginx:v2 //运行新定制的镜像,容器名为web2 docker run --name web2 -d -p 81:80 nginx:v2
【镜像操作】
0.docker info #查看docker配置信息,可查看镜像是否配置成功(key=Registry Mirrors) 1.docker images / docker image ls #显示本地所有的镜像列表(顶层镜像) docker image ls ubuntu #根据仓库名列出镜像 docker image ls ubuntu:16.04 #列出某个特定的镜像(仓库名:标签) docker image ls -a #显示包含中间层镜像的所有镜像 (显示的无标签镜像不要删除,是其他镜像所依赖的镜像) docker image ls -f since=mongo:3.2 #查看mongo:3.2之后建立的镜像(-f : --filter参数简写,过滤) docker image ls -f before=mongo:3.2 #查看mongo:3.2之前建立的镜像 docker image ls -f label=com.example.version=0.1 #通过镜像构建时指定的label过滤 docker image ls -q #列出所有镜像ID docker image ls -q redis #列出所有仓库名为redis的镜像ID docker image ls --format "{{.ID}}: {{.Repository}}" #列出镜像ID和Reopository docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" #表格等距显示,并且有自定义标题行 2.docker rmi IMAGE_ID #删除一个镜像 docker image rm IMAGE_ID #应用IMAGE_ID删除镜像:IMAGE_ID可为短ID(取前3个即可)也可为长ID docker image rm NAMES #应用镜像名删除镜像(docker ps -a查看镜像名) docker image rm DIGEST #应用镜像摘要删除镜像(docker image ls --digests #查看镜像摘要) ##批量删除 docker image rm $(docker image ls -q redis) #删除所有仓库名为redis的镜像(列出所有仓库名为redis的镜像ID) docker image rm $(docker image ls -q -f before=mongo:3.2) #删除所有在 mongo:3.2 之前的镜像 //docker中 启动所有的容器命令 docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) //docker中关闭所有的容器命令 docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) //docker中删除所有的容器命令 docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2) //docker中删除所有的镜像 docker rmi $(docker images | awk '{print $3}' |tail -n +2) //tail -n +2 表示从第二行开始读取 3.docker pull --help #查看docker pull选项帮助 4.docker pull ubuntu:16.04 #从仓库(docker_hub)下载镜像到本地 5.docker image ls -f dangling=true #仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) 6.docker image prune #删除虚悬镜像 docker system df #查看镜像、容器、数据卷所占用的空间 docker tag hyperledger/fabric-tools:x86_64-1.0.0 hyperledger/fabric-tools:latest //给镜像文件打标签,x86_64-1.0.0标记为latest
删除常见问题&解决image is referenced in multiple repositories
执行:docker image rm $(docker image ls -q hyperledger/fabric-ca) 报上述错误。
错误原因:镜像id指向了两个repository,因此无法删除。
执行:docker rmi repository 删除即可。//respository方式删除。
【定制镜像 & 构建镜像】
https://yeasy.gitbooks.io/docker_practice/image/build.html
1。定制镜像
Eg1:以nginx镜像为基础,定制镜像 //创建包mynginx mkdir mynginx //进入包mynginx cd mynginx //创建文件Dockerfile文本文件 touch Dockerfile //编辑Dockerfile文本文件 vi Dockerfile ##add content start //From指定基础镜像(定制镜像以一个镜像为基础,在其上定制)【必须&第一条指令】 FROM nginx //RUN用来执行命令行命令 RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ## add content end Eg2:不以任何镜像为基础,以下指令作为第一层开始存在 //scratch为虚拟镜像,并不实际存在 FROM scratch ...
2。构建镜像
//构建镜像(在Dockerfile文件目录下执行),指定镜像名称:-t nginx:v3 "."表示当前目录,即指定上下文路径 docker build -t nginx:v3 . #docker build会将"."指定的上下方目录的内容打包交给Docker引擎以构建镜像
说明:
构建镜像语法格式:
docker build [选项] <上下文路径/URL/->
镜像构建过程:每一条命令即指定一层
Step2/2: RUN指令启动了一个容器d5b8fb...,执行了所要求的命令,删除了用到的容器d5b8fb...,并最后提交了这一层632ba...
注意:镜像构建上下文(Context)
"." :表示当前目录,而Dockerfile就在当前目录。
docker build工作原理:
docker在运行时分为“Docker引擎(服务端守护进程)”和“客户端工具”。
1。Docker引擎:提供了一组REST API,称为Docker Remote API。
docker命令这样的客户端工具是通过这组API与Docker引擎交互,以完成各种功能。
因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举
【查看日志】
//命令格式 docker logs --help //查看帮助 //语法: docker logs [选项] CONTAINER Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟) --tail string 从日志末尾显示多少行日志, 默认是all -t, --timestamps 显示时间戳 --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟) //查看指定时间后的日志,只显示最后100行: $ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID //查看最近30分钟的日志: $ docker logs --since 30m CONTAINER_ID //查看某时间之后的日志 $ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID //查看某时间段日志: $ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
工作中遇到的问题与解决方案:
1。如何解决 image has dependent child images 错误
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=imageId)
显示所有imageId,确认处理即可。
Docker学习网址:https://yeasy.gitbooks.io/docker_practice/image/commit.html