文章

docker命令集合

1. 删除所有没有被任何容器使用的 Docker 镜像

1
2
docker image prune -a -f
    不加 -f,需要手动确认

2. docker run [ENTRYPOINT] 或者 [CMD]

共同点

用于在Dockerfile和Docker Compose files里配置容器的运行命令

ENTRYPOINT特殊点

用于设定容器启动时第一个运行的命令及其参数

注意:

1
2
dockerfile中大写: ENTRYPOINT
docker-compose中小写: entrypoint

特性:

  1. 任何使用docker run image_name
    1. 命令传入的参数都会附加在entrypoint指令之后docker run image_name bash
    2. bash命令附加在entrypoint指令设定的值的后面
  2. 用此命令传入的参数会覆盖在Dockerfile中使用CMD指令设定的值

命令格式

ENTRYPOINT [“executable”, “param1”, “param2”]

eg:

1
2
   ENTRYPOINT ["/docker-entrypoint.sh"]
   ENTRYPOINT [ "sh", "-c", "echo $HOME" ]

dockerfile:

1
   ENTRYPOINT ["/bin/ping","-c","3"]

docker-compose:

1
2
3
4
5
6
7
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit


3. 删除 “exit” 状态的容器

docker rm $(docker ps -a --filter "status=exited" -q)

4.进入镜像内部

1
2
法一:
docker run -it -t --entrypoint bash 2440077fc65e(镜像ID)

5.打标签

1
docker tag 700e99d2e16d fscloude/alpine:v3.12.4_test

6.提交容器: 将内容修改后的容器,固化成一个新镜像

1
docker commit -p my_first_alpine6 fscloude/alpine:v3.12.4_test

7.推送镜像

1
docker push docker.io/fscloude/alpine:v3.10.3

8.以root用户登录启动的容器

1
docker exec -ti --user root jenkins_confum /bin/bash

9.指定dockerfile启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker build -t fscloude/fscloude/ai_commodity:1.0.0 -f /opt/docker_file/dockerfile_ai_commodity . --no-cache
/opt/docker_file/dockerfile_ai_commodity dockerfile文件

指定环境变量或参数 --build-arg environment=dev
docker build -t registry.cn-hangzhou.aliyuncs.com/shmuker/collect-server_dev:1.0.0 --build-arg environment=dev -f /opt/jenkins/dockerfile/Dockerfile-python-collect-server . --no-cache

cat /opt/jenkins/dockerfile/Dockerfile-python-collect-server 
#FROM registry.cn-hangzhou.aliyuncs.com/shmuker/python:3.6.5
FROM python:3.6.5
ARG environment
ENV environment=$environment
ENV TZ Asia/Shanghai
RUN echo "Asiz/Shanghai" > /etc/timezone && ln -sf /usr/share/zoneinfo/Asiz/Shanghai /etc/localtime
WORKDIR /opt/
COPY ./collect-server/ /collect-server
RUN cd /collect-server && pip install -r requirements.txt -i https://python:12345678@nexus.cnabke.com/repository/group-pypi/simple --trusted-host=nexus.cnabke.com
ENTRYPOINT ["/bin/bash","-c","cd /collect-server && python manager.py"]

10.纯净启动,停止后无遗留

1
docker run -d --rm -p 8081:80 -v /data/www/test1.com:/usr/local/web --name nginx nginx:1.18-alpine

11.查看当前占用资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker stats --no-stream

格式化输出的结果
 docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" 

 docker ps -a --format "table docker ps -a --format "table {{.Names}}\t{{.Ports}}\t{{.Status}}\t{{.Images}}" | grep -v Exited 

不知道变量名的时候可以执行这个:
 docker ps --format='{{json .}}' 

获取所有容器的ip

以下三条命令都可以

 docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq) 
 docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) 
 docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) 

12.查看多有停止的docker

1
docker ps -qf status=exited

13. 以当前宿主机网络为主 –network=host

1
docker run -ti -d --name customs-data-collect-server-dev --network=host registry.cn-hangzhou.aliyuncs.com/shmuker/collect-server_dev:1.0.1 

14. 启动Nginx镜像

1
2
3
docker exec 容器id nginx -t 
//重新加载nginx配置
docker exec 容器id  nginx -s reload 

15. 搜索/下载镜像

1
2
3
docker search alpine
docker pull alpine          下载最新版
docker pull alpine:3.10.3 或 docker.io/library/alpine:3.10.3   下载指定版本

16. docker启动容器

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
交互式启动
~]# docker run -ti fscloude/alpine /bin/sh  docker运行指定镜像 + 命令

非交互式启动:使用创建一个进程自动删除 docker ps -a 查不出来。易用于 仅执行一次的环境
~]# docker run --rm fscloude/alpine:latest /bin/echo "hellow"   

非交互式后台启动: 启动时必须指定执行某个命令 否则会直接关闭此启动容器
~]# docker run -d --name my_first_alpine fscloude/alpine:latest /bin/sleep 10   让此容器进入后台10s后退出

注:尽管使用容器启动的进程,但是在宿主机上也能查到此进程,ps -ef,说明容器使用的是宿主机的内核

进入启动容器的内部
~]# docker exec -ti ba5e2a9cc64a /bin/sh
/ # ps -ef 
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sleep 300
    6 root      0:00 /bin/sh
   11 root      0:00 ps -ef
/ #  

    以守护形式运行容器
        Ctrl+P
        Ctrl+Q
docker attach dockerfile_ubuntu_web/df0d417a1598

    

17. docker容器启停

