diff --git a/README.md b/README.md index 3a4e317..e786c24 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ - [JDK 安装](docs/linux/soft/jdk-install.md) - [Elastic 安装](docs/linux/soft/elastic) - [Gitlab 安装](docs/linux/soft/kafka-install.md) -- [Jenkins 安装](docs/linux/soft/jenkins-install.md) +- [Jenkins 安装](docs/linux/soft/jenkins.md) - [Kafka 安装](docs/linux/soft/kafka-install.md) - [Maven 安装](docs/linux/soft/maven-install.md) - [Nexus 安装](docs/linux/soft/nexus-install.md) @@ -27,9 +27,9 @@ ## 运维脚本 -- [系统运维脚本集合](codes/linux/sys) -- [软件安装配置脚本集合](codes/linux/soft) -- [工具脚本集合](codes/linux/soft) +- [系统运维脚本集合](https://github.com/dunwu/linux-tutorial/tree/master/codes/linux/sys) +- [软件安装配置脚本集合](https://github.com/dunwu/linux-tutorial/tree/master/codes/linux/soft) +- [工具脚本集合](https://github.com/dunwu/linux-tutorial/tree/master/codes/linux/soft) > 提供一键式安装、配置软件脚本 @@ -49,6 +49,8 @@ - [linux 典型运维应用](docs/linux/ops/linux典型运维应用.md) - [samba 使用详解](docs/linux/ops/samba使用详解.md) - [Docker 教程](docs/docker) + - [Docker 应用指南](docs/docker/docker.md) + - [Docker Cheat Sheet](docs/docker/docker-cheat-sheet.md) - [Git 教程](docs/git/README.md) - [Git 快速指南](docs/git/git-quickstart.md) - [Git 配置](docs/git/git-configuration.md) diff --git a/docs/README.md b/docs/README.md index e802ba8..34cc81c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,58 +1,68 @@ # Linux 教程 -## 软件应用指南 +> :keyboard: 项目同步维护在 [github](https://github.com/dunwu/linux-tutorial) | [gitee](https://gitee.com/turnon/linux-tutorial) +> +> :book: [电子书](https://dunwu.github.io/linux-tutorial/) | [电子书(国内)](http://turnon.gitee.io/linux-tutorial/) -- [JDK 应用指南](linux/soft/jdk-install.md) -- [Elastic 应用指南](linux/soft/elastic) -- [Gitlab 应用指南](linux/soft/kafka-install.md) -- [Jenkins 应用指南](linux/soft/jenkins.md) -- [Kafka 应用指南](linux/soft/kafka-install.md) -- [Maven 应用指南](linux/soft/maven-install.md) -- [Nexus 应用指南](linux/soft/nexus-install.md) -- [Nodejs 应用指南](linux/soft/nodejs-install.md) -- [RocketMQ 应用指南](linux/soft/rocketmq-install.md) -- [Svn 应用指南](linux/soft/svn-install.md) -- [Tomcat 应用指南](linux/soft/tomcat-install.md) -- [Zookeeper 应用指南](linux/soft/zookeeper-install.md) -- [Nacos 应用指南](linux/soft/nacos-install.md) +| :wrench: | :shell: | :memo: | :books: | +| :---------------------------: | :-------------------: | :---------------: | :-------------------: | +| [软件安装配置](#软件安装配置) | [运维脚本](#运维脚本) | [知识点](#知识点) | [学习资源](#学习资源) | -## Linux 命令 - -- [查看 Linux 命令帮助信息](linux/cli/查看Linux命令帮助信息.md) -- [Linux 文件目录管理](linux/cli/Linux文件目录管理.md) -- [Linux 文件内容查看命令](linux/cli/Linux文件内容查看编辑.md) -- [Linux 文件压缩和解压](linux/cli/Linux文件压缩和解压.md) -- [Linux 用户管理](linux/cli/Linux用户管理.md) -- [Linux 系统管理](linux/cli/Linux系统管理.md) -- [Linux 网络管理](linux/cli/Linux网络管理.md) -- [Linux 硬件管理](linux/cli/Linux硬件管理.md) -- [Linux 软件管理](linux/cli/Linux硬件管理.md) - -## Linux 运维 - -- [linux 典型运维应用](linux/ops/linux典型运维应用.md) -- [samba 使用详解](linux/ops/samba使用详解.md) - -## Docker 教程 - -## Git 教程 - -- [Git 快速指南](git/git-quickstart.md) -- [Git 配置](git/git-configuration.md) -- [git-flow 工作流](git/git-flow.md) -- [Git 常见问题](git/git-faq.md) - -## 工具和脚本 - - -- [软件应用指南配置脚本集合](https://github.com/dunwu/linux-tutorial/tree/master/codes/linux/soft) - -> 提供一键式应用指南、配置软件脚本 +## 软件安装配置 +- [JDK 安装](linux/soft/jdk-install.md) +- [Elastic 安装](linux/soft/elastic) +- [Gitlab 安装](linux/soft/kafka-install.md) +- [Jenkins 安装](linux/soft/jenkins.md) +- [Kafka 安装](linux/soft/kafka-install.md) +- [Maven 安装](linux/soft/maven-install.md) +- [Nexus 安装](linux/soft/nexus-install.md) - [Nginx 教程](https://github.com/dunwu/nginx-tutorial) +- [Nodejs 安装](linux/soft/nodejs-install.md) +- [RocketMQ 安装](linux/soft/rocketmq-install.md) +- [Svn 安装](linux/soft/svn-install.md) +- [Tomcat 安装](linux/soft/tomcat-install.md) +- [Zookeeper 安装](linux/soft/zookeeper-install.md) +- [Nacos 安装](linux/soft/nacos-install.md) + +## 运维脚本 + +- [系统运维脚本集合](https://github.com/dunwu/linux-tutorial/tree/master/codes/linux/sys) +- [软件安装配置脚本集合](https://github.com/dunwu/linux-tutorial/tree/master/codes/linux/soft) +- [工具脚本集合](https://github.com/dunwu/linux-tutorial/tree/master/codes/linux/soft) + +> 提供一键式安装、配置软件脚本 + +## 知识点 + +- [Linux 命令教程](linux/cli/README.md) + - [查看 Linux 命令帮助信息](linux/cli/查看Linux命令帮助信息.md) + - [Linux 文件目录管理](linux/cli/Linux文件目录管理.md) + - [Linux 文件内容查看命令](linux/cli/Linux文件内容查看编辑.md) + - [Linux 文件压缩和解压](linux/cli/Linux文件压缩和解压.md) + - [Linux 用户管理](linux/cli/Linux用户管理.md) + - [Linux 系统管理](linux/cli/Linux系统管理.md) + - [Linux 网络管理](linux/cli/Linux网络管理.md) + - [Linux 硬件管理](linux/cli/Linux硬件管理.md) + - [Linux 软件管理](linux/cli/Linux硬件管理.md) +- [Linux 运维](linux/ops/README.md) + - [linux 典型运维应用](linux/ops/linux典型运维应用.md) + - [samba 使用详解](linux/ops/samba使用详解.md) +- [Docker 教程](docker) + - [Docker 应用指南](docker/docker.md) + - [Docker Cheat Sheet](docker/docker-cheat-sheet.md) +- [Git 教程](git/README.md) + - [Git 快速指南](git/git-quickstart.md) + - [Git 配置](git/git-configuration.md) + - [git-flow 工作流](git/git-flow.md) + - [Git 常见问题](git/git-faq.md) - [Vim](linux/tool/vim.md) -- [一篇文章让你彻底掌握 shell 语言](lang/shell.md) -- [一篇文章让你彻底掌握 python 语言](lang/python.md) +- 脚本语言 + - [一篇文章让你彻底掌握 shell 语言](lang/shell.md) + - [一篇文章让你彻底掌握 python 语言](lang/python.md) +- 运维 + - [Linux 典型运维应用](linux/ops/linux典型运维应用.md) + - [samba 使用详解](linux/ops/samba使用详解.md) ## 学习资源 diff --git a/docs/docker/README.md b/docs/docker/README.md new file mode 100644 index 0000000..1eb4ac7 --- /dev/null +++ b/docs/docker/README.md @@ -0,0 +1 @@ +# Docker 教程 diff --git a/docs/docker/practice/docker-install-mysql.md b/docs/docker/action/docker-install-mysql.md similarity index 100% rename from docs/docker/practice/docker-install-mysql.md rename to docs/docker/action/docker-install-mysql.md diff --git a/docs/docker/practice/docker-install-nginx.md b/docs/docker/action/docker-install-nginx.md similarity index 100% rename from docs/docker/practice/docker-install-nginx.md rename to docs/docker/action/docker-install-nginx.md diff --git a/docs/docker/appendix/docker-cli.md b/docs/docker/appendix/docker-cli.md deleted file mode 100644 index 2eab462..0000000 --- a/docs/docker/appendix/docker-cli.md +++ /dev/null @@ -1,139 +0,0 @@ -# Docker 命令 - - - -- [镜像(Images)](#镜像images) -- [容器(Container)](#容器container) - - [生命周期](#生命周期) - - [启动和停止](#启动和停止) - - [信息](#信息) - - [导入 / 导出](#导入--导出) - - [执行命令](#执行命令) -- [网络(Networks)](#网络networks) - - [生命周期](#生命周期-1) - - [信息](#信息-1) - - [链接](#链接) -- [仓管中心和仓库(Registry & Repository)](#仓管中心和仓库registry--repository) -- [Dockerfile](#dockerfile) -- [卷标(Volumes)](#卷标volumes) - - [生命周期](#生命周期-2) - - [信息](#信息-2) -- [引用和引申](#引用和引申) - - - -## 镜像(Images) - -- [`docker image ls`](https://github.com/yeasy/docker_practice/blob/master/image/list.md) - 查看所有镜像。 -- [`docker image rm`](https://github.com/yeasy/docker_practice/blob/master/image/rm.md) - 删除本地镜像。 -- `docker import` - 从压缩文件中创建镜像。 -- `docker export` - 导出既有容器。 -- `docker build` - 从 Dockerfile 创建镜像。 -- `docker commit` - 为容器创建镜像,如果容器正在运行则会临时暂停。 -- `docker rmi` - 删除镜像。 -- `docker load` - 通过 STDIN 从压缩包加载镜像,包括镜像和标签(images and tags) (0.7 起). -- `docker save` - 通过 STDOUT 保存镜像到压缩包,包括所有的父层,标签和版本(parent layers, tags & versions) (0.7 起). -- `docker history` - 查看镜像历史记录。 -- `docker tag` - 给镜像命名打标(tags) (本地或者仓库)。 - -## 容器(Container) - -### 生命周期 - -- `docker create` - 创建一个容器但是不启动。 -- `docker rename` - 允许重命名容器。 -- `docker run` - 在同一个操作中创建并启动一个容器。 -- `docker rm` - 删除容器。 -- `docker update` - 更新容器的资源限制。 - -### 启动和停止 - -- `docker start` - 启动容器。 -- `docker stop` - 停止运行中的容器。 -- `docker restart` - 停止之后再启动容器。 -- `docker pause` - 暂停运行中的容器,将其 "冻结" 在当前状态。 -- `docker unpause` - 结束容器暂停状态。 -- `docker wait` - 阻塞,到运行中的容器停止为止。 -- `docker kill` - 向运行中容器发送 SIGKILL 指令。 -- `docker attach` - 链接到运行中容器。 - -### 信息 - -- `docker ps` - 查看运行中的所有容器。 -- `docker logs` - 从容器中获取日志。(你也可以使用自定义日志驱动,不过在 1.10 中,它只支持 json-file 和 journald) -- `docker inspect` - 查看某个容器的所有信息(包括 IP 地址)。 -- `docker events` - 从容器中获取事件(events)。 -- `docker port` - 查看容器的公开端口。 -- `docker top` - 查看容器中活动进程。 -- `docker stats` - 查看容器的资源使用情况统计信息。 -- `docker diff` - 查看容器的 FS 中有变化文件信息。 - -### 导入 / 导出 - -docker cp 在容器和本地文件系统之间复制文件或文件夹。 -docker export 将容器的文件系统切换为压缩包(tarball archive stream)输出到 STDOUT。 - -### 执行命令 - -docker exec 在容器中执行命令。 - -## 网络(Networks) - -### 生命周期 - -- `docker network create` -- `docker network rm` - -### 信息 - -- `docker network ls` -- `docker network inspect` - -### 链接 - -- `docker network connect` -- `docker network disconnect` - -## 仓管中心和仓库(Registry & Repository) - -- `docker login` - 登入仓管中心。 -- `docker logout` - 登出仓管中心。 -- `docker search` - 从仓管中心检索镜像。 -- `docker pull` - 从仓管中心拉去镜像到本地。 -- `docker push` - 从本地推送镜像到仓管中心。 - -## Dockerfile - -- .dockerignore -- FROM 为其他指令设置基础镜像(Base Image)。 -- MAINTAINER 为生成的镜像设置作者字段。 -- RUN 在当前镜像的基础上生成一个新层并执行命令。 -- CMD 设置容器默认执行命令。 -- EXPOSE 告知 Docker 容器在运行时所要监听的网络端口。注意:并没有实际上将端口设置为可访问。 -- ENV 设置环境变量。 -- ADD 将文件,文件夹或者远程文件复制到容器中。缓存无效。尽量用 COPY 代替 ADD。 -- COPY 将文件或文件夹复制到容器中。 -- ENTRYPOINT 将一个容器设置为可执行。 -- VOLUME 为外部挂载卷标或其他容器设置挂载点(mount point)。 -- USER 设置执行 RUN / CMD / ENTRYPOINT 命令的用户名。 -- WORKDIR 设置工作目录。 -- ARG 定义编译时(build-time)变量。 -- ONBUILD 添加触发指令,当该镜像被作为其他镜像的基础镜像时该指令会被触发。 -- STOPSIGNAL 设置通过系统向容器发出退出指令。 -- LABEL 将键值对元数据(key/value metadata)应用到你的镜像,容器,或者守护进程。 - -## 卷标(Volumes) - -### 生命周期 - -- `docker volume create` -- `docker volume rm` - -### 信息 - -- `docker volume ls` -- `docker volume inspect` - -## 引用和引申 - -https://github.com/wsargent/docker-cheat-sheet/tree/master/zh-cn diff --git a/docs/docker/appendix/docker-glossary.md b/docs/docker/appendix/docker-glossary.md deleted file mode 100644 index 1a21c90..0000000 --- a/docs/docker/appendix/docker-glossary.md +++ /dev/null @@ -1,9 +0,0 @@ -# Docker 术语 - -* **Docker 镜像(Images)**:Docker 镜像是用于创建 Docker 容器的模板。 -* **Docker 容器(Container)**:容器是独立运行的一个或一组应用。 -* **Docker 客户端(Client)**:Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 -* **Docker 主机(Host)**:一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 -* **Docker 仓库(Registry)**:Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。:Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 -* **Docker Machine**:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 -* **Docker Machine**:Dockerfile是一个文本文档,其中包含您通常为了构建Docker镜像而手动执行的所有命令。 Docker可以通过从Dockerfile读取指令自动构建映像。 diff --git a/docs/docker/appendix/docker-recipe.md b/docs/docker/appendix/docker-recipe.md deleted file mode 100644 index b5cc8cb..0000000 --- a/docs/docker/appendix/docker-recipe.md +++ /dev/null @@ -1,23 +0,0 @@ -# Docker 技巧 - -## 命令技巧 - -### 停止所有的 docker container - -_这样才能够删除其中的images_ - -``` -docker stop $(docker ps -a -q) -``` - -### 删除所有的 docker container - -``` -docker rm $(docker ps -a -q) -``` - -### 删除所有的 docker images - -``` -docker rmi $(docker images -q) -``` diff --git a/docs/docker/appendix/docker-resources.md b/docs/docker/appendix/docker-resources.md deleted file mode 100644 index b63122d..0000000 --- a/docs/docker/appendix/docker-resources.md +++ /dev/null @@ -1,30 +0,0 @@ -# Docker 资源 - -## Docker 官方资源 - -- Docker 官网:http://www.docker.com -- Docker Github:https://github.com/moby/moby -- Docker 官方文档:https://docs.docker.com/ -- Docker windows 入门:https://docs.docker.com/windows/ -- Docker Linux 入门:https://docs.docker.com/linux/ -- Docker mac 入门:https://docs.docker.com/mac/ -- Docker 用户指引:https://docs.docker.com/engine/userguide/ -- Docker 官方博客:http://blog.docker.com/ -- Docker Hub: https://hub.docker.com/ -- Docker 开源: https://www.docker.com/open-source - -## 资源整理 - -- Awesome Docker: https://github.com/veggiemonk/awesome-docker - -## Docker 中文资源 - -- Docker 中文网站:https://www.docker-cn.com/ -- Docker 安装手册:https://docs.docker-cn.com/engine/installation/ - -## Docker 国内镜像 - -- 网易加速器:http://hub-mirror.c.163.com -- 官方中国加速器:https://registry.docker-cn.com -- ustc 的镜像:https://docker.mirrors.ustc.edu.cn -- daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用) diff --git a/docs/docker/docker-cheat-sheet.md b/docs/docker/docker-cheat-sheet.md new file mode 100644 index 0000000..58f27ad --- /dev/null +++ b/docs/docker/docker-cheat-sheet.md @@ -0,0 +1,742 @@ +# Docker Cheat Sheet + +> 内容主要搬迁自:[Docker Cheat Sheet](https://github.com/wsargent/docker-cheat-sheet/tree/master/zh-cn) + + + +- [容器(Container)](#容器container) +- [镜像(Images)](#镜像images) +- [网络(Networks)](#网络networks) +- [仓管中心和仓库(Registry & Repository)](#仓管中心和仓库registry--repository) +- [Dockerfile](#dockerfile) +- [层(Layers)](#层layers) +- [链接(Links)](#链接links) +- [卷标(Volumes)](#卷标volumes) +- [暴露端口(Exposing ports)](#暴露端口exposing-ports) +- [最佳实践](#最佳实践) +- [安全(Security)](#安全security) +- [小贴士](#小贴士) +- [参考资料](#参考资料) + + + +## 容器(Container) + +[关于 Docker 进程隔离的基础](http://etherealmind.com/basics-docker-containers-hypervisors-coreos/)。容器 (Container) 之于虚拟机 (Virtual Machine) 就好比线程之于进程。 + +### 生命周期 + +- [`docker create`](https://docs.docker.com/engine/reference/commandline/create) 创建容器但不启动它。 +- [`docker rename`](https://docs.docker.com/engine/reference/commandline/rename/) 用于重命名容器。 +- [`docker run`](https://docs.docker.com/engine/reference/commandline/run) 一键创建并同时启动该容器。 +- [`docker rm`](https://docs.docker.com/engine/reference/commandline/rm) 删除容器。 + - 如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。 +- [`docker update`](https://docs.docker.com/engine/reference/commandline/update/) 调整容器的资源限制。 +- `docker container prune` 清理掉所有处于终止状态的容器。 + +通常情况下,不使用任何命令行选项启动一个容器,该容器将会立即启动并停止。若需保持其运行,你可以使用 `docker run -td container_id` 命令。选项 `-t` 表示分配一个 pseudo-TTY 会话,`-d` 表示自动将容器与终端分离(也就是说在后台运行容器,并输出容器 ID)。 + +如果你需要一个临时容器,可使用 `docker run --rm` 会在容器停止之后删除它。 + +如果你需要映射宿主机 (host) 的目录到 Docker 容器内,可使用 `docker run -v $HOSTDIR:$DOCKERDIR`。详见 [卷标(Volumes)](#卷标volumes) 一节。 + +如果你想同时删除与容器相关联的卷标,那么在删除容器的时候必须包含 `-v` 选项,像这样 `docker rm -v`。 + +从 Docker 1.10 起,其内置一套各容器独立的 [日志引擎](https://docs.docker.com/engine/admin/logging/overview/),每个容器可以独立使用。你可以使用 `docker run --log-driver=syslog` 来自定义日志引擎(例如以上的 `syslog`)。 + +### 启动和停止 + +- [`docker start`](https://docs.docker.com/engine/reference/commandline/start) 启动已存在的容器。 +- [`docker stop`](https://docs.docker.com/engine/reference/commandline/stop) 停止运行中的容器。 +- [`docker restart`](https://docs.docker.com/engine/reference/commandline/restart) 重启容器。 +- [`docker pause`](https://docs.docker.com/engine/reference/commandline/pause/) 暂停运行中的容器,将其「冻结」在当前状态。 +- [`docker unpause`](https://docs.docker.com/engine/reference/commandline/unpause/) 结束容器暂停状态。 +- [`docker wait`](https://docs.docker.com/engine/reference/commandline/wait) 阻塞地等待某个运行中的容器直到停止。 +- [`docker kill`](https://docs.docker.com/engine/reference/commandline/kill) 向运行中的容器发送 SIGKILL 指令。 +- [`docker attach`](https://docs.docker.com/engine/reference/commandline/attach) 连接到运行中的容器。 + +如果你想将容器的端口 (ports) 暴露至宿主机,请见 [暴露端口](#暴露端口exposing-ports) 一节。 + +关于 Docker 实例崩溃后的重启策略,详见 [本文](http://container42.com/2014/09/30/docker-restart-policies/)。 + +#### CPU 限制 + +你可以限制 CPU 资源占用,无论是指定百分比,或是特定核心数。 + +例如,你可以设置 [`cpu-shares`](https://docs.docker.com/engine/reference/run/#/cpu-share-constraint)。该配置看起来有点奇怪 -- 1024 表示 100% CPU,因此如果你希望容器使用所有 CPU 内核的 50%,应将其设置为 512: + +``` +docker run -ti --c 512 agileek/cpuset-test +``` + +更多信息请参阅 。 + +通过 [`cpuset-cpus`](https://docs.docker.com/engine/reference/run/#/cpuset-constraint) 可使用特定 CPU 内核。 + +``` +docker run -ti --cpuset-cpus=0,4,6 agileek/cpuset-test +``` + +请参阅 获取更多细节以及一些不错的视频。 + +注意,Docker 在容器内仍然能够 **看到** 全部 CPU -- 它仅仅是不使用全部而已。请参阅 获取更多细节。 + +#### 内存限制 + +同样,亦可给 Docker 设置 [内存限制](https://docs.docker.com/engine/reference/run/#/user-memory-constraints): + +``` +docker run -it -m 300M ubuntu:14.04 /bin/bash +``` + +#### 能力(Capabilities) + +Linux 的 Capability 可以通过使用 `cap-add` 和 `cap-drop` 设置。请参阅 获取更多细节。这有助于提高安全性。 + +如需要挂载基于 FUSE 的文件系统,你需要结合 `--cap-add` 和 `--device` 使用: + +``` +docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs +``` + +授予对某个设备的访问权限: + +``` +docker run -it --device=/dev/ttyUSB0 debian bash +``` + +授予对所有设备的访问权限: + +``` +docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb debian bash +``` + +有关容器特权的更多信息请参阅 [本文](https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities)。 + +### 信息 + +- [`docker ps`](https://docs.docker.com/engine/reference/commandline/ps) 查看运行中的所有容器。 +- [`docker logs`](https://docs.docker.com/engine/reference/commandline/logs) 从容器中读取日志。(你也可以使用自定义日志驱动,不过在 1.10 中,它只支持 `json-file` 和 `journald`)。 +- [`docker inspect`](https://docs.docker.com/engine/reference/commandline/inspect) 查看某个容器的所有信息(包括 IP 地址)。 +- [`docker events`](https://docs.docker.com/engine/reference/commandline/events) 从容器中获取事件 (events)。 +- [`docker port`](https://docs.docker.com/engine/reference/commandline/port) 查看容器的公开端口。 +- [`docker top`](https://docs.docker.com/engine/reference/commandline/top) 查看容器中活动进程。 +- [`docker stats`](https://docs.docker.com/engine/reference/commandline/stats) 查看容器的资源使用量统计信息。 +- [`docker diff`](https://docs.docker.com/engine/reference/commandline/diff) 查看容器文件系统中存在改动的文件。 + +`docker ps -a` 将显示所有容器,包括运行中和已停止的。 + +`docker stats --all` 同样将显示所有容器,默认仅显示运行中的容器。 + +### 导入 / 导出 + +- [`docker cp`](https://docs.docker.com/engine/reference/commandline/cp) 在容器和本地文件系统之间复制文件或目录。 +- [`docker export`](https://docs.docker.com/engine/reference/commandline/export) 将容器的文件系统打包为归档文件流 (tarball archive stream) 并输出至标准输出 (STDOUT)。 + +### 执行命令 + +- [`docker exec`](https://docs.docker.com/engine/reference/commandline/exec) 在容器内执行命令。 + - 例如,进入正在运行的 `foo` 容器,并连接 (attach) 到一个新的 Shell 进程:`docker exec -it foo /bin/bash`。 + +## 镜像(Images) + +镜像是 [Docker 容器的模板](https://docs.docker.com/engine/understanding-docker/#how-does-a-docker-image-work)。 + +### 生命周期 + +- [`docker images`](https://docs.docker.com/engine/reference/commandline/images) 查看所有镜像。 +- [`docker import`](https://docs.docker.com/engine/reference/commandline/import) 从归档文件创建镜像。 +- [`docker build`](https://docs.docker.com/engine/reference/commandline/build) 从 Dockerfile 创建镜像。 +- [`docker commit`](https://docs.docker.com/engine/reference/commandline/commit) 为容器创建镜像,如果容器正在运行则会临时暂停。 +- [`docker rmi`](https://docs.docker.com/engine/reference/commandline/rmi) 删除镜像。 +- [`docker load`](https://docs.docker.com/engine/reference/commandline/load) 从标准输入 (STDIN) 加载归档包 (tar archive) 作为镜像,包括镜像本身和标签 (tags, 0.7 起)。 +- [`docker save`](https://docs.docker.com/engine/reference/commandline/save) 将镜像打包为归档包,并输出至标准输出 (STDOUT),包括所有的父层、标签和版本 (parent layers, tags, versions, 0.7 起)。 + +### 其它信息 + +- [`docker history`](https://docs.docker.com/engine/reference/commandline/history) 查看镜像的历史记录。 +- [`docker tag`](https://docs.docker.com/engine/reference/commandline/tag) 给镜像打标签命名(本地或者仓库均可)。 + +### 清理 + +虽然你可以用 `docker rmi` 命令来删除指定的镜像,不过有个名为 [docker-gc](https://github.com/spotify/docker-gc) 的工具,它可以以一种安全的方式,清理掉那些不再被任何容器使用的镜像。Docker 1.13 起,使用 `docker image prune` 亦可删除未使用的镜像。参见 [清理](#清理)。 + +### 加载 / 保存镜像 + +从文件中加载镜像: + +``` +docker load < my_image.tar.gz +``` + +保存既有镜像: + +``` +docker save my_image:my_tag | gzip > my_image.tar.gz +``` + +### 导入 / 导出容器 + +从文件中导入容器镜像: + +``` +cat my_container.tar.gz | docker import - my_image:my_tag +``` + +导出既有容器: + +``` +docker export my_container | gzip > my_container.tar.gz +``` + +### 加载已保存的镜像 与 导入已导出为镜像的容器 的不同 + +通过 `load` 命令来加载镜像,会创建一个新的镜像,并继承原镜像的所有历史。 +通过 `import` 将容器作为镜像导入,也会创建一个新的镜像,但并不包含原镜像的历史,因此会比使用 `load` 方式生成的镜像更小。 + +## 网络(Networks) + +Docker 具备 [网络](https://docs.docker.com/engine/userguide/networking/) 功能。我并不是很了解它,所以这是一个扩展本文的好地方。文档 [使用网络](https://docs.docker.com/engine/userguide/networking/work-with-networks/) 指出,这是一种无需暴露端口即可实现 Docker 容器间通信的好方法。 + +### 生命周期 + +- [`docker network create`](https://docs.docker.com/engine/reference/commandline/network_create/) +- [`docker network rm`](https://docs.docker.com/engine/reference/commandline/network_rm/) + +### 其它信息 + +- [`docker network ls`](https://docs.docker.com/engine/reference/commandline/network_ls/) +- [`docker network inspect`](https://docs.docker.com/engine/reference/commandline/network_inspect/) + +### 建立连接 + +- [`docker network connect`](https://docs.docker.com/engine/reference/commandline/network_connect/) +- [`docker network disconnect`](https://docs.docker.com/engine/reference/commandline/network_disconnect/) + +你可以 [为容器指定 IP 地址](https://blog.jessfraz.com/post/ips-for-all-the-things/): + +``` +# 使用你自己的子网和网关创建一个桥接网络 +docker network create --subnet 203.0.113.0/24 --gateway 203.0.113.254 iptastic + +# 基于以上创建的网络,运行一个 Nginx 容器并指定 IP +$ docker run --rm -it --net iptastic --ip 203.0.113.2 nginx + +# 在其他地方使用 CURL 访问这个 IP(假设该 IP 为公网) +$ curl 203.0.113.2 +``` + +## 仓管中心和仓库(Registry & Repository) + +仓库 (repository) 是 _被托管(hosted)_ 的已命名镜像 (tagged images) 的集合,这组镜像用于构建容器文件系统。 + +仓管中心 (registry) 则是 _托管服务(host)_ -- 用于存储仓库并提供 HTTP API,以便 [管理仓库的上传和下载](https://docs.docker.com/engine/tutorials/dockerrepos/)。 + +Docker 官方托管着自己的 [仓管中心](https://hub.docker.com/),包含着数量众多的仓库。不过话虽如此,这个仓管中心 [并没有很好地验证镜像](https://titanous.com/posts/docker-insecurity),所以如果你担心安全问题的话,请尽量避免使用它。 + +- [`docker login`](https://docs.docker.com/engine/reference/commandline/login) 登入仓管中心。 +- [`docker logout`](https://docs.docker.com/engine/reference/commandline/logout) 登出仓管中心。 +- [`docker search`](https://docs.docker.com/engine/reference/commandline/search) 从仓管中心检索镜像。 +- [`docker pull`](https://docs.docker.com/engine/reference/commandline/pull) 从仓管中心拉取镜像到本地。 +- [`docker push`](https://docs.docker.com/engine/reference/commandline/push) 从本地推送镜像到仓管中心。 + +### 本地仓管中心 + +你可以使用 [docker distribution](https://github.com/docker/distribution) 项目搭建本地的仓管中心,详情参阅 [本地发布 (local deploy)](https://github.com/docker/docker.github.io/blob/master/registry/deploying.md) 的介绍。 + +科学上网后,也可以看看 [Google+ Group](https://groups.google.com/a/dockerproject.org/forum/#!forum/distribution)。 + +## Dockerfile + +当你执行 `docker build` 时,Docker 将会根据 [配置文件](https://docs.docker.com/engine/reference/builder/) 启动 Docker 容器。远优于使用 `docker commit`。 + +以下是一些编写 Dockerfile 的常用编辑器,并链接到适配的语法高亮模块︰ + +- 如果你在使用 [jEdit](http://jedit.org),你可以使用我开发的 Dockerfile [语法高亮模块](https://github.com/wsargent/jedit-docker-mode)。 +- [Sublime Text 2](https://packagecontrol.io/packages/Dockerfile%20Syntax%20Highlighting) +- [Atom](https://atom.io/packages/language-docker) +- [Vim](https://github.com/ekalinin/Dockerfile.vim) +- [Emacs](https://github.com/spotify/dockerfile-mode) +- [TextMate](https://github.com/docker/docker/tree/master/contrib/syntax/textmate) +- 更多信息请参阅 [Docker 遇上 IDE](https://domeide.github.io/) + +### 指令 + +- [.dockerignore](https://docs.docker.com/engine/reference/builder/#dockerignore-file) +- [FROM](https://docs.docker.com/engine/reference/builder/#from) 为其他指令设置基础镜像 (Base Image)。 +- [MAINTAINER (deprecated - use LABEL instead)](https://docs.docker.com/engine/reference/builder/#maintainer-deprecated) 为生成的镜像设置作者字段。 +- [RUN](https://docs.docker.com/engine/reference/builder/#run) 在当前镜像的基础上生成一个新层并执行命令。 +- [CMD](https://docs.docker.com/engine/reference/builder/#cmd) 设置容器默认执行命令。 +- [EXPOSE](https://docs.docker.com/engine/reference/builder/#expose) 告知 Docker 容器在运行时所要监听的网络端口。注意:并没有实际上将端口设置为可访问。 +- [ENV](https://docs.docker.com/engine/reference/builder/#env) 设置环境变量。 +- [ADD](https://docs.docker.com/engine/reference/builder/#add) 将文件、目录或远程文件复制到容器中。缓存无效。请尽量用 `COPY` 代替 `ADD`。 +- [COPY](https://docs.docker.com/engine/reference/builder/#copy) 将文件或文件夹复制到容器中。注意:将使用 ROOT 用户复制文件,故无论 USER / WORKDIR 指令如何配置,你都需要手动修改其所有者(`chown`),`ADD` 也是一样。 +- [ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint) 将容器设为可执行的。 +- [VOLUME](https://docs.docker.com/engine/reference/builder/#volume) 在容器内部创建挂载点 (mount point) 指向外部挂载的卷标或其他容器。 +- [USER](https://docs.docker.com/engine/reference/builder/#user) 设置随后执行 RUN / CMD / ENTRYPOINT 命令的用户名。 +- [WORKDIR](https://docs.docker.com/engine/reference/builder/#workdir) 设置工作目录 (working directory)。 +- [ARG](https://docs.docker.com/engine/reference/builder/#arg) 定义编译时 (build-time) 变量。 +- [ONBUILD](https://docs.docker.com/engine/reference/builder/#onbuild) 添加触发指令,当该镜像被作为其他镜像的基础镜像时该指令会被触发。 +- [STOPSIGNAL](https://docs.docker.com/engine/reference/builder/#stopsignal) 设置停止容器时,向容器内发送的系统调用信号 (system call signal)。 +- [LABEL](https://docs.docker.com/config/labels-custom-metadata/) 将键值对元数据 (key/value metadata) 应用到镜像、容器或是守护进程。 + +### 教程 + +- [Flux7's Dockerfile Tutorial](http://flux7.com/blogs/docker/docker-tutorial-series-part-3-automation-is-the-word-using-dockerfile/) + +### 例子 + +- [Examples](https://docs.docker.com/engine/reference/builder/#dockerfile-examples) +- [Best practices for writing Dockerfiles](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) +- [Michael Crosby](http://crosbymichael.com/) 还有更多的 [Dockerfiles best practices](http://crosbymichael.com/dockerfile-best-practices.html) / [take 2](http://crosbymichael.com/dockerfile-best-practices-take-2.html) +- [Building Good Docker Images](http://jonathan.bergknoff.com/journal/building-good-docker-images) / [Building Better Docker Images](http://jonathan.bergknoff.com/journal/building-better-docker-images) +- [Managing Container Configuration with Metadata](https://speakerdeck.com/garethr/managing-container-configuration-with-metadata) + +## 层(Layers) + +Docker 的版本化文件系统是基于层的。就像 [Git 的提交或文件变更系统](https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/) 一样。 + +## 链接(Links) + +链接 (links) [通过 TCP/IP 端口](https://docs.docker.com/userguide/dockerlinks/) 实现 Docker 容器之间的通讯。[Atlassian](https://blogs.atlassian.com/2013/11/docker-all-the-things-at-atlassian-automation-and-wiring/) 展示了可用的例子。你还可以 [通过主机名 (hostname) 链接](https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#/updating-the-etchosts-file)。 + +在某种意义上来说,该特性已经被 [自定义网络](https://docs.docker.com/network/) 所替代。 + +注意: 如果你希望容器之间**只**通过链接进行通讯,在启动 Docker 守护进程时,请使用 `-icc=false` 来禁用内部进程通讯。 + +假设你有一个名为 CONTAINER 的容器(通过 `docker run --name CONTAINER` 指定)并且在 Dockerfile 中,暴露了一个端口: + +``` +EXPOSE 1337 +``` + +然后,我们创建另外一个名为 LINKED 的容器: + +``` +docker run -d --link CONTAINER:ALIAS --name LINKED user/wordpress +``` + +然后 CONTAINER 暴露的端口和别名将会以如下的环境变量出现在 LINKED 中: + +``` +$ALIAS_PORT_1337_TCP_PORT +$ALIAS_PORT_1337_TCP_ADDR +``` + +那么你便可以通过这种方式来连接它了。 + +使用 `docker rm --link` 即可删除链接。 + +通常,Docker 容器(亦可理解为「服务」)之间的链接,是「服务发现」的一个子集。如果你打算在生产中大规模使用 Docker,这将是一个很大的问题。请参阅[The Docker Ecosystem: Service Discovery and Distributed Configuration Stores](https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-service-discovery-and-distributed-configuration-stores) 获取更多信息。 + +## 卷标(Volumes) + +Docker 的卷标 (volumes) 是 [独立的文件系统](https://docs.docker.com/engine/tutorials/dockervolumes/)。它们并非必须连接到特定的容器上。 + +### 生命周期 + +- [`docker volume create`](https://docs.docker.com/engine/reference/commandline/volume_create/) +- [`docker volume rm`](https://docs.docker.com/engine/reference/commandline/volume_rm/) + +### 信息 + +- [`docker volume ls`](https://docs.docker.com/engine/reference/commandline/volume_ls/) +- [`docker volume inspect`](https://docs.docker.com/engine/reference/commandline/volume_inspect/) + +卷标在不能使用链接(只有 TCP/IP)的情况下非常有用。例如,如果你有两个 Docker 实例需要通讯并在文件系统上留下记录。 + +你可以一次性将其挂载到多个 docker 容器上,通过 `docker run --volumes-from`。 + +因为卷标是独立的文件系统,它们通常被用于存储各容器之间的瞬时状态。也就是说,你可以配置一个无状态临时容器,关掉之后,当你有第二个这种临时容器实例的时候,你可以从上一次保存的状态继续执行。 + +查看 [卷标进阶](http://crosbymichael.com/advanced-docker-volumes.html) 来获取更多细节。[Container42](http://container42.com/2014/11/03/docker-indepth-volumes/) 非常有用。 + +你可以 [将宿主 MacOS 的文件夹映射为 Docker 卷标](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume): + +``` +docker run -v /Users/wsargent/myapp/src:/src +``` + +你也可以用远程 NFS 卷标,如果你觉得你 [有足够勇气](https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-shared-storage-volume-as-a-data-volume)。 + +还可以考虑运行一个纯数据容器,像 [这里](http://container42.com/2013/12/16/persistent-volumes-with-docker-container-as-volume-pattern/) 所说的那样,提供可移植数据。 + +记得,[文件也可以被挂载为卷标](#将文件挂载为卷标)。 + +## 暴露端口(Exposing ports) + +通过宿主容器暴露输入端口相当 [繁琐但有效的](https://docs.docker.com/engine/reference/run/#expose-incoming-ports)。 + +例如使用 `-p` 将容器端口映射到宿主端口上(只使用本地主机 (localhost) 接口): + +``` +docker run -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT --name CONTAINER -t someimage +``` + +你可以使用 [EXPOSE](https://docs.docker.com/engine/reference/builder/#expose) 告知 Docker,该容器在运行时监听指定的端口: + +``` +EXPOSE +``` + +但是注意 EXPOSE 并不会直接暴露端口,你需要用参数 `-p` 。比如说你要在 localhost 上暴露容器的端口: + +``` +iptables -t nat -A DOCKER -p tcp --dport -j DNAT --to-destination : +``` + +如果你是在 Virtualbox 中运行 Docker,那么你需要配置端口转发 (forward the port)。使用 [forwarded_port](https://docs.vagrantup.com/v2/networking/forwarded_ports.html) 在 Vagrantfile 上配置暴露的端口范围,这样你就可以动态地映射了: + +``` +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| + ... + + (49000..49900).each do |port| + config.vm.network :forwarded_port, :host => port, :guest => port + end + + ... +end +``` + +如果你忘记了将什么端口映射到宿主机上的话,可使用 `docker port` 查看: + +``` +docker port CONTAINER $CONTAINERPORT +``` + +## 最佳实践 + +这里有一些最佳实践,以及争论焦点: + +- [The Rabbit Hole of Using Docker in Automated Tests](http://gregoryszorc.com/blog/2014/10/16/the-rabbit-hole-of-using-docker-in-automated-tests/) +- [Bridget Kromhout](https://twitter.com/bridgetkromhout) has a useful blog post on [running Docker in production](http://sysadvent.blogspot.co.uk/2014/12/day-1-docker-in-production-reality-not.html) at Dramafever. +- There's also a best practices [blog post](http://developers.lyst.com/devops/2014/12/08/docker/) from Lyst. +- [A Docker Dev Environment in 24 Hours!](https://engineering.salesforceiq.com/2013/11/05/a-docker-dev-environment-in-24-hours-part-2-of-2.html) +- [Building a Development Environment With Docker](https://tersesystems.com/2013/11/20/building-a-development-environment-with-docker/) +- [Discourse in a Docker Container](https://samsaffron.com/archive/2013/11/07/discourse-in-a-docker-container) + +## 安全(Security) + +这节准备讨论一些关于 Docker 安全性的问题。Docker 官方文档 [安全](https://docs.docker.com/articles/security/) 页面讲述了更多细节。 + +首先第一件事:Docker 是有 root 权限的。如果你在 `docker` 组,那么你就有 [root 权限](https://web.archive.org/web/20161226211755/http://reventlov.com/advisories/using-the-docker-command-to-root-the-host)。如果你将 Docker 的 Unix Socket 暴露给容器,意味着你赋予了容器 [宿主机 root 权限](https://www.lvh.io/posts/dont-expose-the-docker-socket-not-even-to-a-container.html)。 + +Docker 不应当作为唯一的防御措施。你应当使其更加安全可靠。 + +为了更好地理解容器暴露了什么,可参阅由 [Aaron Grattafiori](https://twitter.com/dyn___) 编写的 [Understanding and Hardening Linux Containers](https://www.nccgroup.trust/globalassets/our-research/us/whitepapers/2016/april/ncc_group_understanding_hardening_linux_containers-1-1.pdf)。这是一个完整全面且包含大量链接和脚注的容器问题指南,介绍了许多有用的内容。即使你已经加固过容器,以下的安全提示依然十分有帮助,但并不能代替理解的过程。 + +### 安全提示 + +为了最大的安全性,你应当考虑在虚拟机上运行 Docker。这是直接从 Docker 安全团队拿来的资料 -- [slides](http://www.slideshare.net/jpetazzo/linux-containers-lxc-docker-and-security) / [notes](http://www.projectatomic.io/blog/2014/08/is-it-safe-a-look-at-docker-and-security-from-linuxcon/)。之后,可使用 AppArmor、seccomp、SELinux、grsec 等来 [限制容器的权限](http://linux-audit.com/docker-security-best-practices-for-your-vessel-and-containers/)。更多细节,请查阅 [Docker 1.10 security features](https://blog.docker.com/2016/02/docker-engine-1-10-security/)。 + +Docker 镜像 ID 属于 [敏感信息](https://medium.com/@quayio/your-docker-image-ids-are-secrets-and-its-time-you-treated-them-that-way-f55e9f14c1a4) 所以它不应该向外界公开。请将它们当作密码来对待。 + +阅读由 [Thomas Sjögren](https://github.com/konstruktoid) 编写的 [Docker Security Cheat Sheet](https://github.com/konstruktoid/Docker/blob/master/Security/CheatSheet.adoc):关于加固容器的不错的建议。 + +查看 [Docker 安全测试脚本](https://github.com/docker/docker-bench-security),下载 [最佳实践白皮书](https://blog.docker.com/2015/05/understanding-docker-security-and-best-practices/)。 + +你应当远离使用非稳定版本 grsecurity / pax 的内核,比如 [Alpine Linux](https://en.wikipedia.org/wiki/Alpine_Linux)。如果在产品中用了 grsecurity,那么你应该考虑使用有 [商业支持](https://grsecurity.net/business_support.php) 的 [稳定版本](https://grsecurity.net/announce.php),就像你对待 RedHat 那样。虽然要 \$200 每月,但对于你的运维预算来说不值一提。 + +从 Docker 1.11 开始,你可以轻松的限制在容器中可用的进程数,以防止 fork 炸弹。 这要求 Linux 内核 >= 4.3,并且要在内核配置中打开 CGROUP_PIDS=y。 + +``` +docker run --pids-limit=64 +``` + +同时,你也可以限制进程再获取新权限。该功能是 Linux 内核从 3.5 版本开始就拥有的。你可以从 [这篇博客](http://www.projectatomic.io/blog/2016/03/no-new-privs-docker/) 中阅读到更多关于这方面的内容。 + +``` +docker run --security-opt=no-new-privileges +``` + +以下内容摘选自 [Container Solutions](http://container-solutions.com/is-docker-safe-for-production/) 的 [Docker Security Cheat Sheet](http://container-solutions.com/content/uploads/2015/06/15.06.15_DockerCheatSheet_A2.pdf)(PDF 版本,难以使用,故复制至此): + +关闭内部进程通讯: + +``` +docker -d --icc=false --iptables +``` + +设置容器为只读: + +``` +docker run --read-only +``` + +通过 hashsum 来验证卷标: + +``` +docker pull debian@sha256:a25306f3850e1bd44541976aa7b5fd0a29be +``` + +设置卷标为只读: + +``` +docker run -v $(pwd)/secrets:/secrets:ro debian +``` + +在 Dockerfile 中定义用户并以该用户运行,避免在容器中以 ROOT 身份操作: + +``` +RUN groupadd -r user && useradd -r -g user user +USER user +``` + +### 用户命名空间(User Namespaces) + +还可以通过使用 [用户命名空间](https://s3hh.wordpress.com/2013/07/19/creating-and-using-containers-without-privilege/) -- 自 1.10 版本起已内置,但默认并未启用。 + +要在 Ubuntu 15.10 中启用用户命名空间 (remap the userns),请 [跟着这篇博客的例子](https://raesene.github.io/blog/2016/02/04/Docker-User-Namespaces/) 来做。 + +### 安全相关视频 + +- [Using Docker Safely](https://youtu.be/04LOuMgNj9U) +- [Securing your applications using Docker](https://youtu.be/KmxOXmPhZbk) +- [Container security: Do containers actually contain?](https://youtu.be/a9lE9Urr6AQ) +- [Linux Containers: Future or Fantasy?](https://www.youtube.com/watch?v=iN6QbszB1R8) + +### 安全路线图 + +Docker 的路线图提到关于 [seccomp 的支持](https://github.com/docker/docker/blob/master/ROADMAP.md#11-security)。 +一个名为 [bane](https://github.com/jfrazelle/bane) 的 AppArmor 策略生成器正在实现 [安全配置文件](https://github.com/docker/docker/issues/17142)。 + +## 小贴士 + +链接: + +- [15 Docker Tips in 5 minutes](http://sssslide.com/speakerdeck.com/bmorearty/15-docker-tips-in-5-minutes) +- [CodeFresh Everyday Hacks Docker](https://codefresh.io/blog/everyday-hacks-docker/) + +### 清理 + +最新的 [数据管理命令](https://github.com/docker/docker/pull/26108) 已在 Docker 1.13 实现: + +- `docker system prune` +- `docker volume prune` +- `docker network prune` +- `docker container prune` +- `docker image prune` + +### df 命令 + +`docker system df` 将显示当前 Docker 各部分占用的磁盘空间。 + +### Heredoc 声明 Docker 容器 + +``` +docker build -t htop - << EOF +FROM alpine +RUN apk --no-cache add htop +EOF +``` + +### 最近一次的容器 ID + +``` +alias dl='docker ps -l -q' +docker run ubuntu echo hello world +docker commit $(dl) helloworld +``` + +### 带命令的提交(需要 Dockerfile) + +``` +docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' $(dl) postgres +``` + +### 获取 IP 地址 + +``` +docker inspect $(dl) | grep -wm1 IPAddress | cut -d '"' -f 4 +``` + +或使用 [jq](https://stedolan.github.io/jq/): + +``` +docker inspect $(dl) | jq -r '.[0].NetworkSettings.IPAddress' +``` + +或使用 [go 模板](https://docs.docker.com/engine/reference/commandline/inspect): + +``` +docker inspect -f '{{ .NetworkSettings.IPAddress }}' +``` + +或在通过 Dockerfile 构建镜像时,通过构建参数 (build argument) 传入: + +``` +DOCKER_HOST_IP=`ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1` +echo DOCKER_HOST_IP = $DOCKER_HOST_IP +docker build \ + --build-arg ARTIFACTORY_ADDRESS=$DOCKER_HOST_IP + -t sometag \ + some-directory/ +``` + +### 获取端口映射 + +``` +docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' +``` + +### 通过正则匹配容器 + +``` +for i in $(docker ps -a | grep "REGEXP_PATTERN" | cut -f1 -d" "); do echo $i; done` +``` + +### 获取环境变量配置 + +``` +docker run --rm ubuntu env +``` + +### 强行终止运行中的容器 + +``` +docker kill $(docker ps -q) +``` + +### 删除所有容器(强行删除!无论容器运行或停止) + +``` +docker rm -f $(docker ps -qa) +``` + +### 删除旧容器 + +``` +docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm +``` + +### 删除已停止的容器 + +``` +docker rm -v `docker ps -a -q -f status=exited` +``` + +### 停止并删除容器 + +``` +docker stop $(docker ps -aq) && docker rm -v $(docker ps -aq) +``` + +### 删除无用 (dangling) 的镜像 + +``` +docker rmi $(docker images -q -f dangling=true) +``` + +### 删除所有镜像 + +``` +docker rmi $(docker images -q) +``` + +### 删除无用 (dangling) 的卷标 + +Docker 1.9 版本起: + +``` +docker volume rm $(docker volume ls -q -f dangling=true) +``` + +1.9.0 中,参数 `dangling=false` 居然 _没_ 用 - 它会被忽略然后列出所有的卷标。 + +### 查看镜像依赖 + +``` +docker images -viz | dot -Tpng -o docker.png +``` + +### Docker 容器瘦身 + +- 在某层 (RUN layer) 清理 APT + +这应当和其他 apt 命令在同一层中完成。 +否则,前面的层将会保持原有信息,而你的镜像则依旧臃肿。 + +``` +RUN {apt commands} \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +``` + +- 压缩镜像 + +``` +ID=$(docker run -d image-name /bin/bash) +docker export $ID | docker import – flat-image-name +``` + +- 备份 + +``` +ID=$(docker run -d image-name /bin/bash) +(docker export $ID | gzip -c > image.tgz) +gzip -dc image.tgz | docker import - flat-image-name +``` + +### 监视运行中容器的系统资源利用率 + +检查某个容器的 CPU、内存以及网络 I/O 使用情况,你可以: + +``` +docker stats +``` + +按 ID 列出所有容器: + +``` +docker stats $(docker ps -q) +``` + +按名称列出所有容器: + +``` +docker stats $(docker ps --format '{{.Names}}') +``` + +按指定镜像名称列出所有容器: + +``` +docker ps -a -f ancestor=ubuntu +``` + +删除所有未标签命名 (untagged) 的容器: + +``` +docker rmi $(docker images | grep “^” | awk '{split($0,a," "); print a[3]}') +``` + +通过正则匹配删除指定容器: + +``` +docker ps -a | grep wildfly | awk '{print $1}' | xargs docker rm -f +``` + +删除所有已退出 (exited) 的容器: + +``` +docker rm -f $(docker ps -a | grep Exit | awk '{ print $1 }') +``` + +### 将文件挂载为卷标 + +文件也可以被挂载为卷标。例如你可以仅仅注入单个配置文件: + +```bash +# 从容器复制文件 +docker run --rm httpd cat /usr/local/apache2/conf/httpd.conf > httpd.conf + +# 编辑文件 +vim httpd.conf + +# 挂载修改后的配置启动容器 +docker run --rm -ti -v "$PWD/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro" -p "80:80" httpd +``` + +## 参考资料 + +- [Docker Cheat Sheet](https://github.com/wsargent/docker-cheat-sheet/tree/master/zh-cn) diff --git a/docs/docker/docker-introduction.md b/docs/docker/docker-introduction.md deleted file mode 100644 index daf9f2a..0000000 --- a/docs/docker/docker-introduction.md +++ /dev/null @@ -1,95 +0,0 @@ -# Docker 简介 - -> **Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。** - -## 概述 - -### Docker 是什么 - -Docker 是开发,传输和运行应用程序的开放平台。 - -Docker 使您能够将应用程序与基础架构分开,以便快速交付软件。 - -借助 Docker,您可以像管理应用程序一样管理基础架构。通过利用 Docker 的方法快速进行运输,测试和部署代码,您可以显著缩短编写代码和在生产环境中运行代码之间的耗时。 - -### Docker 平台 - -Docker 提供了被称为容器的松散隔离环境,在环境中可以打包和运行应用程序。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要管理程序的额外负载,而是直接在主机的内核中运行。这意味着您可以在给定的硬件组合上运行更多容器,而不是使用虚拟机。你甚至可以在实际上是虚拟机的主机中运行 Docker 容器! - -Docker 提供工具和平台来管理容器的生命周期: - -- 使用容器开发您的应用程序及其支持组件。 -- 容器成为分发和测试你的应用程序的单元。 -- 准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。 - -### Docker 引擎 - -Docker 引擎是一个 C/S 架构的应用,它有这些主要的组件: - -服务器是一个长期运行的程序,被称为守护进程。 - -REST API 指定程序可用于与守护进程进行通信并指示其执行操作的接口。 - -命令行客户端。 - -

