一些资料

安装、概念、操作

官方仓库

docker-compose 常用命令

docker.io 和 docker-ce 的区别

镜像基础

常用命令

  • 获取镜像

    1
    2
    3
    4
    docker pull --help
    docker pull ubuntu:18.0.4

    # 如果命令没有给出Docker镜像仓库的地址,会默认从DockerHub(docker.io)获取镜像
  • 运行

    1
    2
    3
    4
    5
    docker run -it --rm ubuntu:18.0.4 bash

    # -i: 交互操作; -t: 终端
    # --rm: 容器退出后随之将其删除,如果只是看看结果不需要排障和保留结果,这个命令可以避免浪费空间
    # bash: 放在镜像后的是命令,这里希望有个交互式的Shell,因此使用bash
  • 列出镜像

    1
    2
    3
    4
    5
    6
    docker image ls
    docker image ls ubuntu
    docker image ls ubuntu:18.04
    docker image ls -f since=mongo:3.2
    docker image ls --format "{{.ID}}: {{.Repository}}" # 只列出镜像ID和仓库名
    docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" # 表格等距显示
  • 查看镜像、容器、数据卷所占空间

    1
    docker system df
  • 删除镜像

    1
    2
    docker image rm 501 # 一般输入ID前3个字符以上就行
    docker image rm centos

容器基础

当使用docker run来创建容器时,Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从 registry 下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

常用命令

  • 新建并启动

    1
    2
    3
    docker run ubuntu:18.0.4 /bin/echo 'hello world'

    Hello world
  • 启动一个bash终端,允许用户交互

    1
    docker run -it ubuntu:18.0.4 /bin/bash
  • 后台运行而不是把执行命令结果输出在当前宿主机下

    1
    2
    3
    4
    5
    $ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

    77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

    # 输出结果可以用docker logs查看
  • 查看容器信息

    1
    docker container ls -a
  • 查看容器状态

    1
    docker ps -a
  • 获取容器输出信息

    1
    2
    3
    4
    5
    6
    docker container logs [container ID or NAMES]

    hello world
    hello world
    hello world
    ...
  • 终止运行中的容器

    1
    docker container stop [container ID or NAME]
  • 启动一个终止状态的容器

    1
    2
    docker container start [container ID or NAME]
    docker container restart [container ID or NAME]
  • 进入一个容器

    1
    2
    3
    4
    docker attach 243c
    docker exec -it 69d1 bash

    # 推荐使用docker exec,原因在于attach命令如果exit的化,会导致容器停止,而exec的话不会停止容器
  • 导出本地容器

    1
    2
    3
    4
    5
    $ docker container ls -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    7691a814370e ubuntu:18.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test

    $ docker export 7691a814370e > ubuntu.tar
  • 从容器快照文件中导入为镜像

    1
    2
    3
    4
    5
    $ cat ubuntu.tar | docker import - test/ubuntu:v1.0

    $ docker image ls
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB

    用户既可以使用docker load来导入镜像存储文件到本地镜像库,也可以使用docker import来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息

  • 删除容器

    1
    docker container rm trusting_newton

Dockfile 定制镜像

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建

FROM 指定基础镜像

FROM 是一个Dockerfile中必备的第一条指令

1
FROM ubuntu:22.04

RUN 执行命令

RUN 指令用来执行命令行命令

1
2
3
RUN wget https://github.com/Dreamacro/clash/releases/download/v1.13.0/clash-linux-arm64-v1.13.0.gz \
&& gzip -d clash-linux-arm64-v1.13.0.gz \
&& chmod +x clash-linux-arm64-v1.13.0 \

由于Dockerfile中的每一个指令都会建立一层。每一个 RUN 的行为也会新建一层,然后再其上执行命令,在编写 Dockfile 文件的时候,应该注意不要建立太多层,这样会导致产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错

COPY 复制文件

1
2
3
COPY package.json /usr/src/app/

# 从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
  • 通配符指定源路径
    1
    2
    3
    4
    COPY hom* /mydir/
    COPY hom?.txt /mydir/

    # 通配符规则要满足 Go 的 filepath.Match 规则

CMD 容器启动命令

CMD 指令用于指定默认的容器主进程的启动命令

1
2
CMD echo $HOME      # shell格式
CMD [ "sh", "-c", "echo $HOME" ] # exec格式

ENV 设置环境变量

1
2
3
4
ENV VERSION=1.0 DEBUG=on \
NAME="Happy Feet"

ENV NODE_VERSION 7.2.0

Docker Build

1
docker build -t tgbot:v1 .

使用上面的命令创建镜像,注意命令最后面有一个 . ,它表示当前目录

  • 直接用 Git repo 进行构建

    1
    docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world
  • 用给定的 tar 压缩包构建

    1
    docker build http://server/context.tar.gz

。。。

目前用到的就这么多,后面需要的部分再补这学吧