1
2
3
4
5
6
7
8
9
10
11
12
13
容器的启停: 重新启动此容器,重新开始
~]# docker stop ba5e2a9cc64a
~]# docker start ba5e2a9cc64a
~]# docker restart ba5e2a9cc64a
 
删除容器: 删除之后 docker ps -a查不出来
~]# docker rm bold_feistel(NAMES)
~]# docker rm 10b819f357a9(CONTAINER ID)
~]# docker rm -f 10b819f357a9(CONTAINER ID)

循环删除已退出的容器
~]# for i in `docker ps -a | grep -i exit | awk '{print $1}'`;do docker rm -f $i; done

18. 自定义容器

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
提交容器: 将内容修改后的容器,固化成一个新镜像
~]# docker commit -p my_first_alpine6 fscloude/alpine:v3.12.4_test

导出容器
~]# docker save 700e99d2e16d > alpine_3.12.4_test.tar
~]# docker rmi 700e99d2e16d

导入容器
~]# docker load < alpine_3.12.4_test.tar 
~]# docker tag 700e99d2e16d fscloude/alpine:v3.12.4_test
    

单次启动比较好的方式
~]# docker run --rm --name my_second1 -ti fscloude/alpine:v3.12.4_test /bin/bash


查看容器日志: 查看的是启动后的ID
~]# docker logs 7317d943dda2(CONTAINER ID)

docker高(升)级操作
映射端口
    docker run -p 容器外端口:容器内端口
~]# docker pull nginx:1.18.0
~]# docker run --rm -d --name my_first_nginx -p81:80 fscloude/nginx:v1.18.0
挂载数据卷
    docker run -v 容器外目录:容器内目录
~]# mkdir /root/html && wget www.baidu.com index
html]# docker run -ti --rm -d --name nginx_v1.18.0_baidu -p 82:80 -v /root/html/:/usr/share/nginx/html fscloude/nginx:v1.18.0

检查(查看)容器启动的详细信息
docker inspect 1d1077309873(CONTAINER ID)

传递环境变量
    docker run -e 环境变量key=环境变量value

使用dockerfile创建镜像
docker名字必须是: Dockerfile
docker build -t='fscloude/dockerfile_test_first' /data/docker_save/dockerfile/
/data/docker_save/dockerfile/ 此目录下存放Dockerfile文件


# First dockerfile for test
FROM ubuntu:14.04
MAINTAINER fscloude
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

dockerfile执行出现问题    
![](leanote://file/getImage?fileId=619377a4cfd25f4e550003eb)
    解决
    ENV DEBIAN_FRONTEND noninteractive        #apt-get安装依赖时并非静默安装,需要交互

FROM 使用方法
FROM <image>
FROM <image>:<tag>
image 镜像名称
tag  版本名称


MAINTAINER 使用方法
MAINTAINER <name>   
name 指定镜像的作者信息吗,包含镜像的所有者和联系信息

RUN 使用方法
RUN <command>  (shell模式)
RUN [ "executable", "param1", "param2" ] (exec模式)
    可以指定其他的shell运行指令
    RUN ["/bin/bash", "-c", "echo hello"]

EXPOSE 使用方法
EXPOSE <port> [<port>...]
指定运行该镜像的容器使用的端口
    只是说明会用到哪个端口,不会开启
    仍然需要使用 docker run 执行指定端口
    docker run -ti --rm -d --name dockerfile_ubuntu_web -p 83:80 fscloude/ngindddx:v1.18.0
    
CMD 和 ENTERYPOINT 指定在容器 运行时 执行的命令
CMD 
    是容器默认执行的指令,使用 docker run 执行的指令会覆盖 CMD指令
    CMD 包含 RUN 使用的两种方式,再加一种
        CMD <command> param1 param2 (shell模式)
        CMD [ "executable", "param1", "param2" ] (exec模式)
        CMD ["param1", "param2"] 作为 ENTERYPOINT 指令的默认参数
    
    eg:
        # First dockerfile for test
        FROM ubuntu:14.04
        MAINTAINER fscloude
        RUN apt-get update
        RUN apt-get install -y nginx
        EXPOSE 80        
        CMD ["/usr/sbin/nginx", "-g", "dameon off;"] 
        
ADD COPY 和 VOLUME 设置镜像的目录和文件


WORKDIR ENV 和 USER 在构建及运行镜像时的环境设置


ONBUILD 类似触发器的指令 

19. 查看网卡挂载了哪些容器

1
2
3
docker network inspect 网卡名称
eg: 
    docker network inspect aibus-dev

20. 查看 Docker 镜像每一层的具体操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker history <镜像名或ID>

该命令会显示每层的:
	镜像 ID(部分层可能被隐藏显示为<missing>)
	创建时间
	执行的 Dockerfile 指令
	层大小
	注释信息

# 默认可能有截断,显示完整的需要加参数: --no-trunc:
docker history --no-trunc <镜像名或ID> 

# 以json输出,更易看
 docker history <镜像名或ID>  --no-trunc --format '{{json .}}'  | jq 

查看详细内容

1
2
3
4
5
6
7
8
9
10
11
12
docker inspect <镜像名或ID>


在输出的 JSON 数据中,RootFS字段下的Layers数组列出了所有层的存储路径:
"RootFS": {
  "Type": "layers",
  "Layers": [
    "sha256:8d691f585fa8...",
    "sha256:3c81...",
    ...
  ]
}

查看特定层的元数据

1
docker inspect <层ID>
本文由作者按照 CC BY 4.0 进行授权