首页 > 技术文章 > linux/Docker

kaixinyufeng 2018-10-16 17:37 原文

【深度探索区块链】

//查看主机上的镜像文件列表
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

推荐阅读