mirror of
https://github.com/yeasy/docker_practice.git
synced 2025-08-02 14:01:49 +00:00
Fix issue#20, format following the guidelines
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# Docker容器
|
||||
容器是Docker又一核心概念。
|
||||
# Docker 容器
|
||||
容器是 Docker 又一核心概念。
|
||||
|
||||
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
##守护态运行
|
||||
|
||||
更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加`-d`参数来实现。
|
||||
更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 `-d` 参数来实现。
|
||||
|
||||
例如下面的命令会在后台运行容器。
|
||||
```
|
||||
@@ -8,13 +8,13 @@ $ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; s
|
||||
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
|
||||
```
|
||||
|
||||
容器启动后会返回一个唯一的id,也可以通过`docker ps`命令来查看容器信息。
|
||||
容器启动后会返回一个唯一的 id,也可以通过 `docker ps` 命令来查看容器信息。
|
||||
```
|
||||
$ sudo docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
|
||||
```
|
||||
要获取容器的输出信息,可以通过`docker logs`命令。
|
||||
要获取容器的输出信息,可以通过 `docker logs` 命令。
|
||||
```
|
||||
$ sudo docker logs insane_babbage
|
||||
hello world
|
||||
|
@@ -1,8 +1,8 @@
|
||||
## 进入容器
|
||||
在使用`-d`参数时,容器启动后会进入后台。
|
||||
某些时候需要进入容器进行操作,有很多种方法,包括使用`docker attach`命令或`nsenter`工具等。
|
||||
### attach命令
|
||||
`docker attach`是Docker自带的命令。下面示例如何使用该命令。
|
||||
在使用 `-d` 参数时,容器启动后会进入后台。
|
||||
某些时候需要进入容器进行操作,有很多种方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。
|
||||
### attach 命令
|
||||
`docker attach` 是Docker自带的命令。下面示例如何使用该命令。
|
||||
```
|
||||
$ sudo docker run -idt ubuntu
|
||||
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
|
||||
@@ -12,12 +12,12 @@ CONTAINER ID IMAGE COMMAND CREATED
|
||||
$sudo docker attach nostalgic_hypatia
|
||||
root@243c32535da7:/#
|
||||
```
|
||||
但是使用`attach`命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
|
||||
但是使用 `attach` 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
|
||||
|
||||
### nsenter命令
|
||||
### nsenter 命令
|
||||
#### 安装
|
||||
`nsenter`工具在util-linux包2.23版本后包含。
|
||||
如果系统中util-linux包没有该命令,可以按照下面的方法从源码安装。
|
||||
`nsenter` 工具在 util-linux 包2.23版本后包含。
|
||||
如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。
|
||||
```
|
||||
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
|
||||
$ ./configure --without-ncurses
|
||||
@@ -25,19 +25,19 @@ $ make nsenter && sudo cp nsenter /usr/local/bin
|
||||
```
|
||||
|
||||
#### 使用
|
||||
`nsenter`可以访问另一个进程的名字空间。nsenter要正常工作需要有root权限。
|
||||
很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安装最新版本的util-linux(2.24)版,请按照以下步骤:
|
||||
`nsenter` 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。
|
||||
很不幸,Ubuntu 14.4 仍然使用的是 util-linux 2.20。安装最新版本的 util-linux(2.24)版,请按照以下步骤:
|
||||
```
|
||||
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
|
||||
$ cd util-linux-2.24
|
||||
$ ./configure --without-ncurses && make nsenter
|
||||
$ sudo cp nsenter /usr/local/bin
|
||||
```
|
||||
为了连接到容器,你还需要找到容器的第一个进程的PID,可以通过下面的命令获取。
|
||||
为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。
|
||||
```
|
||||
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
|
||||
```
|
||||
通过这个PID,就可以连接到这个容器:
|
||||
通过这个 PID,就可以连接到这个容器:
|
||||
```
|
||||
$ nsenter --target $PID --mount --uts --ipc --net --pid
|
||||
```
|
||||
@@ -54,12 +54,12 @@ $ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
|
||||
root@243c32535da7:/#
|
||||
```
|
||||
更简单的,建议大家下载
|
||||
[.bashrc_docker](https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker),并将内容放到.bashrc中。
|
||||
[.bashrc_docker](https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker),并将内容放到 .bashrc 中。
|
||||
```
|
||||
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
|
||||
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
|
||||
```
|
||||
这个文件中定义了很多方便使用Docker的命令,例如`docker-pid`可以获取某个容器的PID;而`docker-enter`可以进入容器或直接在容器内执行命令。
|
||||
这个文件中定义了很多方便使用 Docker 的命令,例如 `docker-pid` 可以获取某个容器的 PID;而 `docker-enter` 可以进入容器或直接在容器内执行命令。
|
||||
```
|
||||
$ echo $(docker-pid <container>)
|
||||
$ docker-enter <container> ls
|
||||
|
@@ -1,7 +1,7 @@
|
||||
##导出和导入容器
|
||||
|
||||
###导出容器
|
||||
如果要导出本地某个容器,可以使用`docker export`命令。
|
||||
如果要导出本地某个容器,可以使用 `docker export` 命令。
|
||||
```
|
||||
$ sudo docker ps -a
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
@@ -11,18 +11,18 @@ $ sudo docker export 7691a814370e > ubuntu.tar
|
||||
这样将导出容器快照到本地文件。
|
||||
|
||||
###导入容器快照
|
||||
可以使用`docker import`从容器快照文件中再导入为镜像,例如
|
||||
可以使用 `docker import` 从容器快照文件中再导入为镜像,例如
|
||||
```
|
||||
$ cat ubuntu.tar | sudo docker import - test/buntu:v1.0
|
||||
$ sudo docker images
|
||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
||||
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
|
||||
```
|
||||
此外,也可以通过指定URL或者某个目录来导入,例如
|
||||
此外,也可以通过指定 URL 或者某个目录来导入,例如
|
||||
```
|
||||
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
|
||||
```
|
||||
|
||||
*注:用户既可以使用`docker load`来导入镜像存储文件到本地镜像库,也可以使用`docker import`来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
|
||||
*注:用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库,也可以使用 `docker import` 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
|
||||
|
||||
|
||||
|
@@ -1,9 +1,9 @@
|
||||
##删除容器
|
||||
可以使用`docker rm`来删除一个处于终止状态的容器。
|
||||
可以使用 `docker rm` 来删除一个处于终止状态的容器。
|
||||
例如
|
||||
```
|
||||
$sudo docker rm trusting_newton
|
||||
trusting_newton
|
||||
```
|
||||
如果要删除一个运行中的容器,可以添加`-f`参数。Docker会发送SIGKILL信号给容器。
|
||||
如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。
|
||||
|
||||
|
@@ -1,24 +1,24 @@
|
||||
##启动容器
|
||||
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
|
||||
|
||||
因为Docker的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
|
||||
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
|
||||
|
||||
###新建并启动
|
||||
所需要的命令主要为`docker run`。
|
||||
所需要的命令主要为 `docker run`。
|
||||
|
||||
例如,下面的命令输出一个"Hello World",之后终止容器。
|
||||
例如,下面的命令输出一个 “Hello World”,之后终止容器。
|
||||
```
|
||||
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
|
||||
Hello world
|
||||
```
|
||||
这跟在本地直接执行`/bin/echo 'hello world'`几乎感觉不出任何区别。
|
||||
这跟在本地直接执行 `/bin/echo 'hello world'` 几乎感觉不出任何区别。
|
||||
|
||||
下面的命令则启动一个bash终端,可以让用户进行交互。
|
||||
下面的命令则启动一个 bash 终端,允许用户进行交互。
|
||||
```
|
||||
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
|
||||
root@af8bae53bdd3:/#
|
||||
```
|
||||
其中,`-t`选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, `-i`则让容器的标准输入保持打开。
|
||||
其中,`-t` 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, `-i` 则让容器的标准输入保持打开。
|
||||
|
||||
在交互模式下,用户可以通过所创建的终端来输入命令,例如
|
||||
```
|
||||
@@ -28,24 +28,24 @@ root@af8bae53bdd3:/# ls
|
||||
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
|
||||
```
|
||||
|
||||
当利用`docker run`来创建容器时,Docker在后台运行的标准操作包括:
|
||||
当利用 `docker run` 来创建容器时,Docker 在后台运行的标准操作包括:
|
||||
|
||||
* 检查本地是否存在指定的镜像,不存在就从公有仓库下载
|
||||
* 利用镜像创建并启动一个容器
|
||||
* 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
|
||||
* 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
|
||||
* 从地址池配置一个ip地址给容器
|
||||
* 从地址池配置一个 ip 地址给容器
|
||||
* 执行用户指定的应用程序
|
||||
* 执行完毕后容器被终止
|
||||
|
||||
###启动已终止容器
|
||||
可以利用`docker start`命令,直接将一个已经终止的容器启动运行。
|
||||
可以利用 `docker start` 命令,直接将一个已经终止的容器启动运行。
|
||||
|
||||
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用`ps`或`top`来查看进程信息。
|
||||
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 `ps` 或 `top` 来查看进程信息。
|
||||
```
|
||||
root@ba267838cc1b:/# ps
|
||||
PID TTY TIME CMD
|
||||
1 ? 00:00:00 bash
|
||||
11 ? 00:00:00 ps
|
||||
```
|
||||
可见,容器中仅运行了指定的bash应用。这种特点使得Docker对资源的利用率极高,是货真价实的轻量级虚拟化。
|
||||
可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。
|
||||
|
@@ -1,10 +1,10 @@
|
||||
##终止容器
|
||||
可以使用`docker stop`来终止一个运行中的容器。
|
||||
可以使用 `docker stop` 来终止一个运行中的容器。
|
||||
|
||||
此外,当Docker容器中指定的应用终结时,容器也自动终止。
|
||||
例如对于上一章节中只启动了一个终端的容器,用户通过`exit`命令或`Ctrl+d`来退出终端时,所创建的容器立刻终止。
|
||||
例如对于上一章节中只启动了一个终端的容器,用户通过 `exit` 命令或 `Ctrl+d` 来退出终端时,所创建的容器立刻终止。
|
||||
|
||||
终止状态的容器可以用`docker ps -a`命令看到。例如
|
||||
终止状态的容器可以用 `docker ps -a` 命令看到。例如
|
||||
```
|
||||
sudo docker ps -a
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
@@ -12,6 +12,6 @@ ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes a
|
||||
98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike
|
||||
```
|
||||
|
||||
处于终止状态的容器,可以通过`docker start`命令来重新启动。
|
||||
处于终止状态的容器,可以通过 `docker start` 命令来重新启动。
|
||||
|
||||
此外,`docker restart`命令会将一个运行态的容器终止,然后再重新启动它。
|
||||
此外,`docker restart` 命令会将一个运行态的容器终止,然后再重新启动它。
|
||||
|
Reference in New Issue
Block a user