docker
使用Linux容器
什么是Linux容器?
Linux容器(LXC)是一种轻量级的虚拟化方法。Linux容器通过具有自己的进程和网络空间的虚拟环境在操作系统级别提供虚拟化。使用LXC,无需虚拟机。Linux容器使您可以在沙盒环境(彼此隔离)中运行不同操作系统的多个容器。
什么是Docker?
Docker是基于容器的虚拟化工具,可让您轻松创建和管理容器。Docker是一个非常轻量级的虚拟化框架,提供以下功能:
- 与外界隔离的沙盒环境
- 可移植性-容器只是可以快速复制和移动的目录
- 轻巧-仅使用每个应用程序请求的资源
在以下示例中,我们将将Docker框架安装到Ubuntu 14.04 LTS(64位)环境中。
安装Docker-Ubuntu 14.04 LTS(64位)
首先,我们将使用以下命令更新存储库:
$ sudo apt-get update
接下来,我们执行安装命令:
$ sudo apt-get install docker.io
创建一个符号链接:
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
验证Docker安装
验证我们的安装的最简单方法是实际尝试。在下面的测试中,我们将拉下一个Ubuntu
图像并打开一个外壳。
$ sudo docker run -i -t ubuntu /bin/bash
我们可以通过在容器中执行以下命令来验证我们现在是否正在Ubuntu 14.04 LTS容器中运行:
显示与操作系统相关的信息:
root@594825c51052:/# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04 LTS Release: 14.04 Codename: trusty
请注意,root @
后面的数字是容器ID。
ifconfig:显示网络接口信息:
john@ubuntu1404:~$ ifconfig docker0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::6010:2aff:fef4:ddb5/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:55 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1072 (1.0 KB) TX bytes:8619 (8.6 KB)
请注意,在输出的第二行的开头指定了术语docker0
。
运行Fedora
如前所述,您不仅限于使用容器的单个操作系统。以下是正在使用的Fedora图像的快速示例:
john@ubuntu1404:~$ sudo docker.io run -i -t fedora /bin/bash Unable to find image 'fedora' locally Pulling repository fedora b7de3133ff98: Pulling image (rawhide) from fedora, endpoint: https://cdn-registrb7de3133ff98: Download complete 511136ea3c5a: Download complete ef52fb1fe610: Download complete WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers cant use it. Using default external servers : [8.8.8.8 8.8.4.4] bash-4.2# bash-4.2# cat /etc/fedora-release Fedora release 20 (Heisenbug)
docker info:显示Docker相关信息。该命令是从主机系统执行的
john@ubuntu1404:~$ sudo docker info Containers: 1 Images: 23 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Dirs: 25 Execution Driver: native-0.1 Kernel Version: 3.13.0-24-generic WARNING: No swap limit support
显示Docker容器
要显示正在运行的Docker容器信息,您可以执行以下命令:
john@ubuntu1404:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
显示所有docker容器
john@ubuntu1404:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 594825c51052 ubuntu:14.04 /bin/bash 5 minutes ago Exit 0 sharp_bohr
管理容器
在本节中,我们将研究如何控制容器。我们将使用以下命令创建一个容器:
$ JOB=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello World; sleep 1; done") WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers cant use it. Using default external servers : [8.8.8.8 8.8.4.4]
上面的命令将在Ubuntu容器中运行一个简单的while true
循环。
显示正在运行的容器
john@ubuntu1404:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f49ff80088f5 ubuntu:14.04 /bin/sh -c while tru About a minute ago Up About a minute jolly_pasteur
停止容器
要停止容器,我们可以执行以下命令:docker stop及其后的Job ID:
john@ubuntu1404:~$ sudo docker stop $JOB f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f john@ubuntu1404:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
从ps
命令可以看到我们的容器不再运行。
启动容器
我们可以通过执行以下命令来重新启动容器:docker start及其后的Job ID。
john@ubuntu1404:~$ sudo docker start $JOB f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f john@ubuntu1404:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f49ff80088f5 ubuntu:14.04 /bin/sh -c while tru 4 minutes ago Up 4 seconds jolly_pasteur
现在,我们可以看到容器再次运行。
杀死/停止容器
为了杀死正在运行的容器并将其永久删除,我们执行以下一系列命令:
john@ubuntu1404:~$ sudo docker kill $JOB f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f john@ubuntu1404:~$ sudo docker stop $JOB f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f john@ubuntu1404:~$ sudo docker rm $JOB f49ff80088f517b46a57ae74dea225a515f0809446c830bdbec15b5b7dfd213f john@ubuntu1404:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
注意:要移走容器,必须先将其停止!
设置DNS设置-容器的域搜索顺序
要为所有Docker容器设置DNS服务器,我们可以使用命令 docker -d --dns 8.8.8.8
要为所有Docker容器设置DNS搜索域,我们可以使用命令 docker -d --dns-search example.com
Docker用户权限
默认情况下,普通用户无法执行docker命令,除非他们使用sudo
选项来升级其特权。但是,可以通过将普通用户的用户标识添加到docker
组来授予普通用户必要的权限。如果普通用户尝试运行docker命令并且他们不是docker组成员,则您将看到类似于以下消息:
john@ubuntu1404:~$ docker ps 2014/05/07 11:24:08 dial unix /var/run/docker.sock: permission denied
将用户添加到Docker组
要将用户添加到docker组,请执行以下命令:sudo usermod -a -G docker userid
john@ubuntu1404:~$ sudo usermod -a -G docker john
现在,如果我们执行groups
命令以及相关的用户标识,我们将注意到我们似乎仍然不在docker组内。没关系,您需要做的就是注销然后重新登录。
注销之前:
john@ubuntu1404:~$ groups john adm cdrom sudo dip plugdev lpadmin sambashare
注销并重新登录后:
john@ubuntu1404:~$ groups john adm cdrom sudo dip plugdev lpadmin sambashare docker
现在您应该看到已添加组docker。现在您应该能够执行不带sudo前缀的docker命令:
john@ubuntu1404:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11500463ac8a fedora:20 /bin/bash 7 minutes ago Exit 0 backstabbing_turing
启动和停止Docker守护程序
要验证docker守护进程正在运行,我们可以使用status命令: sudo service docker.io status
停止docker守护我们使用命令:sudo service docker.io stop
要启动docker守护我们使用命令:sudo service docker.io start
要重新启动docker守护程序,我们可以使用以下命令:sudo service docker.io restart
john@ubuntu1404:~$ sudo service docker.io status docker.io start/running, process 2656 john@ubuntu1404:~$ sudo service docker.io stop docker.io stop/waiting john@ubuntu1404:~$ sudo service docker.io start docker.io start/running, process 2729 john@ubuntu1404:~$ sudo service docker.io restart docker.io stop/waiting docker.io start/running, process 2788
Docker命令
有关Docker中可用命令的列表,只需执行不带参数的docker命令。
可用的Docker命令列表
Commands: attach Attach to a running container build Build a container from a Dockerfile commit Create a new image from a containers changes cp Copy files/folders from the containers filesystem to the host path diff Inspect changes on a containers filesystem events Get real time events from the server export Stream the contents of a container as a tar archive history Show the history of an image images List images import Create a new filesystem image from the contents of a tarball info Display system-wide information insert Insert a file in an image inspect Return low-level information on a container kill Kill a running container load Load an image from a tar archive login Register or Login to the docker registry server logs Fetch the logs of a container port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT ps List containers pull Pull an image or a repository from the docker registry server push Push an image or a repository to the docker registry server restart Restart a running container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save an image to a tar archive search Search for an image in the docker index start Start a stopped container stop Stop a running container tag Tag an image into a repository top Lookup the running processes of a container version Show the docker version information wait Block until a container stops, then print its exit code