从 Docker Hub 下载镜像
使用“docker pull”命令将镜像或者存储库从 Docker Hub 注册表下载到本地系统。
以下示例下拉 centos:latest 图像。
# docker pull centos Using default tag: latest Trying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16 Status: Downloaded newer image for docker.io/centos:latest
使用“docker images”命令列出本地 Docker 存储库中存储的图像。
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos 7 e934aafc2206 2 weeks ago 199 MB docker.io/centos latest e934aafc2206 2 weeks ago 199 MB
存储库中的每个图像都通过 TAG 和 IMAGE ID 进行区分。
下面显示了 docker 配置文件的位置。
# cd /var/lib/docker/ # ll total 4 drwx------. 3 root root 77 Apr 21 07:57 containers drwx------. 3 root root 21 Apr 21 07:56 image drwxr-x---. 3 root root 18 Apr 21 07:56 network drwx------. 6 root root 4096 Apr 21 07:57 overlay2 drwx------. 4 root root 30 Apr 21 07:56 plugins drwx------. 2 root root 6 Apr 21 07:56 swarm drwx------. 2 root root 6 Apr 21 07:57 tmp drwx------. 2 root root 6 Apr 21 07:56 trust drwx------. 2 root root 24 Apr 21 07:56 volumes
在正在运行的容器中运行其他命令
使用 docker exec 命令在正在运行的容器中运行命令。
与 docker run 命令类似,包括 -t 和 -i 选项以运行交互式命令。
提供容器 ID 或者容器名称作为参数。
在以下示例中,docker exec 命令在“guest”容器中启动一个新的交互式 bash shell:
# docker exec -t -i geeklab /bin/bash [root@68b5b713c37b /]#
以下示例使用 docker exec 命令在“geeklab”容器上启动 sshd 服务。
“geeklab”容器运行的是 CentOS 6.4.
在此示例中,不需要 -t 和 -i 选项。
# docker exec guest service sshd start Generating SSH2 RSA host key: [ OK ] Generating SSH1 RSA host key: [ OK ] Generating SSH2 DSA host key: [ OK ] Starting sshd: [ OK ]
sshd 服务在容器上启动,控制权返回到发起主机系统。
安装和启动 Docker
安装和启动 docker 服务是一项简单的任务。
我们可以使用以下命令安装 docker 包:
# yum install docker
使用 systemctl 命令启用和启动 docker 服务。
# systemctl enable docker # systemctl start docker
默认情况下,Docker 使用 devicemapper 作为存储驱动程序。
使用 RedHat Linux 7,我们可以配置 Docker 引擎以使用 Btrfs。
这允许我们利用 Btrfs 的快照功能。
以下命令显示从 docker 包安装的所有文件:
# rpm -ql docker /etc/docker /etc/docker/certs.d /etc/docker/certs.d/redhat.com /etc/docker/certs.d/redhat.com/redhat-ca.crt /etc/docker/certs.d/redhat.io /etc/docker/certs.d/redhat.io/redhat-ca.crt ...
我们可以看到,除了 docker 二进制文件和配置文件之外,还为所有 docker 命令安装了文档和手册页。
/var/lib/docker 目录是空的,直到 docker 服务启动。
下面的一系列命令显示了启动docker前后目录的内容。
# ls /var/lib/docker # systemctl enable docker # systemctl start docker # ls /var/lib/docker containers graph linkgraph.db tmp volumes devicemapper init repositories-devicemapper trust
Docker Hub 注册表
Docker Hub Registry 将应用程序托管为 Docker 镜像,并提供允许我们创建和管理 Docker 环境的服务。
Docker Hub Registry 由 Docker, Inc. 拥有和维护,位于 https://registry.hub.docker.com/。
Docker Hub 提供了多个存储库,每个存储库可以包含多个图像。
除了托管 Docker 镜像,Docker Hub 还提供用户身份验证、自动化镜像构建和工作流工具以及与 GitHub 和 BitBucket 的集成等服务。
要使用这些 Docker 服务,我们需要创建一个 Docker Hub 帐户。
我们可以在 https://hub.docker.com/account/signup/ 创建一个帐户。
我们还可以使用以下命令从命令行创建帐户:
# docker login
如何在 Docker Hub 中创建公共/私有存储库并使用命令行远程连接它
我们无需帐户即可搜索 Docker 镜像并从 Docker Hub 拉取(下载)镜像。
要推送(上传)图像、对图像或者存储库发表注释并使用所有可用的 Docker Hub 服务,我们需要一个 Docker Hub 帐户。
列出容器和查看容器日志
使用 docker ps 命令列出有关 Docker 容器的信息。
默认情况下,只列出正在运行的容器。
在 docker ps 命令中包含 –a 选项以显示所有容器。
输出包括在创建容器时自动生成的唯一容器 ID 和唯一容器名称。
docker ps 命令的输出还包括用于创建容器的镜像、在容器中运行的命令以及状态信息。
状态信息包括容器的创建时间以及容器运行的时间。
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ee24718262c ubuntu "/bin/bash" 3 minutes ago Exited (127) 2 seconds ago modest_turing b3e1316c4653 centos:7 "/bin/bash" 6 minutes ago Exited (0) 4 minutes ago gracious_pare 7b772ea59c92 fedora "/bin/echo Hello" 18 minutes ago Exited (0) 18 minutes ago voirlant_haibt 263e715ae13c centos "/bin/echo Hello" 19 minutes ago Exited (0) 19 minutes ago condescending_aryabhata a79ce1655f2c centos:7 "/bin/bash" 4 hours ago Created test
docker logs 命令查看容器内部并返回其标准输出。
我们可以使用容器 ID 或者容器名称作为命令的参数。
# docker logs b3e1316c4653 [root@b3e1316c4653 /]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@b3e1316c4653 /]# exit exit
在上面的示例中,docker logs 命令显示在容器中执行了“cat /etc/redhat-release”命令。
docker ps 和 docker logs 命令需要从容器外部执行,即从另一个终端窗口执行。
创建新容器
docker run 命令在新容器中运行一个进程。
我们还可以使用 docker create 命令创建一个可以在以后启动的容器。
docker create 的语法和可用选项类似于 docker run 语法。
下面的示例从 centos:7 镜像创建一个名为“geeklab”的新容器,并在启动时运行 bash shell 命令。
如果省略 -name 选项,则会自动生成容器名称。
# docker create -t -i --name geeklab centos:7 /bin/bash 667fd40faeb69113d035f08e5a910275a8463aa2a6a0796833f590e878732e17
该命令的输出是一个非常长的唯一容器 ID。
容器不会像 docker ps 命令显示的那样立即启动,默认情况下它只显示正在运行的容器:
# docker ps
我们需要运行“docker ps -a”来显示所有容器。
该示例将输出通过管道传递给 grep 并搜索容器 ID 的一部分:
# docker ps -a | grep 667fd 667fd40faeb6 centos:7 "/bin/bash" About a minute ago Created geeklab
启动、停止和移除容器
使用“docker start”命令启动一个现有的容器。
使用 –a 和 –i 选项将当前 shell 的 STDIN(标准输入)、STDOUT(标准输出)和 STDERR(标准错误)添加到容器,并使所有信号都转发到容器。
# docker start -a -i geeklab [root@667fd40faeb6 /]#
从容器内部,使用 exit 命令或者 CTRL-d 来停止容器。
从容器外部,即从另一个终端窗口,使用 docker stop 命令停止容器。
# docker stop geeklab
使用“docker rm”命令删除一个容器。
我们可以在单个命令中删除多个容器。
使用 –f 选项删除正在运行的容器。
# docker rm geeklab geeklab
所有这三个 docker 命令都接受容器 ID 或者容器名称作为参数。
docker rm 命令删除一个容器。
使用 docker rmi 命令删除镜像:
# docker rmi [IMAGE]
在 Docker Hub 注册表中搜索镜像
使用 docker search 命令在 Docker Hub 中搜索图像。
下面显示的是“docker search”命令的输出:
# docker search centos INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/centos The official build of CentOS. 4207 [OK] docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 108 [OK] docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x8... 94 [OK] docker.io docker.io/consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 52 [OK] docker.io docker.io/imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 40 [OK] ...
此命令在 Docker Hub 中搜索“centos”镜像。
输出包括存储库/图像的名称、描述、授予的星数、图像是否是官方的以及是否是自动化的。
name 列采用以下形式,可以包含包含存储库以提供唯一标识:
[repository_name]/[image_name]
星星衡量图像的受欢迎程度。
任何拥有 Docker Hub 帐户的人都可以在喜欢的情况下为图像“加星标”。
以下示例搜索至少有 3 颗星的“centos”图像:
# docker search -s 3 centos Flag --stars has been deprecated, use --filter=stars=3 instead INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/centos The official build of CentOS. 4207 [OK] docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 108 [OK] docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x8... 94 [OK] ...
“官方”存储库official 由 Docker 的供应商或者贡献者认证。
“自动化”镜像 automated 由 Docker Hub 的自动化构建过程构建。
显示容器或者图像的所有信息
使用 docker inspect 命令查看容器或者镜像的所有可用信息。
以下示例显示了显示的一些信息。
使用 –f {{.section.subsection}} 选项显示特定信息。
以下示例仅显示网络设置:
# docker inspect -f {{.NetworkSettings}} modest_turing {{ 98e04ea6d68753022ae2212b06b1514323927a1ed117448bc70ea3fa9a2f4a06 false 0 map[] /var/run/docker/netns/98e04ea6d687 [] []} { 0 0 } map[bridge:0xc4200c0300]}
以下示例显示 IP 地址:
# docker inspect -f {{.NetworkSettings.IPAddress}} modest_turing 172.17.0.10
以下示例显示进程 ID:
# docker inspect -f {{.State.Pid}} modest_turing 7181
以下示例显示在容器中运行的命令:
# docker inspect -f {{.Config.Cmd}} modest_turing [/bin/bash]
如果要查看容器的所有选项/属性,请不要在“docker inspect”中使用任何选项:
# docker inspect modest_turing [ { "Id": "9ee24718262c9f7ed3320019163a8b1b2bb1bccc83eb362a5512a74eaa4ad57f", "Created": "2018-04-21T12:22:21.983441857Z", "Path": "/bin/bash", "Args": [], "State": { ....
这将是一个很长的输出,显示容器的所有属性。
Docker
Docker 是 Linux 容器的开放平台管理工具。
它为开发人员和系统管理员提供了一种方法来构建应用程序并将其打包到轻量级容器中。
Docker 由以下组件组成:
- Docker Engine – 一个便携、轻量级的运行时和打包工具
- Docker Hub – 一种用于共享应用程序和自动化工作流的云服务
Docker 用于创建基于图像的应用程序容器。
基于图像的容器将具有单独运行时堆栈的应用程序打包到单个容器中。
这使得容器独立于主机操作系统和内核版本。
因此,我们可以在笔记本电脑、数据中心虚拟机和任何云上运行相同的应用程序,无需更改。
我们可以将此容器转移到另一台运行 Docker 并运行应用程序的机器上,而不会出现任何兼容性问题。
下面列出了在 Docker 容器中运行应用程序的其他优势:
- Docker 镜像仅包含运行应用程序所需的内容,因此它们比需要整个操作系统的虚拟机小。
- Docker 容器比包含整个虚拟机开销的应用程序运行得更快。
- Docker 容器包括自己的网络接口、文件系统和内存,这使得容器中运行的应用程序能够与主机上的其他进程隔离并保护其安全。
Docker工具
docker 命令行界面有 30 多个命令。
有关命令列表,请参阅 docker 手册页。
docker info 命令显示有关 Docker 安装的系统范围的信息。
有关更多信息,请参阅 docker-info 手册页。
请注意,默认存储驱动程序是 devicemapper,数据和元数据存储在循环设备中:/dev/loop0 和 /dev/loop1.
# docker info Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 1.13.1 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: false Native Overlay Diff: true Logging Driver: journald ...
如果将 root 以外的用户添加到 docker 组并重新配置 docker 服务,则它们可以运行 docker 命令。
运行交互式 Docker 容器
将 –t 和 –i 选项与 docker run 命令结合使用来运行交互式容器。
这些选项描述如下:
- -t :分配一个伪 tty 并添加到容器的 STDIN(标准输入)
- -i : 保持容器的 STDIN 打开
下面显示了两个使用带有 –t 和 –i 选项的 docker run 命令的示例。
在这两个示例中,CentOS Linux 7.4 都在本地系统上运行:
# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
第一个示例使用“centos:7”图像。
Docker 使用该镜像创建新的 CentOS 环境,然后运行 bash shell 命令。
此镜像的操作系统版本为 CentOS 7.
# docker run -t -i centos:7 /bin/bash [root@b3e1316c4653 /]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
第二个示例使用 ubuntu 镜像。
由于没有指定特定的镜像,Docker 使用“最新”的 Ubuntu 镜像创建一个新的 Ubuntu 环境,然后运行 bash shell 命令。
此镜像的操作系统版本是 Ubuntu 16.04.4.
此外,由于 ubuntu 镜像在本地不可用,docker 将首先从存储库下载它,然后运行它。
# docker run -t -i ubuntu /bin/bash Unable to find image 'ubuntu:latest' locally Trying to pull repository docker.io/library/ubuntu ... latest: Pulling from docker.io/library/ubuntu d3938036b19c: Pull complete a9b30c108bda: Pull complete 67de21feec18: Pull complete 817da545be2b: Pull complete d967c497ce23: Pull complete Digest: sha256:9ee3b83bcaa383e5e3b657f042f4034c92cdd50c03f73166c145c9ceaea9ba7c Status: Downloaded newer image for docker.io/ubuntu:latest
root@9ee24718262c:/# cat /etc/os-release NAME="Ubuntu" VERSION="16.04.4 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.4 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" VERSION_CODENAME=xenial UBUNTU_CODENAME=xenial
我们可以使用 exit 命令或者按 CTRL + D 退出交互式容器。
在容器内运行应用程序
使用 docker run 命令在容器内运行应用程序。
此命令使用自己的文件系统、自己的网络和自己的隔离进程树启动进程。
以下语法不包括该命令的所有可用选项:
# docker run [OPTION...] IMAGE [COMMMAND] {ARG...]
启动进程的 IMAGE 可以定义与要在容器中运行的进程、网络等相关的默认值,但 docker run 选项会覆盖 IMAGE 中的设置。
如果 IMAGE 在本地不可用,则 docker run 会在启动 IMAGE 中的容器之前以与 docker pull 命令相同的方式拉取图像。
下面显示了使用 docker run 的两个示例。
第一个示例使用本地计算机上已存在的“centos”镜像。
Docker 使用该镜像创建新的 CentOS 环境,然后运行 echo 命令以显示“Hello”。
# docker run centos /bin/echo "Hello" Hello
第二个示例使用了本地系统上不存在的 fedora 镜像。
Docker 从 Docker Hub 拉取镜像,然后使用该镜像创建新的 Fedora 环境并运行 echo 命令。
# docker run fedora /bin/echo "Hello" Unable to find image 'fedora:latest' locally Trying to pull repository docker.io/library/fedora ... latest: Pulling from docker.io/library/fedora 2176639d844b: Pull complete Digest: sha256:ec588fc80b05e19d3006bf2e8aa325f0a2e2ff1f609b7afb39176ca8e3e13467 Status: Downloaded newer image for docker.io/fedora:latest Hello
在这两个示例中,Docker 容器在“Hello”显示在屏幕上后停止。
使用 docker ps 命令列出容器,没有容器显示:
# docker ps
那是因为“docker ps”只显示当前正在运行的容器。
要显示所有容器,包括停止的容器,请使用“docker ps -a”命令。
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b772ea59c92 fedora "/bin/echo Hello" 25 seconds ago Exited (0) 23 seconds ago voirlant_haibt 263e715ae13c centos "/bin/echo Hello" About a minute ago Exited (0) About a minute ago condescending_aryabhata a79ce1655f2c centos:7 "/bin/bash" 4 hours ago Created test
docker images 命令显示“fedora”存储库中的“最新”镜像是在使用 docker run 命令时从 Docker Hub 下载的:
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos 7 e934aafc2206 2 weeks ago 199 MB docker.io/centos latest e934aafc2206 2 weeks ago 199 MB docker.io/fedora latest 9110ae7f579f 6 weeks ago 235 MB
Docker 镜像
Docker 容器是从 Docker 镜像构建的。
我们可以创建 Docker 容器以从这些 Docker 镜像运行应用程序。
以下示例从名为 centos:7” 的 Docker 镜像创建名为“test”的 Docker 容器并运行 /bin/bash。
# docker create --name test centos:7 /bin/bash Unable to find image 'centos:7' locally Trying to pull repository docker.io/library/centos ... 7: Pulling from docker.io/library/centos 469cfcc7a4b3: Pull complete Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16 Status: Downloaded newer image for docker.io/centos:7 a79ce1655f2ca17c7ac8cc15f307ba0bb438fbebd4595568df3433dd5ff79b73
图像是只读模板,可以包含安装了服务和添加应用程序的整个操作系统。
Docker 提供了构建镜像或者更新现有镜像的能力。
我们可以从命令行创建 Docker 镜像,也可以将构建镜像的指令存储在 Dockerfile 中。
当我们启动 Docker 镜像的构建时,Docker 会读取此 Dockerfile 并执行指令。
每个镜像都从一个基础镜像(例如 centos)开始。
每个 Docker 镜像都包含一系列基于这些基础镜像构建的层。
Dockerfile 中的每条指令都会在镜像中创建一个新层。
每次对 Docker 镜像进行更改时,只会更新或者添加该层。
Docker 使用 unionfs 将这些层组合成单个镜像。
unionfs 文件系统服务允许将不同文件系统的文件和目录叠加到单个文件系统中。
创建 Docker 镜像后,我们可以通过将它们存储在 Docker 注册表中来共享这些镜像。
这些注册表可以是私有的,也可以是公共的。
Docker Hub 是公共 Docker 注册表,充当软件即服务平台,用于共享和管理 Docker 容器。
如何在 CentOS/RHEL/Fedora 上安装 docker
如何在 Mac 上安装 Docker