在Linux中开启Docker引擎
我们可以在Linux中安装Docker并运行Hello world应用程序。通过下面这些操作,我们将会学到更多有关于Docker的基础特征。我们将会学到如何:
- 安装Docker引擎
- 在一个容器中运行软件镜像
- 在Docker Hub中浏览一个镜像
- 创建你的镜像,并且在容器中运行它
- 创建一个Docker Hub账户和一个镜像库
- 创建你自己的镜像
- 将你的镜像放到Docker Hub中让其他人使用
该开始教程是用于减少用户碰到问题的可能性,为了能够测试成功,一定要遵循下面说明的步骤来进行操作。该过程将会消耗大约45分钟。
确保你了解。。。
该开始教程使用命令行来进行相应的操作。你不必特别熟悉命令行,但是你应该了解如何打开shell或终端,并且在那个环境中运行基本的命令。它帮助我们了解如何去导航一个目录树,操作文件,列举运行的进程等等。
安装Docker(在Ubuntu中)
Ubuntu
Docker支持下面的这些Ubuntu操作系统:
- Ubuntu Xenial 16.04 (LTS)
- Ubuntu Wily 15.10
- Ubuntu Trusty 14.04 (LTS)
- Ubuntu Precise 12.04 (LTS)
该页指导你使用Docker管理发行包和安装机制来安装Docker。使用这些包能够确保你获得最新的Docker发行版。如果你希望使用Ubuntu管理包进行安装,可以查阅一个UBuntu资料。
注意:Ubuntu 14.10和15.04存在Docker的APT库,但是并不官方支持。
要求
不管你的Ubuntu版本是什么,Docker要求64位系统安装。除此之外,你的内核最低版本要求为3.10。最近的3.10的较小版本或最新的维护版本都是可以接受的。
版本低于3.10的内核缺少一些运行Docker容器的特征。这些较老版本的内核被了解到,存在一些bug,这些bug将会导致数据丢失;并且在特定条件下,会导致频繁的恐慌。
你可以打开一个终端,使用uname -r
来检查你的当前内核版本。
bobo@bobo:~$ uname -r
3.19.0-15-generic
注意:如果你之前使用`APT`安装了Docker,一定要确定更新你的`APT`源码到最新的Docker库。
更新你的apt源
Docker的APT
库包含Docker 1.7.1和更高版本。为了设置APT
从最新的库中使用包:
- 使用
sudo
或root
权限,作为一个用户登陆你的机器 - 打开一个终端窗口
- 更新包信息,确定APT以
https
方法工作,并且CA证书已被安装。
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
- 添加新的
GPG
键
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
- 使用你喜欢的编辑器打开
/etc/apt/sources.list.d/docker.list
文件。如果文件不存在,则创建他。 - 移除所有存在的条目。
为你的Ubuntu操作系统添加一个条目。
可能的条目为:在Ubuntu Precise 12.04 (LTS)中
deb https://apt.dockerproject.org/repo ubuntu-precise main
在Ubuntu Trusty 14.04 (LTS)中
deb https://apt.dockerproject.org/repo ubuntu-trusty main
在Ubuntu Wily 15.10中
deb https://apt.dockerproject.org/repo ubuntu-wily main
在Ubuntu Xenial 16.04(LTS)
deb https://apt.dockerproject.org/repo ubuntu-xenial main
注意:Docker并不为所有的架构提供包。你可以在 https://master.dockerproject.org 中找到构建的二进制。为了在多架构系统上安装docker,向条目中添加一个
[arch=...]
元素。细节参考Debian Multiarch wiki保存和关闭
/etc/apt/sources.list.d/docker.list
文件。- 更新
APT
包索引。
$ sudo apt-get update
- 如果旧的repo存在则清除
$ sudo apt-get purge lxc-docker
- 验证
APT
是否是从正确的库中拉取下来的。
$ apt-cache policy docker-engine
从现在开始,当你再运行apt-get upgrade
的时候,APT
会从最新的库中拉取出来。
Ubuntu版本的条件
- Ubuntu Xenial 16.04 (LTS)
- Ubuntu Wily 15.10
- Ubuntu Trusty 14.04 (LTS)
对于Ubuntu Trusty,Wily和Xenial来说,我们推荐您安装linux-image-extra
内核包。linux-image-extra
包允许你使用aufs
存储驱动。
为了给您的内核版本安装linux-image-extra
包:
- 在你的Ubuntu系统中打开一个终端。
- 更新你的包管理器。
$ sudo apt-get update
- 安装推荐的包
$ sudo apt-get install linux-image-extra-$(uname -r)
- 继续安装Docker
如果你正在Ubuntu 14.04或12.04中安装,apparmor
是需要的。你可以使用apt-get install apparmor
来安装它。
Ubuntu Precise 12.04 (LTS)
对于Ubuntu Precise来说,Docker需要3.13的内核版本。如果你的内核版本必3.13低,你必须更新它。查看这个表格来看对于你的环境需要哪些包。
为了更新你的内核和安装额外的包,做下列操作:
- 打开一个终端。
- 更新包管理器
$ sudo apt-get update
- 必须的和可选的包都要安装
$ sudo apt-get install linux-image-generic-lts-trusty
依赖于你的环境,你可能需要安装更多,正如在上述表格中描述的。
- 重启你的宿主机。
- 在系统重启之后,继续安装Docker。
安装
确定你已经安装了你Ubuntu版本的必要条件。然后,使用下面的命令安装Docker:
- 使用
sudo
特权作为一个用户登陆你的Ubuntu。 - 更新你的
APT
包索引。
$ sudo apt-get update
- 安装Docker。
$ sudo apt-get install docker-engine
- 开启
docker
域
$ sudo service docker start
- 验证
docker
被正确安装
$ sudo docker run hello-world
该命令会向容器中下载一个测试镜像并且运行它。当容器运行成功,就会打印一个信息,然后退出。
bobo@bobo:~$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
03f4658f8b78: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/userguide/
可选配置
该小节包含可选的过程,用于配置你的Ubuntu更好的运行Docker。
- 创建docker组
- 适应内存和交换
- 使能UFW转发
- 配置一个DNS服务器来用
- 配置Docker开机自启
创建一个Docker组
docker
域是和Unix的一个套接字绑定的,而不是一个TCP端口。默认情况下,Unix套接字是属于用户root
的,并且其他用户能够使用sudo
访问他。处于这个原因,docker
域会一直以root
用户运行。
为了避免在使用docker
命令的时候必须要使用sudo
,我们需要创建一个Unix组称作docker
,并且向该组中添加用户。当docker
域启动的时候,Unix套接字的读写所有权由docker
组拥有。
警告:`docker`组和`root`用户是平等的。
为了创建docker
组和添加你的用户:
- 使用
sudo
权限登陆Ubuntu。 - 创建
docker
组
$ sudo groupadd docker
- 向
docker
组中添加你的用户
$ sudo usermod -aG docker ubuntu
- 登出再登入
这个确保你的用户以正确的权限运行。 - 不使用
sudo
运行docker
来验证您的工作。
$ docker run hello-world
如果失败信息和下面类似:
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
检查DOCKER_HOST
环境变量是否被设置,如果为设置,则重新设置。
调整内存和交换分区
当用户运行Docker的时候,当运行一个镜像的时候,他们可能会看到下面这些信息:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.
为了阻止这些信息,就需要使能你系统上的内存和交换分区(memory and swap accounting)。使能内存和交换分区能够引起内存开销和降解性能,即使Docker并没有在使用。内存开销大约是所有可用内存的1%。性能大约降解10%。
为了在使用GNU GRUB的系统上使能内存和交换分区,遵循下面的步骤:
- 作为一个用户使用
sudo
特权来登陆Ubuntu。 - 编辑
/etc/default/grub
文件。 - 像下面这样设置
GRUB_CMDLINE_LINUX
值。
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
- 保存并关闭文件
- 更新GRUB
$ sudo update-grub
- 重启系统
使能UFW转发
如果在你运行Docker,在同样的宿主机上使用UFW(Uncomplicated Firewall)的时候,你将需要做额外的配置。Docker使用一个桥来管理容器网络。默认情况下,UFW丢弃所有的转发消息。结果是,当UFW被使能了,Docker要想去运行,你必须设置UFW的转发策略。
UFW的默认设置规则是拒绝所有的进来的消息。如果你想要另一个主机到达你的容器,你需要在Docker端口上允许进入的连接。如果LTS被使能,则Docker的默认端口为2376
,如果没有,则端口为2375
。如果TLS没有被使能,通信是未被加密的。默认情况下,Docker是在TLS未被使能的情况下运行的。
为了配置UFW和在Docker端口上允许进入的连接:
- 作为用户以
sudo
登陆。 - 验证UFW是否被安装和被使能。
$ sudo ufw status
- 打开
/etc/default/ufw
并编辑。
$ sudo nano /etc/default/ufw
- 设置
DEFAULT_FORWARD_POLICY
策略为:
DEFAULT_FORWARD_POLICY="ACCEPT"
- 保存并关闭文件
- 重新加载UFW来使用新的设置。
$ sudo ufw reload
- 在Docker端口上允许进入的连接。
$ sudo ufw allow 2375/tcp
配置一个DNS服务器让Docker使用
在桌面上运行Ubuntu系统或Ubuntu衍生系统,在/etc/resolv.conf
文件中,典型的使用127.0.0.1
作为默认的nameserver
。网络管理器也会设置dnsmasq
来使用真实的DNS服务器,并且在/etc/resolv.conf
中设置nameserver 127.0.0.1
。
当使用这些配置在桌面机器上开启容器,Docker用户将会看到这个警告:
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
该警告的出现是因为Docker容器不能使用本地的DNS域名服务器。Docker默认使用一个外部的域名服务器。
为了避免这个警告,你可以指定一个DNS服务器让Docker容器来使用。或者是,你可以在网络管理器中禁用dnsmasq
。不过,禁用dnsmasq
可能会导致DNS在一些网络中变慢。
下面的指令描述了如何配置运行在Ubuntu14.10或较低版本的上的Docker域。Ubuntu 15.04和更高版本使用systemd
作为启动和服务管理器。有关与systemd
的配置可以参考这篇文章,control and configure Docker with systemd。
为了指定一个DNS服务器让Docker使用:
- 作为一个用户身份以
sudo
方式登陆系统。 - 打开
/etc/default/docker
文件编辑。 - 添加一个设置。
DOCKER_OPTS="--dns 8.8.8.8"
使用本地DNS服务器,例如 192.168.1.1
替换8.8.8.8
。你也可以指定多个DNS服务器。将他们之间用空格分离。例如:
--dns 8.8.8.8 --dns 192.168.1.1
警告:如果你正在使用连接多个网络的电脑做这个事情,确定要选择一个公共DNS服务器。
- 保存并关闭文件
- 重启Docker域。
$ sudo restart docker
或者是,对之前的操作作为一个可选的选项,就是在网络管理器中禁用dnsmasq
。
- 打开
/etc/NetworkManager/NetworkManager.conf
文件。 - 注释掉
dns=dnsmasq
这一行。 - 保存并且关闭文件。
- 重启网络管理器和Docker.
$ sudo restart network-manager
$ sudo restart docker
配置Docker开机自启动
Ubuntu 15.04及以上系统使用systemd
作为它的启动和服务管理器,Ubuntu 14.10及其低版本使用upstart
。
对于15.04
及其以上版本来说,为了配置docker
域开机自启,运行:
$ sudo systemctl enable docker
对于14.10
及其较低版本,上述的安装方法自动配置upstart
开使docker域开机的时候自动启动。
更新Docker
安装最新版本的Docker使用apt-get
:
$ sudo apt-get upgrade docker-engine
卸载
卸载Docker包:
$ sudo apt-get purge docker-engine
卸载Docker包及其以来不再需要使用下面的命令:
$ sudo apt-get autoremove --purge docker-engine
上面的命令不会移除镜像,容器,卷或者是用户创建的配置文件。如果你想删除所有的镜像,容器和卷,运行下面的命令:
$ rm -rf /var/lib/docker
你必须手动删除用户创建的配置文件。