安装docker

1
yum -y install docker

查看docker容器版本

1
docker version

查看docker容器信息

1
docker info

修改存储路径

1
2
3
4
5
6
7
8
9
10
11
#Docker的镜像需在大量的存储空间,默认的存储路径在 /var/lib/docker, 可以按实际需求修改存储路径。
#停止docker
service docker stop
#创建目录
mkdir -p /data/docker
#移动目录到新路径
mv /var/lib/docker /data/docker
#做个软链接
ln -s /data/docker /var/lib/docker
#启动docker
service docker start

下载镜像

1
2
docker pull tomcat
#相当于 docker pull centos:latest 最新版本,可以手动指定版本

查看容器的所有镜像

1
docker images

查看容器运行的镜像

1
2
3
docker ps
#可以使用grep过滤镜像
docker ps |grep tomcat

查看容器历史运行过的镜像

1
docker ps -a

显示运行容器总文件大小

1
docker ps -s

镜像启动

1
2
3
4
5
6
7
docker run -d -p 8080:8080 -v /data:/data --name=mytomcat tomcat 
#-d: 后台运行容器,并返回容器ID;
#-i: 以交互模式运行容器,通常与 -t 同时使用;
#-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
#-p:前者是外围访问端口:后者是容器内部端口
#--volume,-v: 宿主机的目录/data映射到容器的/data
#--name="nginx-lb": 为容器指定一个名称;

进入容器

1
docker exec -it [CONTAINER ID] /bin/bash

删除镜像

1
2
3
4
docker rmi [CONTAINER ID]

如果出现应用出错:Error response from daemon: conflict: unable to delete CONTAINER ID(cannot be forced) - image has dependent child images
docker rmi REPOSITORY:TAG

删除运行失败的镜像

1
2
docker rm [CONTAINER ID]
#删除运行中的镜像需要先停止该容器,然后使用上述命令。使用-f可强制删除

删除所有none镜像

1
docker rmi `docker images | grep  "<none>" | awk '{print $3}'`

删除不是latest的镜像

1
docker rmi `docker images|grep -v latest |awk '{print $3}'`

删除Exited状态的容器

1
docker rm `docker ps -a|grep Exited|awk '{print $1}'`

根据镜像名删除镜像

1
docker images | grep wecloud | awk '{print $1":"$2}' | xargs docker rmi

删除一周之前的镜像(一个月内)

1
docker images | grep weeks | awk '{print $3}'|xargs docker rmi

删除一周之前的所有镜像

1
2
3
4
for i in {"weeks","months"};
docker images | grep $i | awk '{print $3}'|xargs docker rmi
docker images | grep $i | awk '{print $3}'|xargs docker rmi
;done

创建dockerfile