- -CLI 使用 Docker REST API 通过脚本或直接 CLI 命令来控制 Docker 守护进程或与其进行交互。许多其他 Docker 应用程序使用底层的 API 和 CLI。 - -守护进程创建并管理 Docker 对象,如镜像,容器,网络和卷。 - -### 传统虚拟机和 Docker - -

- -## 概念 - -Docker 包括三个基本概念 - -- 镜像(Image) -- 容器(Container) -- 仓库(Repository) - -### 镜像 - -我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。 - -Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 - -#### 分层存储 - -因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。 - -镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。 - -分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。 - -### 容器 - -镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类` 和 `实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 - -容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。 - -前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为**容器存储层**。 - -容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。 - -按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](https://yeasy.gitbooks.io/docker_practice/content/data_management/volume.html)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。 - -数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。 - -### 仓库 - -镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,[Docker Registry](https://yeasy.gitbooks.io/docker_practice/content/repository/registry.html) 就是这样的服务。 - -一个 **Docker Registry** 中可以包含多个**仓库**(`Repository`);每个仓库可以包含多个**标签**(`Tag`);每个标签对应一个镜像。 - -通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。 - -以 [Ubuntu 镜像](https://store.docker.com/images/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`16.04`, `18.04`。我们可以通过 `ubuntu:14.04`,或者 `ubuntu:18.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。 - -仓库名经常以 _两段式路径_ 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。 - -## 引用和引申 - -- https://yeasy.gitbooks.io/docker_practice/content/basic_concept/repository.html diff --git a/docs/docker/docker-quickstart.md b/docs/docker/docker-quickstart.md deleted file mode 100644 index 03c5633..0000000 --- a/docs/docker/docker-quickstart.md +++ /dev/null @@ -1,43 +0,0 @@ -# Docker 入门 - - - -- [Hello World 示例](#hello-world-示例) - - - -## Hello World 示例 - -(1)拉取镜像 - -``` -docker image pull library/hello-world -``` - -`docker image pull` 是抓取 image 文件的命令。`library/hello-world` 是 image 文件在仓库里面的位置,其中 `library` 是 image 文件所在的组,`hello-world` 是 image 文件的名字。 - -由于 Docker 官方提供的 image 文件,都放在[`library`](https://hub.docker.com/r/library/)组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。 - -``` -docker image pull hello-world -``` - -(2)查看镜像 - -```bash -~ docker image ls -REPOSITORY TAG IMAGE ID CREATED SIZE -hello-world latest 4ab4c602aa5e 3 months ago 1.84kB -``` - -(3)运行镜像 - -``` -docker container run hello-world -``` - -`docker container run` 命令会从 image 文件,生成一个正在运行的容器实例。 - -注意,`docker container run` 命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的 `docker image pull` 命令并不是必需的步骤。 - -如果运行成功,你会在屏幕上读到下面的输出。 diff --git a/docs/docker/docker.md b/docs/docker/docker.md index 5f81e2c..50d7e2a 100644 --- a/docs/docker/docker.md +++ b/docs/docker/docker.md @@ -1,70 +1,154 @@ -# Docker 教程 +# Docker 应用指南 -## [简介](docker-introduction.md) +## 简介 + +### Docker 是什么 > **Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。** -> -> Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。 -

