命令图解

docker 使用总结 - 图1

docker 基础

查看信息/帮助

  1. $ docker version # 显示 docker 的版本信息
  2. $ docker info # 显示 docker 的系统信息,包括镜像、容器等
  3. $ docker xxx --help # 帮助命令

镜像命令

  • 列出本地镜像 ```shell $ docker images

options

-a, —all # 列出所有镜像 -q, —quiet # 只显示镜像 id

  1. - docker hub 上搜索镜像
  2. ```shell
  3. $ docker search xxxxx
  4. # options
  5. --filter=STARS=3000 # 只展示 STARS 数在 3000 以上的
  • 从 docker hub 拉取镜像到本地

    1. $ docker pull xxx[:TAG] # TAG 可选,如果不写,默认是 latest
  • 删除本地镜像

    1. $ docker rmi 镜像名/id # 删除镜像
    2. $ docker rmi 镜像名/id 镜像名/id # 删除多个镜像
    3. $ docker rmi $(docker images -aq) # 删除所有镜像

容器命令

  • 创建并启动容器 ```shell $ docker run [options] 镜像名/id [cmd]

options

—name=”xxx” # 为容器设置名字,用来区分容器 —rm # 容器停止后自动删除 -e KEY=value # 设置环境变量 -d # 守护态运行 -it # 使用交互方式运行,这样可以进入容器 -p # 映射端口 -p 主机端口:容器端口(最常用) -p ip:主机端口:容器端口 -P # 将主机的所有端口映射到容器上 -v xxx:xxx[:args] # 挂载数据卷或目录到容器 -v 主机目录:容器内目录 # 将主机目录挂载到容器内目录 -v 容器内目录 # 匿名挂载。创建一个数据卷并挂载到容器内目录,数据卷名随机 -v 数据卷名:容器内目录 # 具名挂载。创建一个数据卷并挂载到容器内目录

  1. # args
  2. ro # 只读。容器内无法修改,只能读取(容器外可以修改)
  3. rw # 可读可写。如果不写权限,默认就是 rw

—volumes-from=容器id # 继承已有容器的数据卷,可以方便的实现容器间数据卷共享

  1. - 退出容器(在容器中时)
  2. ```shell
  3. EOF # 退出并停止容器
  4. ctrl + p + q # 退出但不停止容器
  • 进入容器

    1. $ docker exec -it 容器id /bin/bash # 进入容器并在新的会话中执行 /bin/bash(常用)
    2. $ docker attach 容器id # 进入容器,使用容器中原有的会话,不创建新会话
  • 查看容器 ```shell $ docker ps # 列出正在运行的容器

options

-a # 列出所有容器 -n=num # 列出最近创建的 num 个容器 -q # 只显示容器 id

  1. - 删除容器
  2. ```shell
  3. $ docker rm 容器id # 删除容器
  4. $ docker rm -f $(docker ps -aq) # 删除所有容器
  5. # options
  6. -f # 强行删除容器(如果不加这个参数,无法删除正在运行的容器)
  • 启动/停止容器(从容器外部)
    1. $ docker start 容器id # 启动容器
    2. $ docker restart 容器id # 重启容器
    3. $ docker stop 容器id # 停止容器
    4. $ docker kill 容器id # 强制停止容器

数据卷命令

  • 列出数据卷

    1. $ docker volume ls
  • 查看数据卷的元数据

    1. $ docker volume inspect 数据卷名

其他常用命令

  • 查看容器日志 ```shell $ docker logs -tf —tail 日志条数 容器id

options

-t # 显示时间戳 -f # follow log output —tail num # 显示末尾 num 条日志

  1. - 查看容器内部的进程信息
  2. ```shell
  3. $ docker top 容器id
  • 查看镜像/容器的元数据

    1. $ docker inspect 镜像id/容器id
  • 主机和容器互相拷贝文件

    1. $ docker cp 容器id:容器内路径 主机路径 # 从容器拷贝文件到主机
    2. $ docker cp 主机路径 容器id:容器内路径 # 从主机拷贝文件到容器
  • commit 镜像
    当运行一个容器时,我们做的任何文件修改都会被记录于容器存储层里(如果不使用卷的话)。docker commit 命令可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。一般不推荐使用 docker commit,而是提倡使用 Dockerfile 定制镜像以修改容器。docker commit 一般仅在紧急情况下保护现场使用。

    1. $ docker commit -m="提交的描述信息" -a="作者" 容器id 新镜像名[:TAG]
  • 查看镜像的生成过程

    1. $ docker history 镜像名/id