1
2
3
4
5
from tomcat #tomcat的镜像
MAINTAINER nmk #作者
RUN rm -rf /usr/local/tomcat/webapps/* #运行的命令
COPY nmk.war /usr/local/tomcat/webapps #复制war包到tomcat的webapps目录下
EXPOSE 8080 #开放端口

镜像构建

1
2
3
docker build -f /data/docker/dockerfile -t mytomcat:1.1
#-f :指定要使用的Dockerfile路径;
#--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;

推送到阿里云镜像仓库

1
2
3
4
5
6
7
8
#登录阿里云Docker Registry
docker login --username=aliyunaccount registry.cn-beijing.aliyuncs.com
#镜像打tag
docker tag [ImageId] registry.cn-beijing.aliyuncs.com/nmk/tomcat:[镜像版本号]
#推送到阿里云
docker push registry.cn-beijing.aliyuncs.com/nmk/tomcat:[镜像版本号]
#拉取阿里云镜像
docker pull registry.cn-beijing.aliyuncs.com/lepeng/tomcat:[镜像版本号]

从宿主机拷贝到容器

1
docker cp files.txt [CONTAINER ID或NAMES]:/home

从容器拷贝到宿主机

1
docker cp [CONTAINER ID或NAMES]:/home/files.txt  /home/

镜像导入导出有两种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#指定镜像保存成tar归档文件
docker save -o files.tar tomcat:7.5
#载入打包的镜像
docker load -i files.tar
#指定镜像保存成tar归档文件
docker export -o tomcat.tar [CONTAINER ID]
#载入打包的镜像
docker import tomcat.tar tomcat:latest

#总结一下docker save和docker export的区别:
1.docker save保存的是镜像(image),docker export保存的是容器(container);
2.docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
3.docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
#注:docker save保存的镜像docker load不能载入,docker export保存的镜像,docker import不能载入
#详解请看:https://blog.csdn.net/liukuan73/article/details/78089138

删除repo不none空tag为none的镜像

在docker中,一个镜像的所有标记(TAG)都被删除,而镜像仍然还在时,我们称之为dangling状态。这种镜像,在通过docker images(或者docker image ls)时,会表现为REPOSITORY和TAG都是,但是IMAGE ID有效。要删除这种镜像很简单,直接执行docker image prune即可清除。

还有另外一种状态的镜像,就是其REPOSITORY是有效的,但是其TAG是,这个时候这种镜像既无法通过prune清除,也无法通过常规的docker image rm来删除。

在docker images查看镜像列表时,默认是不会显示镜像的digest的。需要手动加上–digests=true参数,才能看到形如“sha256:xxxxx”的digest信息。这个时候,用镜像的REPOSITORY➕@➕digest即可精确引用到该镜像,从而删除。

比如,通过docker images –digests=true看到如下镜像:

1
2
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
node <none> sha256:016052a6780d578fff9ac8822e66dd483db6ffb94573028b36cdd6ea48e98082 993f38da6c6c 11 days ago 677MB

可以看到,这个node镜像,他的TAG是none,DIGEST是sha256:016052a6780d578fff9ac8822e66dd483db6ffb94573028b36cdd6ea48e98082。这个镜像无法通过docker rmi node或者docker rmi node:删除。如果要删除它,需要执行

1
docker rmi node@sha256:016052a6780d578fff9ac8822e66dd483db6ffb94573028b36cdd6ea48e98082

清理overlay2

查看Docker的磁盘使用情况
1
2
3
4
5
6
[root@localhost docker]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 70 70 9.231GB 1.601GB (17%)
Containers 200 138 4.292GB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
查看当前目录最大的文件或目录的前五个
1
2
cd /var/lib/docker/containers/
du -h --max-depth=1 |sort -rn |head -n 5
可清理容器的启动日志
1
2
ls -lh #查看占用最大的文件为id-json.log
cat /dev/null > *-json.log
自动清理磁盘
1
2
3
4
5
6
7
8
9
10
11
docker system prune
该指令默认会清除所有如下资源:
已停止的容器(container)
未被任何容器所使用的卷(volume)
未被任何容器所关联的网络(network)
所有悬空镜像(image)
该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。
添加 -a 或 --all 参数后,可以一并清除所有未使用的镜像和悬空镜像。
可以添加 -f 或 --force 参数用以忽略相关告警确认信息

注意:docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了,所以使用之前一定要想清楚。
删除所有退出状态的容器
1
docker container prune
删除未被使用的数据卷
1
docker volume prune
删除 dangling 或所有未被使用的镜像(镜像ID和标签都已被删除,并以none 关键字表示 。称为 虚悬镜像dangling image)
1
docker image prune #
查看僵尸目录
1
docker volume ls -qf dangling=true
删除僵尸目录
1
docker volume rm $(docker volume ls -qf dangling=true
查看容器的logs大小进行清理
1
ll /var/lib/docker/overlay2/197c3988758a714fd0affa0dbbc9137f74e92d5e249f58c29f75cf6dcb1f8bb2/diff/workspace/logs
通过目录名id查看对应的pod
1
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | egrep 8f06b3a04cedc6717e7d3b639d2be75006e6f897d75cc17fbf09f11a39b5d633

docker build 命令行交互

构建elasticsearch,想一起把 ik分词器整合进去,发现构建失败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ubuntu@ubuntu:~/docker/elasticsearch-ik$ docker build -t elastic-ik . --no-cache
Sending build context to Docker daemon 4.507MB
Step 1/3 : FROM docker.elastic.co/elasticsearch/elasticsearch:6.5.4
---> 93109ce1d590
Step 2/3 : ENV VERSION=6.5.4
---> Running in 520c5b73edc8
Removing intermediate container 520c5b73edc8
---> 96e96aa28b66
Step 3/3 : RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v${VERSION}/elasticsearch-analysis-ik-$VERSION.zip
---> Running in 5fd671edd1eb
-> Downloading https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/elasticsearch-analysis-ik-6.5.4.zip
[=================================================] 100%??
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.net.SocketPermission * connect,resolve
See Permissions in the JDK
for descriptions of what these permissions allow and the associated risks.

Exception in thread "main" java.lang.IllegalStateException: unable to read from standard input; is standard input open and a tty attached?
at org.elasticsearch.cli.Terminal$SystemTerminal.readText(Terminal.java:173)
at org.elasticsearch.plugins.PluginSecurity.prompt(PluginSecurity.java:74)
at org.elasticsearch.plugins.PluginSecurity.confirmPolicyExceptions(PluginSecurity.java:67)
at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:801)
at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:775)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:231)
at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
at org.elasticsearch.cli.Command.main(Command.java:90)
at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)
The command '/bin/sh -c /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v${VERSION}/elasticsearch-analysis-ik-$VERSION.zip' returned a non-zero code: 1

根据命令行提示可以看到, 再第三步的时候,也就是安装 ik分词器的时候,提示需要额外的权限 WARNING: plugin requires additional permissions

然后进入到 第二步的镜像中查看原因 docker run -it 96e96aa28b66 /bin/bash

安装 ik 分词器的时候需要一次确认交互

Dockerfile

1
2
3
4
5
6
7
FROM docker.elastic.co/elasticsearch/elasticsearch:6.5.4

ENV VERSION=6.5.4

#COPY elasticsearch-analysis-ik-$VERSION.zip /tmp/

RUN sh -c '/bin/echo -e "y" | /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v${VERSION}/elasticsearch-analysis-ik-$VERSION.zip'