+Docker 是目前最流行的 Linux 容器解决方案。 -## [入门篇](docker-quickstart.md) +Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。 -## 基础篇 +总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。 -### 安装 +### Docker 的用途 -Docker 分为 CE 和 EE 两大版本。 +Docker 的主要用途,目前有三大类。 -- CE 即社区版(免费,支持周期 7 个月)。Docker CE 分为 `stable`, `test`, 和 `nightly` 三个更新频道。每六个月发布一个 stable 版本。 -- EE 即企业版,强调安全,付费使用,支持周期 24 个月。 +- **提供一次性的环境** - 比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。 +- **提供弹性的云服务** - 因为 Docker 容器可以随开随关,很适合动态扩容和缩容。 +- **组建微服务架构** - 通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。 -Docker CE 可以安装在 Linux 、Windows 10 (PC) 和 MAC 上。 +### 虚拟机和 Docker -> 参考: -> -> - [官方安装指南](https://docs.docker.com/install/) -> - [Docker 中文教程安装指南](https://yeasy.gitbooks.io/docker_practice/content/install/) +虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。 -### [Docker 镜像](basics/docker-image.md) +**资源占用多** - 虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。 -### [Docker 容器](basics/docker-container.md) +**冗余步骤多** - 虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。 -### [Dockerfile](basics/docker-dockerfile.md) +**启动慢** - 启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。 -- FROM(指定基础镜像) -- RUN(执行命令) -- COPY(复制文件) -- ADD(更高级的复制文件) -- CMD(容器启动命令) -- ENTRYPOINT(入口点) -- ENV(设置环境变量) -- ARG(构建参数) -- VOLUME(定义匿名卷) -- EXPOSE(暴露端口) -- WORKDIR(指定工作目录) -- USER(指定当前用户) -- HEALTHCHECK(健康检查) -- ONBUILD(为他人作嫁衣裳) +