用 Dockerfile 构建镜像

编写 Dockerfile

  1. # 指定基础镜像(如 scratch, centos, ubuntu)
  2. FROM image[:tag]
  3. # 声明镜像的作者
  4. MAINTAINER name<email>
  5. # 设置工作目录
  6. WORKDIR /path/to/dir
  7. # 设置环境变量
  8. ENV KEY1=value1 KEY2=value2
  9. # 指定容器需要映射到宿主机的端口
  10. EXPOSE port1 port2 port3
  11. # 挂载匿名卷
  12. # docker run 时会自动创建匿名卷挂载到 VOLUME 指令指定的目录下
  13. VOLUME ["/path/to/dir1", "/path/to/dir2"]
  14. # 运行命令
  15. # 如果有多个命令需要执行,尽量不要写多个 RUN,而是用 && 或 ; 将多个命令一起执行,只写一个 RUN,因为每条 RUN 都会成为一层镜像
  16. RUN command # command 会用 `/bin/sh -c` 的方式执行
  17. RUN ["command", "param1", "param2"]
  18. # CMD 会被拼接到 ENTRYPOINT 后面作为容器启动时执行的命令
  19. # 如果写了多条 ENTRYPOINT,只有最后一条有效
  20. ENTRYPOINT command
  21. ENTRYPOINT ["command", "param1", "param2"]
  22. # 如果写了多条 CMD 指令,只会执行最后一条
  23. # docker run 时如果写了 cmd,只会执行该 cmd,而不执行 dockerfile 中指定的 cmd
  24. CMD command
  25. CMD ["command/param", "param1", "param2"]
  26. # 复制文件
  27. # 第一个参数是相对路径(相对于 "上下文路径")
  28. # 第二个参数是容器内的绝对路径
  29. # 支持通配符
  30. COPY filename/dirname /path/to/dir
  31. # 更高级的复制文件
  32. # 基本功能与 COPY 相同,不过在 COPY 的基础上添加了一些功能
  33. # 1. 源路径可以是个 URL,docker 引擎会自动下载文件
  34. # 2. 源路径如果是 .tar .tar.gz .tar.bz2 .tar.xz 文件,会自动解压。如果不想解压,就必须使用 COPY 了
  35. ADD filename/dirname/URL /path/to/dir

注意:一般要在 Dockerfile 中写命令以清除构建过程中下载安装的包、apt 缓存等,防止镜像臃肿。

构建镜像

  • 从指定路径构建 ```shell $ docker build -t 镜像名[:TAG] -f Dockerfile路径 上下文路径

“上下文路径” 中的所有文件都会用来构建镜像,如果不想发送某些文件,可以用 .gitignore 一样的语法写一个 .dockerignore

如果没指定 Dockerfile 的路径,会默认在上下文路径中寻找 Dockerfile

  1. - 从压缩包构建
  2. ```shell
  3. $ docker build -t 镜像名[:TAG] xxx.tar.gz # 用本地压缩包构建
  4. $ docker build -t 镜像名[:TAG] https://xxx.com/xxx.tar.gz # 从远程压缩包构建
  • 从远程 git 仓库构建
    1. $ docker build -t 镜像名[:TAG] https://github.com/username/repo.git

发布镜像

发布镜像到 Docker hub:

  1. $ docker login
  2. $ docker push 作者/镜像名:TAG

发布镜像到 阿里云镜像服务:

  1. 浏览器登陆阿里云的容器镜像服务
  2. 创建命名空间和镜像仓库,镜像仓库可以选择公有或私有
  3. 点击镜像仓库,会有详细的操作步骤

docker 网络

docker 使用总结 - 图2

如图,同一个网络的容器会使用 veth-pair 技术与 docker0 相连。docker0 相当于路由器。

创建容器时默认会使用 docker0,容器之间不能通过 容器名/id 互相访问,只能通过 ip 互相访问。

自己创建的网络中的容器支持通过 容器名/id 互相访问。一般一个集群使用一个网络。

创建网络:

  1. $ docker network create [options] 网络

列出所有网络:

  1. $ docker network ls

查看网络元信息:

  1. $ docker network inspect 网络

将一个网络中的某个容器与另一个网络建立连接(原理是为这个容器分配两个 ip):

  1. $ docker network connect 网络 容器名/id