---
author: Arun Pyasi
category: 容器与云
comments_data:
- date: '2015-05-21 16:47:25'
  message: 翻译这篇的时候还没接触docker，换做现在估计语言会组织更好些
  postip: 222.20.48.20
  username: LouisWei
- date: '2015-05-22 09:23:52'
  message: 加油！
  postip: 106.120.101.58
  username: linux
- date: '2015-05-24 09:32:04'
  message: 因为需要接触Docker有三周时间了，最近闲下来准备写一下学习blog，欢迎访问cuckoo.daoapp.io
  postip: 222.20.48.246
  username: LouisWei
- date: '2015-05-30 16:30:04'
  message: 好厉害的样子，学习了
  postip: 120.237.100.186
  username: yeyoke
- date: '2016-03-18 22:06:36'
  message: 玩玩docker 不错
  postip: 114.111.166.42
  username: 夜域诡士 [Mobile Safari 9.0|iOS 9.2]
- date: '2016-03-18 22:07:07'
  message: 加油加油
  postip: 114.111.166.42
  username: 夜域诡士 [Mobile Safari 9.0|iOS 9.2]
count:
  commentnum: 6
  favtimes: 3
  likes: 0
  sharetimes: 0
  viewnum: 20959
date: '2015-05-21 15:57:45'
editorchoice: false
excerpt: 大家好，今天我们来学习如何使用一个docker镜像交互式地创建一个Docker容器。当我们从镜像中启动一个Docker进程，Docker就会获取该镜像及其父镜像，并重复这个过程，直到到达基础镜像。然后联合文件系统（UFS）会在其顶层添加一个读写层。读写层被称之为容器，它包含了一些关于父镜像信息及一些其他的信息，如唯一ID，网络配置和资源限制等。容器是有状态的，其状态可以从
  运行态 切换到 退出态。一个处于 运行态的容器包含了在CPU上面运行的进程树，于其它在该主机上运行的进程相隔离，而退出态是指文件系统的状态，并保留了其退出值。你
fromurl: http://linoxide.com/linux-how-to/interactively-create-docker-container/
id: 5484
islctt: true
largepic: /images/p/201505/21/155734nowa22j60evvab0j.jpeg
permalink: /article-5484-1.html
pic: /data/attachment/album/201505/21/155734nowa22j60evvab0j.jpeg.thumb.jpg
related: []
reviewer: ''
selector: ''
summary: 大家好，今天我们来学习如何使用一个docker镜像交互式地创建一个Docker容器。当我们从镜像中启动一个Docker进程，Docker就会获取该镜像及其父镜像，并重复这个过程，直到到达基础镜像。然后联合文件系统（UFS）会在其顶层添加一个读写层。读写层被称之为容器，它包含了一些关于父镜像信息及一些其他的信息，如唯一ID，网络配置和资源限制等。容器是有状态的，其状态可以从
  运行态 切换到 退出态。一个处于 运行态的容器包含了在CPU上面运行的进程树，于其它在该主机上运行的进程相隔离，而退出态是指文件系统的状态，并保留了其退出值。你
tags:
- Docker
- 容器
thumb: false
title: 如何交互式地创建一个Docker容器
titlepic: false
translator: wi-cuckoo
updated: '2015-05-21 15:57:45'
---

大家好，今天我们来学习如何使用一个docker镜像交互式地创建一个Docker容器。当我们从镜像中启动一个Docker进程，Docker就会获取该镜像及其父镜像，并重复这个过程，直到到达基础镜像。然后联合文件系统（UFS）会在其顶层添加一个读写层。读写层被称之为容器，它包含了一些关于父镜像信息及一些其他的信息，如唯一ID，网络配置和资源限制等。容器是有状态的，其状态可以从 **运行态** 切换到 **退出态**。一个处于 **运行态**的容器包含了在CPU上面运行的进程树，于其它在该主机上运行的进程相隔离，而**退出态**是指文件系统的状态，并保留了其退出值。你可以使用它来启动，停止和重启一个容器。


Docker技术为IT界带来了巨大的改变，它使得云服务可以用来共享应用和工作流程自动化，使得应用可以用组件快速组合，消除了开发、品质保证、产品环境间的摩擦。在这篇文章中，我们将会建立CentOS环境，然后用Apache网络服务器提供一个网站服务。


![](/data/attachment/album/201505/21/155734nowa22j60evvab0j.jpeg)


