安装

Docker Desktop: https://www.docker.com/products/docker-desktop/
Docker Hub: https://hub.docker.com/

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# docker image
docker pull postgres
docker image ls
docker image rm image-name # remove image-name
docker rmi image-name # remove image-name
docker image inspect image-name

# start container
docker run --name mypgsql -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password -e POSTGRES_HOST_AUTH_METHOD=password -d postgres

# maintain
docker ps
docker stats CONTAINER
docker logs -f CONTAINER
dokcer exec -it CONTAINER /bin/sh
docker top CONTAINER

# docker system
docker system df
docker builder prune # clean build cache
docker container prune # clean unused container

# build image
docker build -t tagname -f path/to/Dockerfile .

# registry
docker login
docker login registry.gitlab.com

# network
docker network create -d bridge test-net
docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash

# save
docker save busybox > busybox.tar
docker save -o fedora-latest.tar fedora:latest
docker save myimage:latest | gzip > myimage_latest.tar.gz

# export
docker export 1e560fca3906 > ubuntu.tar
cat docker/ubuntu.tar | docker import - test/ubuntu:v1

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# this is builder
FROM golang:1.18.0-buster as builder
RUN apt-get update && apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*

COPY . /sources
RUN cd /sources && make build

FROM debian:buster-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates libaio1 \
&& rm -rf /var/lib/apt/lists/*

COPY --from=builder /sources/bin /usr/local/bin
COPY --from=builder /sources/resources /usr/local/resources

ENV SOME_ENV="env-value"

WORKDIR /usr/local

EXPOSE 80
EXPOSE 443

CMD ["/usr/local/bin/my-program"]

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

1
COPY hom* /mydir/ COPY hom?.txt /mydir/

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行
  • RUN 是在 docker build

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

格式:

ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...

ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效。

docker-compose

1
2
3
4
5
6
7
8
9
docker-compose -f file.yaml up -d
docker-compose -f file.yaml up service_name -d
docker-compose -f file.yaml image
docker-compose -f file.yaml down
docker-compose -f file.yaml [start, stop, restart] service_name
docker-compose -f file.yaml config |less

# remove deleted service
docker-compose -f file.yaml up -d --remove-orphans

Dockfile Example:

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
version 3.7

networks:
net-test:
name: net-test

services:
haproxy:
networks:
- net-test
image: haproxy:latest
command: |
/usr/local/bin/haproxy
--set-args-1:value-1
--set-args-2:value-2
--gprc:http://service_a:3366
ports:
- "10.0.0.1:1122:1122"
- "10.0.0.1:1133:1133"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volmes:
- ./config:/usr/local/haproxy/config
depends_on:
- service_a
- service_b

service_a:
...

service_b:
...

Network Alias

虚拟多个IP地址,将container内的端口绑到独立的IP上,以更真实的方式模拟发布环境。

1
2
3
4
5
6
7
# up
ifconfig en0 alias 10.0.0.10 netmask 0xFFFFFFFF up
ifconfig en0 alias 10.0.0.11 netmask 0xFFFFFFFF up

# down
ifconfig en0 10.0.0.10 delete
ifconfig en0 10.0.0.11 delete