-## 进阶篇 +### Docker 平台 -### 设计 +Docker 提供了被称为容器的松散隔离环境,在环境中可以打包和运行应用程序。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要管理程序的额外负载,而是直接在主机的内核中运行。这意味着您可以在给定的硬件组合上运行更多容器,而不是使用虚拟机。你甚至可以在实际上是虚拟机的主机中运行 Docker 容器! -## 实战篇 +Docker 提供工具和平台来管理容器的生命周期: -## 常见问题 +- 使用容器开发您的应用程序及其支持组件。 +- 容器成为分发和测试你的应用程序的单元。 +- 准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。 -## 附录 +## 核心概念 -### [命令](appendix/docker-cli.md) +### 引擎 -### [资源](appendix/docker-resources.md) +Docker 引擎是一个 C/S 架构的应用,它有这些主要的组件: -### 术语 +服务器是一个长期运行的程序,被称为守护进程。 -### 技巧 +REST API 指定程序可用于与守护进程进行通信并指示其执行操作的接口。 -### 版本 +命令行客户端。 -### 反馈 +

+ +CLI 使用 Docker REST API 通过脚本或直接 CLI 命令来控制 Docker 守护进程或与其进行交互。许多其他 Docker 应用程序使用底层的 API 和 CLI。 + +守护进程创建并管理 Docker 对象,如镜像,容器,网络和卷。 + +### 镜像 + +我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。 + +Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 + +**分层存储** + +因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。 + +镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。 + +分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。 + +### 容器 + +镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类` 和 `实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 + +容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。 + +前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为**容器存储层**。 + +容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。 + +按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](https://yeasy.gitbooks.io/docker_practice/content/data_management/volume.html)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。 + +数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。 + +### 仓库 + +镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,[Docker Registry](https://yeasy.gitbooks.io/docker_practice/content/repository/registry.html) 就是这样的服务。 + +一个 **Docker Registry** 中可以包含多个**仓库**(`Repository`);每个仓库可以包含多个**标签**(`Tag`);每个标签对应一个镜像。 + +通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。 + +以 [Ubuntu 镜像](https://store.docker.com/images/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`16.04`, `18.04`。我们可以通过 `ubuntu:14.04`,或者 `ubuntu:18.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。 + +仓库名经常以 _两段式路径_ 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。 + +## 安装配置 + +不同操作系统环境下安装 Docker 的方式有所不同,详情可以参: + +- [Docker 官方安装指南](https://docs.docker.com/install/) +- [安装 Docker(中文)](https://docker_practice.gitee.io/install/) + +国内访问 Docker 比较慢,如果需要提速,可以参考 [镜像加速器](https://docker_practice.gitee.io/install/mirror.html) + +安装完成后,运行下面的命令,验证是否安装成功。 + +- `docker version` +- `docker info` + +Docker 需要用户具有 sudo 权限,为了避免每次命令都输入`sudo`,可以把用户加入 Docker 用户组([官方文档](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user))。 + +```bash +$ sudo usermod -aG docker $USER +``` + +Docker 是服务器----客户端架构。命令行运行`docker`命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动([官方文档](https://docs.docker.com/config/daemon/systemd/))。 + +```bash +# service 命令的用法 +$ sudo service docker start + +# systemctl 命令的用法 +$ sudo systemctl start docker +``` + +## 参考资料 + +- Docker 官方资源 + - [Docker 官网](http://www.docker.com) + - [Docker Github](https://github.com/moby/moby) + - [Docker 官方文档](https://docs.docker.com/) + - [Docker Hub](https://hub.docker.com/) + - [Docker 开源](https://www.docker.com/community/open-source) +- 资源整理 + - [Awesome Docker](https://github.com/veggiemonk/awesome-docker) +- Docker 中文资源 + - [Docker 中文网站](https://www.docker-cn.com/) + - [Docker 安装手册](https://docs.docker-cn.com/engine/installation/) + - [Docker — 从入门到实践](https://docker_practice.gitee.io/) +- Docker 国内镜像 + - [时速云镜像仓库](https://hub.tenxcloud.com/) + - [网易云镜像服务](https://c.163.com/hub#/m/library/) + - [DaoCloud 镜像市场](https://hub.daocloud.io/) + - [阿里云镜像库](https://cr.console.aliyun.com/) +- 文章 + - [Docker 入门教程](http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html) + - [Docker Cheat Sheet](https://github.com/wsargent/docker-cheat-sheet/tree/master/zh-cn) diff --git a/docs/kubernetes/kubernetes.md b/docs/kubernetes/kubernetes.md index 7649251..fdee32f 100644 --- a/docs/kubernetes/kubernetes.md +++ b/docs/kubernetes/kubernetes.md @@ -44,7 +44,7 @@ Kubernetes 包含若干抽象用来表示系统状态,包括:已部署的容 - Volume - Namespace -

