简介
Docker是一个应用程序,它使在容器中运行应用程序进程变得简单和容易,这就像虚拟机一样,只是更容易携带,更容易获得资源,并且更依赖于主机操作系统。
在本教程中,你将学习如何在现有的Rocky Linux 9的安装上安装和使用它。
前提条件
- 一台Rocky Linux 9服务器,并有一个具有
sudo
权限的非root用户,使用Rocky Linux 9的初始设置指南解释如何设置。
本教程中的所有命令都应该以非root用户的身份运行。如果命令需要root权限,前面会有sudo
。 Rocky Linux 9的初始设置指南解释了如何添加用户并给予他们sudo权限。
步骤1 - 安装Docker
Rocky Linux 9官方软件库中提供的Docker安装包可能不是最新版本。要想获得最新的、最好的版本,请从官方的Docker软件库中安装Docker。本节将告诉你如何做到这一点。
但首先,让我们更新一下软件包数据库。
sudo dnf check-update
接下来,添加官方Docker仓库。
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
虽然Docker没有专门的Rocky Linux仓库,但Rocky Linux是基于CentOS的,可以使用相同的仓库。添加好仓库后,安装Docker,它由三个软件包组成。
sudo dnf install docker-ce docker-ce-cli containerd.io
安装完成后,启动Docker守护程序。
sudo systemctl start docker
验证它是否正在运行。
sudo systemctl status docker
输出结果应该与下面类似,显示该服务已被激活并运行。
Output
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
Docs: https://docs.docker.com
Main PID: 749 (docker)
最后,确保它在每次服务器重启时启动。
sudo systemctl enable docker
现在,安装Docker不仅给你提供了Docker服务(守护进程),还提供了docker
命令行工具,或Docker客户端。我们将在本教程的后面探讨如何使用docker
命令。
第2步 - 不使用Sudo执行Docker命令(可选)
默认情况下,运行docker
命令需要root权限--也就是说,你必须在命令前加上sudo
。它也可以由docker组中的用户运行,该组在安装Docker时自动创建。如果你试图运行docker
,但没有在前缀中加上sudo
,或者没有在docker组中,你会得到这样的输出。
Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
如果你想避免每次运行docker
命令时都输入sudo
,请将你的用户名添加到docker组。
sudo usermod -aG docker $(whoami)
你将需要退出Droplet,然后以同一用户身份重新登录,以启用这一变化。
如果你需要将一个用户添加到你没有登录的docker
组中,请使用明确声明该用户名。
sudo usermod -aG docker username
本文的其余部分假设你是以docker用户组的用户身份运行docker
命令。如果你选择不这样做,请在命令的前面加上sudo
。
第3步 - 使用Docker命令
随着Docker的安装和运行,现在是熟悉命令行工具的时候了。使用docker
,包括将一连串的选项和子命令传递给它,后面是参数。语法采用这种形式。
docker [option] [command] [arguments]
要查看所有可用的子命令,请输入。
docker
从Docker 1.11.1开始,可用的子命令的完整列表包括。
Output
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on a container or image
kill Kill a running container
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
network Manage Docker networks
pause Pause all processes within a container
port List port mappings or a specific mapping for the CONTAINER
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart a container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop a running container
tag Tag an image into a repository
top Display the running processes of a container
unpause Unpause all processes within a container
update Update configuration of one or more containers
version Show the Docker version information
volume Manage Docker volumes
wait Block until a container stops, then print its exit code
要查看某个特定命令的可用开关,请键入。
docker docker-subcommand --help
要查看整个系统的信息,请使用:
docker info
第4步 - 使用Docker镜像
Docker容器是通过Docker镜像运行的。默认情况下,它从Docker Hub拉取这些镜像,这是一个由Docker管理的Docker注册表,Docker项目背后的公司。任何人都可以在Docker Hub上构建和托管他们的Docker镜像,所以你需要运行Docker容器的大多数应用程序和Linux发行版的镜像都托管在Docker Hub上。
要检查你是否可以从Docker Hub访问和下载镜像,请输入。
docker run hello-world
输出结果应该包括以下内容,应该表明Docker在正常工作。
Output
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
你可以通过使用带有search
子命令的docker
命令来搜索Docker Hub上可用的镜像。例如,要搜索Rocky Linux镜像,请输入。
docker search rockylinux
该脚本将抓取Docker Hub,并返回名称与搜索字符串相匹配的所有镜像的列表。在这种情况下,输出将类似于这样。
Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 2224 [OK]
jdeathe/centos-ssh CentOS-6 6.7 x86_64 / CentOS-7 7.2.1511 x8... 22 [OK]
jdeathe/centos-ssh-apache-php CentOS-6 6.7 x86_64 / Apache / PHP / PHP M... 17 [OK]
million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 11 [OK]
nimmis/java-centos This is docker images of CentOS 7 with dif... 10 [OK]
torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK]
nickistre/centos-lamp LAMP on centos setup 3 [OK]
...
在OFFICIAL一栏中,OK表示一个由项目背后的公司建立和支持的镜像。一旦你确定了你想使用的图像,你可以使用pull
子命令将其下载到你的计算机上,像这样。
docker pull rockylinux
在下载完镜像后,你可以用run
子命令使用下载的镜像运行一个容器。如果在用run
子命令执行docker
时还没有下载镜像,Docker客户端将首先下载镜像,然后用它运行一个容器。
docker run rockylinux
要查看已经下载到你的计算机上的镜像,请输入。
docker images
输出结果应该类似于下面的内容。
[secondary_lable Output]
REPOSITORY TAG IMAGE ID CREATED SIZE
rockylinux latest 778a53015523 5 weeks ago 196.7 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
正如你在本教程后面所看到的,你用来运行容器的镜像可以被修改并用来生成新的镜像,然后可以将其上载(推送是技术术语)到Docker Hub或其他Docker注册处。
第5步 - 运行一个Docker容器
你在上一步骤中运行的hello-world
容器是一个运行并退出的容器的例子,在发出测试信息后。然而,容器可以比这更有用,它们可以是互动的。毕竟,它们类似于虚拟机,只是对资源更加友好。
作为一个例子,让我们使用Rocky Linux的最新镜像运行一个容器。-i和**-t**开关的组合给了你进入容器的交互式外壳权限。
docker run -it rockylinux
你的命令提示符应该改变,以反映你现在正在容器内工作的事实,应该采取这种形式。
Output
[root@59839a1b7de2 /]#
重要提示:注意命令提示中的容器ID。在上面的例子中,它是59839a1b7de2
。
现在你可以在容器内运行任何命令。例如,让我们在运行的容器中安装MariaDB服务器。不需要在任何命令前加上sudo
,因为你是以root权限在容器内操作。
dnf install mariadb-server
第6步 - 将容器中的修改提交给Docker镜像
当你启动Docker镜像时,你可以创建、修改和删除文件,就像你在虚拟机上一样。你所做的改变将只适用于该容器。你可以启动和停止它,但一旦你用docker rm
命令销毁它,这些改变就会永远消失。
本节将向你展示如何将一个容器的状态保存为一个新的Docker镜像。
在Rocky Linux容器内安装了MariaDB服务器后,你现在有一个通过镜像运行的容器,但这个容器与你用来创建它的镜像不同。
要想把容器的状态保存为一个新的镜像,首先要从容器中退出。
exit
然后用下面的命令提交变化到一个新的Docker镜像实例。开关**-m是用来写提交信息的,可以帮助你和其他人知道你做了什么修改,而-a**是用来指定作者的。容器ID是你在本教程早期启动交互式docker会话时指出的那个。除非你在Docker Hub上创建了额外的资源库,否则资源库通常是你的Docker Hub用户名。
docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name
例如。
docker commit -m "added mariadb-server" -a "Sunday Ogwu-Chinuwa" 59839a1b7de2 sammy/rockylinux-mariadb
注意:当你提交镜像时,新的镜像会保存在本地,也就是在你的电脑上。在本教程的后面,你将学习如何将镜像推送到Docker Hub这样的Docker注册中心,以便你和其他人可以评估和使用。
该操作完成后,列出你电脑上的Docker镜像应该会显示新的镜像,以及它所衍生的旧镜像。
docker images
输出应该是这样的。
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/rockylinux-mariadb latest 23390430ec73 6 seconds ago 424.6 MB
rockylinux latest 778a53015523 5 weeks ago 196.7 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
在上面的例子中,rockylinux-mariadb是新的镜像,它是由Docker Hub现有的Rocky Linux镜像衍生出来的。大小差异反映了所做的改变。而在这个例子中,变化是安装了MariaDB服务器。因此,下次你需要使用预装了MariaDB服务器的Rocky Linux运行一个容器时,你可以直接使用新的镜像。镜像也可以通过所谓的Dockerfile来构建。但这是一个非常复杂的过程,远远超出了本文的范围。我们将在未来的文章中探讨这个问题。
第7步 - 列出Docker容器
在使用Docker一段时间后,你的电脑上会有许多活动(运行)和非活动的容器。要查看活动的容器,请使用:
docker ps
你会看到类似于下面的输出。
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7c79cc556dd rockylinux "/bin/bash" 3 hours ago Up 3 hours silly_spence
要查看所有的容器--活动的和非活动的,请把-a
开关传给它。
docker ps -a
要查看你最新创建的容器,请将-l
开关传给它。
docker ps -l
停止一个正在运行或活动的容器,就像键入一样简单。
docker stop container-id
该 container-id
可以在docker ps
命令的输出中找到。
第8步 - 将Docker镜像推送到Docker仓库
在从现有镜像中创建一个新的镜像后,下一个合乎逻辑的步骤是与你的几个朋友、Docker Hub上的整个世界或你能访问的其他Docker注册中心分享它。要推送镜像到Docker Hub或其他Docker注册中心,你必须有一个账户。
本节将向你展示如何推送Docker镜像到Docker Hub。
要在Docker Hub上创建一个账户,请在Docker Hub注册。之后,要推送你的镜像,首先登录Docker Hub。你会被提示进行认证。
docker login -u docker-registry-username
如果你指定了正确的密码,认证应该会成功。然后你可以使用推送你自己的镜像。
docker push docker-registry-username/docker-image-name
这将需要一些时间来完成,完成后,输出结果将是这样的。
Output
The push refers to a repository [docker.io/sammy/rockylinux-mariadb]
670194edfaf5: Pushed
5f70bf18a086: Mounted from library/rockylinux
6a6c96337be1: Mounted from library/rockylinux
...
推送图像到注册表后,它应该被列在你的账户仪表板上,就像下面的图片中所示。
如果推送尝试的结果是这样的错误,那么你可能没有登录。
Output
The push refers to a repository [docker.io/sammy/rockylinux-mariadb]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required
登录,然后重复推送尝试。
结论
Docker的内容比本文给出的要多得多,但这应该足以让你在Rocky Linux 9上开始使用它。和大多数开源项目一样,Docker是由一个快速发展的代码库构建的。