本文介绍了如何开始使用Docker,并展示了一些基本命令,可带您进入容器的潮流。
在本教程中,您将学习:
- 什么是Docker及其使用方式。
- 如何在Linux上安装Docker
- 如何运行Docker容器
使用的软件要求和约定
类别 | 使用的要求,约定或软件版本 |
---|---|
系统 | 任何Linux发行版 |
软件 | 码头工人 |
其他 | 以root身份或通过Linux特权访问Linux系统sudo 命令。 |
约定 | #-要求linux命令可以直接以root用户身份或通过使用root特权以root特权执行sudo 命令$-要求linux命令以普通非特权用户身份执行 |
基本Docker概念
传统的虚拟化平台(例如Virtualbox和VMWare)会抽象整个计算机,以隔离主办和来宾操作系统,并且要求在操作系统中安装整个操作系统来宾虚拟机(VM)。 Docker的虚拟化采用不同的方法-它仅对操作系统进行抽象,这意味着主机和来宾共享同一操作系统核心。
优点是来宾(称为货柜)不必打包整个操作系统,这使它们变得轻巧-体积小且启动速度非常快。此外,通过直接与主机操作系统接口,Docker容器不会招致传统虚拟化的性能损失,而传统虚拟化需要通过抽象虚拟硬件的驱动程序在来宾操作系统和主机操作系统之间转换系统调用。
缺点是,例如,不可能在Linux主机上托管Windows来宾,并且所有来宾都在主机上共享资源(CPU,RAM和磁盘),这意味着行为不当的容器可能会使整个服务器宕机。可以肯定的是,Docker并不打算取代传统的虚拟化技术,而传统的虚拟化技术仍然有很多有效的方案。它只是提供了另一种获得应用程序隔离的方式,同时减少了对库的依赖性,同时又不损失性能。
Docker允许您启动货柜,这些实例正在运行图片。映像包含具有执行应用程序所需的所有库依赖关系的磁盘,而容器包含执行上下文。可以同时执行同一图像的多个容器,每个容器彼此分开。
有人建议Docker容器仅执行一个应用程序,这经常被误解为“仅运行一个进程”。在一个容器中运行多个进程没有问题,只要它们属于同一应用程序即可。但是,复杂的应用程序可能需要执行多个容器,例如,一个用于Web服务器(Apache,Nginx),一个用于应用程序(php-fpm)和一个用于数据库(MySQL,PostgreSQL,MongoDB)。这些容器可以在相同或不同的主机中执行。同一主机中的容器通过Docker管理的虚拟网络进行通信。
(adsbygoogle = window.adsbygoogle || [])。push({});
Docker映像从名为的存储库中检索注册表并在本地缓存。如果未指定注册表,则docker将尝试在默认存储库(称为)中查找映像Docker中心。 Docker Hub包含大量可供公司和个人使用的映像,您也可以发布映像。此外,还有Docker商店,公司可以在那里专业地提供其软件的精选图像。建议您花一些时间浏览和学习这些存储库的工作方式。
够了,让我们安装Docker并学习一些基本命令。
在Linux上安装Docker
的Ubuntu
在Ubuntu Bionic Beaver 18.04中,安装Docker很简单。
# apt install docker.io
德比安
如果您正在运行Debian测试或不稳定,则上面的命令也将起作用。对于Debian稳定版(Stretch),请访问我们的Debian 9 Stretch Linux上的Docker引擎安装指南。
CentOS的
在CentOS 1804中,它是一个yum
命令。
# yum install docker
软呢帽
在Fedora 28中,它也可以随一台一起安装dnf
命令。
# dnf install docker
安装Docker之后
安装完成后,您可以检查Docker服务是否正在运行。
# service docker status
如果不是,请启动它。
# service docker start
服务运行后,您可以检查是否有任何正在运行的容器。
# docker ps
如果您不想输入sudo
要与Docker服务进行交互,只需将您的用户添加到Docker组即可。您需要重新登录才能使更改生效。
# usermod -a -G docker username
登录后,检查您是否在docker组中
$ groups
roger adm cdrom sudo dip plugdev lpadmin sambashare docker
(adsbygoogle = window.adsbygoogle || [])。push({});
现在您不需要sudo
与docker引擎进行交互。
运行Docker容器
让我们执行一个hello-world
容器。
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
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.
(amd64)
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 ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
该命令非常简单,但是发生了很多事情。首先,泊坞窗引擎意识到请求的图像不在本地缓存中(2号线)。然后将图像从docker注册表中提取并存储在本地(3号线)。最后,创建并执行一个容器(8号线)并终止。如果再试一次,您会注意到执行速度要快得多,因为图像和容器都被缓存了。现在检查本地存储的图像。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 4ab4c602aa5e 2 weeks ago 1.84kB
请注意hello-world
图片很小,只有1.84 KB。这说明使用了许多主机操作系统,并且映像仅包含应用程序依赖项。
您可以删除该图像。
$ docker images rm hello-world
$ docker images
现在,让我们做一些更雄心勃勃的事情:拉取Apache网络服务器映像并运行一个容器。
$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
f189db1b88b3: Pull complete
ba2d31d4e2e7: Pull complete
23a65f5e3746: Pull complete
5e8eccbd4bc6: Pull complete
4c145eec18d8: Pull complete
v1'1c74ffd6a8a2: Pull complete
1421f0320e1b: Pull complete
Digest: sha256:8631904c6e92918b6c7dd82b72512714e7fbc3f1a1ace2de17cb2746c401b8fb
Status: Downloaded newer image for httpd:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 4ab4c602aa5e 2 weeks ago 1.84kB
httpd latest d595a4011ae3 6 weeks ago 178MB
然后,您从该图像运行一个容器。
$ docker run -d -p 8000:80 httpd
dd703b1590a91bdc10488b48798e42ddecd1c6519324a613f4b5563c21874a98
roger@slash:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd703b1590a9 httpd "httpd-foreground" 10 seconds ago Up 3 seconds 0.0.0.0:8000->80/tcp cranky_torvalds
以最简单的形式,命令是docker run httpd
,但是容器将在Apache运行后立即停止,并且不会暴露任何端口。的-d
(分离)选项是必需的,以便容器保持在后台运行。
的-p 8000:80
选项是将容器的端口80映射到主机中的端口8000,从而使网络服务器在网络中可用。默认情况下,容器端口不暴露给主机。现在,您可以将网络浏览器指向http://localhost:8000
并查看Apache测试页面。
(adsbygoogle = window.adsbygoogle || [])。push({});
好的,但是如何更改网页?我们需要将主机上的文件夹链接到容器中/usr/local/apache2/htdocs/
目录(稍后将看到,Apache映像是由Debian Jessy构建的,而不管主机的Linux风格如何)。停止容器,然后再次运行。
$ docker ps
$ docker stop cranky_torvalds
$ echo "<html><body>My Webpage</body></html>">index.html
$ docker run -d -p 8000:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd
我们创建了一个index.html
主机当前目录中的文件,并将该目录映射到htdocs
容器的目录-v
开关。现在刷新网络浏览器。
现在开始:实验编辑index.html
在主机中添加文件并刷新Web浏览器,而无需更改容器的状态。是的,每当文件被编辑或将新文件添加到当前目录时,由于-v
映射。
创建另一个文件并在浏览器中访问它。
$ echo "Second page" >index2.html
(adsbygoogle = window.adsbygoogle || [])。push({});
完成后,停止容器执行。
$ docker stop angry_poincare
请注意,现在您已经可以随时执行一个Web服务器,并且您没有触摸操作系统中的任何配置文件。全部封装在由docker缓存的Apache映像中。此外,您可以下载映像并在任何其他计算机上启动容器。
结论
本文介绍了Docker的主要概念和一些基本命令。我希望您了解其好处,并看到一旦理解了这些概念,使用Docker并不复杂。以后的文章将介绍其他功能和用例。