+

高级对象 diff --git a/docs/linux/cli/Linux文件目录管理.md b/docs/linux/cli/Linux文件目录管理.md index d97deb7..a6df8e7 100644 --- a/docs/linux/cli/Linux文件目录管理.md +++ b/docs/linux/cli/Linux文件目录管理.md @@ -50,7 +50,7 @@ tags: linux 目录结构是树形结构,其根目录是 `/` 。一张思维导图说明各个目录的作用: -

+

### Linux 文件属性 diff --git a/docs/linux/tool/vim.md b/docs/linux/tool/vim.md index f04f966..e4d1181 100644 --- a/docs/linux/tool/vim.md +++ b/docs/linux/tool/vim.md @@ -338,33 +338,33 @@ Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错 此外,[这里](http://blog.ngedit.com/vi-vim-cheat-sheet-sch.gif)还有简体中文版。 -

+

### 3.2. 入门版 基本操作的入门版。[原版出处](https://github.com/ahrencode/Miscellaneous)还有 keynote 版本可供 DIY 以及其他相关有用的 cheatsheet。 -

+

### 3.3. 进阶版 下图是 300DPI 的超清大图,另外[查看原文](http://michael.peopleofhonoronly.com/vim/)还有更多版本:黑白,低分辨率,色盲等 -

+

### 3.4. 增强版 下图是一个更新时间较新的现代版,含有的信息也更丰富。[原文链接](http://vimcheatsheet.com/) -

+

### 3.5. 文字版 [原文链接](http://tnerual.eriogerg.free.fr/vimqrc.pdf) -

+

-

+

## 4. 资料