在Ubuntu上使用Docker管理Linux容器
版本:1.0
作者:Srijan Kishore
最后编辑:02 / 2014年7月
本指南介绍如何有效地安装Docker并管理虚拟机。 Docker是开源Linux虚拟化平台,用于开发人员和系统管理员轻松构建,部署和执行分布式应用程序。 Docker由Docker Engine,轻型运行时和虚拟化层组成,用于打包和版本虚拟机的工具类似于源代码存储库和Docker Hub,云服务即共享应用程序和自动化工作流程。 Docker允许应用程序从组件快速组装,消除开发环境,质量控制和生产之间的摩擦。
1初步说明
在我的情况下,我有Ubuntu 14.04我将安装docker。 在虚拟化软件市场中,我们提供了几种完整的硬件虚拟化技术,如KVM,Xen或Hyper-V。 但是,完整的可视化程序太重,无法在Linux上虚拟化单个应用程序。 我们可以通过使用Linux容器来克服这种情况,这是操作系统级可视化的好替代品。 Linux容器对于将开发/测试环境安装在一堆容器中是非常有用的。 Docker为此提供了Linux容器环境。
2安装
正如我上面说的,我有Ubuntu,我要安装docker。 在本章中,我将向您展示安装docher的2个选项,在我使用Ubuntu版本库中的docker版本时,此版本由Ubuntu维护,为期5年的LTS支持,但不是最新版本。 在2b中,我将使用Ubuntu ppa存储库中的最新版本。 由于码头工程处于严重的开发阶段,最新的Docker版本从2b)将很可能适合大多数用户。 请使用方法2a或2b,但不要同时使用noth!
2a从官方Ubuntu存储库安装
安装使用:
sudo apt-get update
sudo apt-get install docker.io
并创建一个符号链接,使得在shell上的使用更容易。
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
2b安装最新的docker版本
要从docker.io存储库安装最新的docker版本,请运行此命令
curl -s https://get.docker.io/ubuntu/ | sudo sh
3准备外壳环境
现在我将添加我的user = srijan到docker组
sudo usermod -a -G docker srijan
或使用:
sudo usermod -a -G docker $USER
在这里,我将再次注销我的会话和重新登录。 现在我将添加docker配置文件,让系统通知其位置。
sudo vi /etc/default/docker.io
DOCKER="/usr/bin/docker.io" |
现在重启服务如下:
sudo service docker.io restart
4容器管理
我将使用Ubuntu操作系统启动容器。我将下载Docker窗图像如下:docker pull ubuntu
Note: pull is used to pull an image or a repository from the registry现在我将使用以下命令登录到ubuntu容器的bash shell:
docker run -i -t ubuntu /bin/bash
只是为了确认我会检查我的容器IP如下:
root@fd98ee950252:/# ifconfig eth0 Link encap:Ethernet HWaddr 5a:a6:c6:88:f2:48 inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::58a6:c6ff:fe88:f248/64 Scope:Link UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:7 errors:0 dropped:2 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:558 (558.0 B) TX bytes:648 (648.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) root@fd98ee950252:/#
我的容器上的IP为172.17.0.3。 同样我也可以使用其他容器。 要退出容器,只需键入:
exit
同样,您也可以使用其他操作系统容器,例如
我想使用Debian容器我将使用代码:
docker run -i -t debian /bin/bash
如果你想有特定的分布,那么使用:
docker run -i -t ubuntu:12.04 /bin/bash
它将创建ubuntu12.04容器。 我将交叉检查如下:
root@44b56100fd1f:/# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=12.04 DISTRIB_CODENAME=precise DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS" root@44b56100fd1f:/#
4建立我们自己的图像
有两种方法可以创建Docker镜像:
- 通过docker commit命令
- 通过Docker构建命令与Dockerfile
Docker提交方法目前不推荐使用,因为使用Dockerfile构建的功能更加灵活和强大,但为了完整起见,我们将向您演示。 之后,我将重点介绍构建Docker映像的推荐方法:编写Dockerfile并使用docker build命令。
4.1使用Docker提交创建图像
我将创建一个容器,更改该容器,因为您将更改代码,然后将这些更改提交到新的映像。
我们先从我们过去使用的ubuntu镜像创建一个容器。
docker run -i -t ubuntu /bin/bash
root@73527b8b4261:/#
Note: Please see above root is showing the hostname 73527b8b4261, it is the container name created & it will differ in your case.
此外,我将安装apache:
apt-get install apache2
我已经启动了容器,然后在其中安装了Apache。 现在我将使用这个容器作为Web服务器,所以我将把它保存在当前状态。
每次我创建一个新的容器时,这样可以避免我们用Apache重新构建它。 为此,我将使用exit命令退出容器,
并使用docker commit命令。
exit
docker commit 73527b8b4261 srijan/apache2 8ce0ea7a1528
注意:这里73527b8b4261是我的容器名称,我使用8ce0ea7a1528标签作为容器,可以给任何标签名称或使用相同的名称。
假设您忘记了可以使用的最后创建的容器的ID:
docker ps -l -q
将产生73527b8b4261
Note: 73527b8b4261 is your last created container name, it will differ in your case.
我们来看看我们的新形象。 可以实现如下:
docker images srijan/apache2
srijan@vboxtest:~$ docker images srijan/apache2 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE srijan/apache2 8ce0ea7a1528 741155868ac8 6 minutes ago 207.2 MB srijan@vboxtest:~$
Note: Here 8ce0ea7a1528 was the tag name which I used at the time of saving the container,
Note: 741155868ac8 is the IMAGE ID of that container
Note: All these values will difer in your case as at the time of saving the container docker generates random name to them
现在我将保存自定义的图像如下:
docker commit -m="A new custom image" --author="Srijan Kishore" 73527b8b4261 srijan/apache2:webserver
它将结果如下:
srijan@vboxtest:~$ docker commit -m="A new custom image" --author="Srijan Kishore" 73527b8b4261 srijan/apache2:webserver f0367362eb405c513ac002b5cf172a2c0bc6c8212eab91c613f9ee611cf92fec
要从我们的新图像运行一个容器,我们可以使用docker运行命令。
docker run -t -i srijan/apache2:webserver /bin/bash
我们可以交叉检查我们提交的图像如下:
docker inspect srijan/apache2:webserver
srijan@vboxtest:~$ docker inspect srijan/apache2:webserver
[{
"Architecture": "amd64",
"Author": "Srijan Kishore",
"Comment": "A new custom image",
"Config": {
"AttachStderr": false,
"AttachStdin": false,
"AttachStdout": false,
"Cmd": [
"/bin/bash"
],
"CpuShares": 0,
"Cpuset": "",
"Domainname": "",
"Entrypoint": null,
"Env": [
"HOME=/",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"ExposedPorts": null,
"Hostname": "",
"Image": "",
"Memory": 0,
"MemorySwap": 0,
"NetworkDisabled": false,
"OnBuild": null,
"OpenStdin": false,
"PortSpecs": null,
"StdinOnce": false,
"Tty": false,
"User": "",
"Volumes": null,
"WorkingDir": ""
},
"Container": "73527b8b42614f6ecd83fb5f9822d6086988d3b68fd5e32b4afbc7cd415402fd",
"ContainerConfig": {
"AttachStderr": true,
"AttachStdin": true,
"AttachStdout": true,
"Cmd": [
"/bin/bash"
],
"CpuShares": 0,
"Cpuset": "",
"Domainname": "",
"Entrypoint": null,
"Env": [
"HOME=/",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"ExposedPorts": null,
"Hostname": "73527b8b4261",
"Image": "ubuntu",
"Memory": 0,
"MemorySwap": 0,
"NetworkDisabled": false,
"OnBuild": null,
"OpenStdin": true,
"PortSpecs": null,
"StdinOnce": true,
"Tty": true,
"User": "",
"Volumes": null,
"WorkingDir": ""
},
"Created": "2014-06-30T12:58:04.973349049Z",
"DockerVersion": "1.0.1",
"Id": "f0367362eb405c513ac002b5cf172a2c0bc6c8212eab91c613f9ee611cf92fec",
"Os": "linux",
"Parent": "ef83896b7fb99b00b9e0e6ac943826386e7edcef11a3a2f58b42011ab4a4e683",
"Size": 14463026
}
]srijan@vboxtest:~$
要从我们的新图像运行一个容器,我们可以使用docker运行命令。
docker run -t -i srijan/apache2:webserver /bin/bash