这是一个快速且容易的教程，讨论我们怎样使用交互的shell，以交互的方式来创建一个容器。


### 1. 运行一个Docker实例


Docker首先会尝试从本地取得并运行所需的镜像，如果在本地主机上没有发现，它就会从[Docker公共注册中心](https://registry.hub.docker.com/)拉取。这里，我们将会拉取镜像并在 Docker 容器中创建一个fedora实例，并连接到它的 tty 上的bash shell。



```
# docker run -i -t fedora bash

```

![Downloading Fedora Base Image](/data/attachment/album/201505/21/155748cd6wkfknvk5xphsk.png)


### 2.安装Apache网络服务器


现在，在我们的Fedora基本镜像实例准备好后，我们将会开始交互式地安装Apache网络服务器，而不是为它创建Dockerfile。为了做到这点，我们需要在终端或者shell运行以下命令。



```
# yum update

```

![Installing httpd](/data/attachment/album/201505/21/155749y41zlre1meysa7f4.png)



```
# yum install httpd

```

![Installing httpd](/data/attachment/album/201505/21/155749y41zlre1meysa7f4.png)


退出容器的 tty。



```
# exit

```

### 3.保存镜像


现在，我们要去保存在Fedora实例里做的修改。要做到这个，我们首先需要知道实例的容器ID。而为了得到ID，我们又需要运行以下命令（LCTT 译注：在容器外执行该命令）。



```
# docker ps -a

```

![Docker Running Container](/data/attachment/album/201505/21/155750t2lofzildfwuijnz.png)


然后，我们会保存这些改变为一个新的镜像，请运行以下命令。



```
# docker commit c16378f943fe fedora-httpd

```

![committing fedora httpd](/data/attachment/album/201505/21/155750uu5e808zs5dudu5u.png)


这里，修改已经通过使用容器ID保存起来了，镜像名字叫fedora-httpd。为了确认新的镜像是否在运行，我们将运行以下命令。



```
# docker images

```

![view docker images](/data/attachment/album/201505/21/155750rnkz3mk83kfvkghb.png)


### 4. 添加内容到新的镜像


我们自己新的Fedora Apache镜像正成功的运行，现在我们想添加一些我们网站的网页内容到Apache网络服务器，使得网站能够开箱即用。为做到这点，我们需要创建一个新的Dockerfile，它会处理从复制网页内容到启用80端口的所有操作。要达到这样的目的，我们需要使用我们最喜欢的文本编辑器创建Dockerfile文件，像下面演示的一样。



```
# nano Dockerfile

```

现在，我们需要添加以下的命令行到文件中。



```
FROM fedora-httpd
ADD mysite.tar /tmp/
RUN mv /tmp/mysite/* /var/www/html
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/httpd" ]
CMD [ "-D", "FOREGROUND" ]

```

![configuring Dockerfile](/data/attachment/album/201505/21/155751t8p3mx22gnmddx77.png)


这里，上述的Dockerfile中，放在mysite.tar里的网页内容会自动解压到/tmp/文件夹里。然后，整个站点会被移动到Apache的网页根目录/var/www/html/，命令expose 80会打开80端口，这样网站就能正常访问了。其次，入口点放在了/usr/sbin/https里面，保证Apache服务器能够执行。


### 5. 构建并运行一个容器


现在，我们要用刚刚创建的Dockerfile创建我们的容器，以便将我们的网站添加到上面。为做到这，我们需要运行以下命令。



```
# docker build -rm -t mysite .

```

![Building mysite Image](/data/attachment/album/201505/21/155751kr3qjrpejjkepqpz.png)


建立好我们的新容器后，我们需要要用下面的命令来运行容器。



```
# docker run -d -P mysite

```

![Running mysite Container](/data/attachment/album/201505/21/155752bcfkumrecu9zu9zc.png)


### 总结


最后，我们已经成功的以交互式的方式建立了一个Docker容器。在本节方法中，我们是直接通过交互的shell命令建立我们的容器和镜像。在建立与配置镜像与容器时，这种方法十分简单且快速。如果你有任何问题，建议和反馈，请在下方的评论框里写下来，以便我们可以提升或者更新我们的文章。谢谢！祝生活快乐 :-)




---


via: <http://linoxide.com/linux-how-to/interactively-create-docker-container/>


作者：[Arun Pyasi](http://linoxide.com/author/arunp/) 译者：[wi-cuckoo](https://github.com/wi-cuckoo) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出