<commit_before>---
layout: post
title: Docker学习笔记
category: 技术
tags: [Docker]
keywords: Docker
description: 记录学习Docker中的知识点
---

最近花几天时间学了一下Docker，Docker目前太火了，而且也确实挺有用的，用起来也不难。

我找到两个很好的教程，一个是[Docker——从入门到实践](https://www.gitbook.com/book/yeasy/docker_practice/details)这本书，另一个是翻译自官方Docker getting started的[Docker入门教程](http://www.docker.org.cn/book/docker/what-is-docker-16.html)。

## 什么是Docker

Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的容器中，然后发布到任何流行的 Linux 机器上，也可以实现虚拟化。

## Docker的优点

- 启动速度快，秒级启动
- 虚拟机小
- 对系统资源利用率很高

## Docker中的三个基本概念

### 1. 镜像

Docker 镜像（Image）就是一个只读的模板。

例如：一个镜像可以包含一个完整的 ubuntu 操作系统环境，里面仅安装了 Apache 或用户需要的其它应用程序。

镜像可以用来创建 Docker 容器。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像，用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

### 2. 容器

Docker 利用容器（Container）来运行应用。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境（包括root用户权限、进程空间、用户空间和网络空间等）和运行在其中的应用程序。

**注**：镜像是只读的，容器在启动的时候创建一层可写层作为最上层。

### 3. 仓库

仓库（Repository）是集中存放镜像文件的场所。每个仓库中包含了多个镜像，每个镜像有不同的标签（tag）。

仓库分为公开仓库（Public）和私有仓库（Private）两种形式。

最大的公开仓库是 [Docker Hub](https://hub.docker.com/)，存放了数量庞大的镜像供用户下载。

国内的公开仓库包括 [时速云](https://hub.tenxcloud.com/) 、[网易云](https://c.163.com/hub) 等，可以提供大陆用户更稳定快速的访问。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库，这样下次在另外一台机器上使用这个镜像时候，只需要从仓库上 pull 下来就可以了。

## Docker的使用

### 获取镜像

    docker pull hub.c.163.com/public/centos:6.5

### 列出本地镜像

    docker images

### 使用更改后的容器创建镜像

    docker commit   # 类似于git的提交更改
    docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2

### 利用Dockerfile创建镜像

    docker build -t="ouruser/sinatra:v2" .

. 是Dockerfile文件所在的目录

Dockerfile文件的一个例子：

    # This is a comment
    FROM ubuntu:14.04
    MAINTAINER <NAME> <<EMAIL>>
    RUN apt-get -qq update
    RUN apt-get -qqy install ruby ruby-dev
    RUN gem install sinatra

### 删除本地镜像

    docker rmi training/sinatra

删除所有未打过标签的本地镜像：

    docker rmi $(docker images -q -f "dangling=true")

### 新建并启动容器

    docker run ubuntu:14.04 /bin/echo 'Hello world'

容器启动之后会运行最后指明的命令，如果命令运行完了，容器就会终止，如果命令不退出，容器也会一直运行。

如果后面不接命令的话，就会运行默认的命令/bin/bash

下面是几个经常用到的参数：

- -i：打开stdin。加上-i参数之后，容器不会退出
- -t -i：会在当前命令行下进入容器的中断
- -d：后台运行

### 在正在运行的容器中执行命令

    docker exec docker exec 76ed90b24f31 echo "Hello world"

76ed90b24f31 是容器ID

### 进入容器

    docker attach nostalgic_hypatia

进入容器nostalgic_hypatia中。但是这种方式在退出终端的时候容器也跟着退出了。

第二种方式。docker exec -it。

```bash
docker exec -it nostalgic_hypatia /bin/bash
```

这样输入“exit”或者按键“Ctrl + C”退出container时，这个container仍然在后台运行 。

### 删除容器

    docker rm trusting_newton

删除容器trusting_newton，rm后面可以是容器name或者容器ID<commit_msg>在docker学习笔记中增加内容<commit_after>---
layout: post
title: Docker学习笔记
category: 技术
tags: [Docker]
keywords: Docker
description: 记录学习Docker中的知识点
---

最近花几天时间学了一下Docker，Docker目前太火了，而且也确实挺有用的，用起来也不难。

我找到两个很好的教程，一个是[Docker——从入门到实践](https://www.gitbook.com/book/yeasy/docker_practice/details)这本书，另一个是翻译自官方Docker getting started的[Docker入门教程](http://www.docker.org.cn/book/docker/what-is-docker-16.html)。

## 什么是Docker

Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的容器中，然后发布到任何流行的 Linux 机器上，也可以实现虚拟化。

## Docker的优点

- 启动速度快，秒级启动
- 虚拟机小
- 对系统资源利用率很高

## Docker中的三个基本概念

### 1. 镜像

Docker 镜像（Image）就是一个只读的模板。

例如：一个镜像可以包含一个完整的 ubuntu 操作系统环境，里面仅安装了 Apache 或用户需要的其它应用程序。

镜像可以用来创建 Docker 容器。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像，用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

### 2. 容器

Docker 利用容器（Container）来运行应用。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境（包括root用户权限、进程空间、用户空间和网络空间等）和运行在其中的应用程序。

**注**：镜像是只读的，容器在启动的时候创建一层可写层作为最上层。

### 3. 仓库

仓库（Repository）是集中存放镜像文件的场所。每个仓库中包含了多个镜像，每个镜像有不同的标签（tag）。

仓库分为公开仓库（Public）和私有仓库（Private）两种形式。

最大的公开仓库是 [Docker Hub](https://hub.docker.com/)，存放了数量庞大的镜像供用户下载。

国内的公开仓库包括 [时速云](https://hub.tenxcloud.com/) 、[网易云](https://c.163.com/hub) 等，可以提供大陆用户更稳定快速的访问。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库，这样下次在另外一台机器上使用这个镜像时候，只需要从仓库上 pull 下来就可以了。

## Docker的使用

### 获取镜像

    docker pull hub.c.163.com/public/centos:6.5

### 列出本地镜像

    docker images

### 使用更改后的容器创建镜像

    docker commit   # 类似于git的提交更改
    docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2

### 利用Dockerfile创建镜像

    docker build -t="ouruser/sinatra:v2" .

. 是Dockerfile文件所在的目录

Dockerfile文件的一个例子：

    # This is a comment
    FROM ubuntu:14.04
    MAINTAINER <NAME> <<EMAIL>>
    RUN apt-get -qq update
    RUN apt-get -qqy install ruby ruby-dev
    RUN gem install sinatra

### 删除本地镜像

    docker rmi training/sinatra

删除所有未打过标签的本地镜像：

    docker rmi $(docker images -q -f "dangling=true")

### 新建并启动容器

    docker run ubuntu:14.04 /bin/echo 'Hello world'

容器启动之后会运行最后指明的命令，如果命令运行完了，容器就会终止，如果命令不退出，容器也会一直运行。

如果后面不接命令的话，就会运行默认的命令/bin/bash

下面是几个经常用到的参数：

- -i：打开stdin。加上-i参数之后，容器不会退出
- -t -i：会在当前命令行下进入容器的中断
- -d：后台运行
- -p：端口映射，ip:hostPort:containerPort，只能在启动时进行端口映射

### 在正在运行的容器中执行命令

    docker exec docker exec 76ed90b24f31 echo "Hello world"

76ed90b24f31 是容器ID

### 进入容器

    docker attach nostalgic_hypatia

进入容器nostalgic_hypatia中。但是这种方式在退出终端的时候容器也跟着退出了。

第二种方式。docker exec -it。

```bash
docker exec -it nostalgic_hypatia /bin/bash
```

这样输入“exit”或者按键“Ctrl + C”退出container时，这个container仍然在后台运行 。

### 停止容器

docker kill trusting_newton

停止容器名为trusting_newton的容器。

### 删除容器

    docker rm trusting_newton

删除容器trusting_newton，rm后面可以是容器name或者容器ID。删除容器之前容器的状态必须为stop，不能删除运行中的容器。
{'fraction_non_alphanumeric': 0.11327166320558807, 'fraction_numerical': 0.017745893902208796, 'mean_word_length': 5.232941176470589, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 8, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3091178', 'n_tokens_mistral': 3468, 'n_tokens_neox': 3735, 'n_words': 359}