Docker 基本使用

停止并删除所有容器

1
$ docker stop $(docker ps -q) docker rm $(docker ps -aq)

清理镜像

1
2
3
4
5
# 清理 dangling 镜像
$ docker rmi $(docker images -f "dangling=true" -q)

# 根据通配符查找删除指定镜像
$ docker rmi $(docker images -f "reference=*" --format "{{.Repository}}:{{.Tag}}")

创建 Swarm 集群以及其基本操作

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
# 修改 node name
$ sudo hostnamectl set-hostname {$name}
$ sudo systemctl restart docker

# manager: 创建 swarm 集群
$ docker swarm init

# 创建 swarm 集群时指定 ip 和通讯的 udp 端口 (针对云服务器上部分环境时需用到)
$ docker swarm init --advertise-addr 1.2.3.4 --data-path-port 12345

# node: 加入 swarm 集群
$ docker swarm join ......

# 获取加入token
$ docker swarm join-token [worker|manager]

# manager: 查看节点
$ docker node ls

# 部署单个服务
$ docker service create --replicas 3 -p 80:80 --name nginx nginx

# 查看服务
$ docker service ls

# 服务伸缩
$ docker service scale nginx=5

# 删除服务
$ docker service rm nginx

# 根据 yaml 文件部署包含多个服务的 stack
$ docker stack deploy -c xxxx.yml one-stack

# 根据 yaml 文件部署 stack 时能读取同层 .env 文件内设置的环境变量
$ docker stack deploy -c <(docker-compose -f xxxx.yml config) one-stack

# 根据 yaml 文件部署 stack 时能读取同层 .env 文件内设置的环境变量, 从私库拉取镜像
$ docker stack deploy --with-registry-auth -c <(docker-compose -f xxxx.yml config) one-stack

# 查看 stack
$ docker stack ls

# 查看 stack 中的服务
$ docker stack ps one-stack

# 停止删除 stack (该命令不会移除服务所使用的数据卷,移除数据卷用 docker volume rm)
$ docker stack down one-stack

# 更新 service 镜像, 从私库拉取
$ docker service update --with-registry-auth --image image-name:tag service-name

# 批量删除 service
$ docker service rm $(docker service ls -qf name=)

# 指定 service 在某个 node 运行
# 给 node 打标签
$ docker node update --label-add run-a=1 xxxxxx
# 给 service 加入约束条件
$ docker service update --constraint-add "node.labels.run-a==1" swarm_a

Docker Compose 文件相关配置

1
2
3
4
5
6
7
8
9
10
test: &base
a: 1
b: 2

use1: *base

use2:
<<: *base
b: 3
c: 4
1
2
3
4
5
6
7
8
9
10
11
12
test:
a: 1
b: 2

use1:
a: 1
b: 2

use2:
a: 1
b: 3
c: 4

Dockerfile

  • ONBUILD 指令

    • 格式:ONBUILD <其它指令>ONBUILD是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

    • 1
      2
      3
      4
      5
      6
      7
      FROM node:slim
      RUN mkdir /app
      WORKDIR /app
      ONBUILD COPY ./package.json /app
      ONBUILD RUN [ "npm", "install" ]
      ONBUILD COPY . /app/
      CMD [ "npm", "start" ]
    • 这样各个子镜像在构建的时候就不需要重复加入上面三行命令

  • 多阶段构建

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      FROM golang AS build-env
      ADD . /go/src/app
      WORKDIR /go/src/app
      RUN go get -u -v github.com/kardianos/govendor
      RUN govendor sync
      RUN GOOS=linux GOARCH=386 go build -v -o /go/src/app/app-server

      FROM alpine
      RUN apk add -U tzdata
      RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      COPY --from=build-env /go/src/app/app-server /usr/local/bin/app-server
      EXPOSE 8080
      CMD [ "app-server" ]
    • 默认情况下,构建阶段是没有命令的,我们可以通过它们的索引来引用它们,第一个 FROM 指令从0开始,我们也可以用 AS 指令为阶段命令,比如我们这里的将第一阶段命名为 build-env,然后在其他阶段需要引用的时候使用 --from=build-env 参数即可