Docker教程4快速入门

发布时间 2023-09-22 07:02:34作者: 磁石空杯

4 快速入门

本章的目的是在后面的章节深入探讨之前,快速描绘Docker的全貌。

我们将把本章分成两部分:

  • 运维视角
  • 开发视角

在"运维视角"部分,我们将下载镜像,启动新容器,登录新容器,在其中运行命令,然后将其销毁。

在开发视角部分,我们将更多地关注应用程序。我们将从GitHub克隆一些应用程序代码,检查Dockerfile,将应用程序容器化,然后将其作为容器运行。

4.1 运维视角

安装Docker时,你会得到两个主要组件:

  • Docker客户端
  • Docker 引擎(有时称为 "Docker 守护进程)

引擎实现了运行时、应用程序接口和运行容器所需的一切。

在默认的Linux安装中,客户端通过 /var/run/docker.sock的本地IPC/Unix套接字与守护进程对话。在Windows系统中,则通过npipe:////./pipe/docker_engine 上的命名管道进行。安装完成后,你可以使用docker version命令来测试客户端和守护进程(服务器)是否在运行,并能相互通信。

# docker version
Client: Docker Engine - Community
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:31:44 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.6
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.7
  Git commit:       1a79695
  Built:            Mon Sep  4 12:31:44 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.24
  GitCommit:        61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
 runc:
  Version:          1.1.9
  GitCommit:        v1.1.9-0-gccaecfc
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

如果收到客户端和服务器的响应,就可以开始了。

4.1.1 image(镜像或映像)

我们可以把Docker镜像看作包含操作系统文件系统、应用程序和所有应用程序依赖项的对象。它就像一个虚拟机模板,虚拟机模板本质上是停止运行的虚拟机。在Docker世界中,映像实际上就是停止运行的容器。如果你是开发人员,你可以把镜像看作类。

"docker images"命令可以查看本机镜像

$docker images
REPOSITORY                                                                TAG       IMAGE ID       CREATED       SIZE
kalilinux/kali-rolling                                                    latest    71579488294a   9 days ago    118MB
swr.cn-north-4.myhuaweicloud.com/openeuler-embedded/openeuler-container   latest    336616cabb99   3 weeks ago   4.06GB
ubuntu                                                                    latest    c6b84b685f35   4 weeks ago   77.8MB
centos                                                                    latest    5d0da3dc9764   2 years ago   231MB

在Docker主机上获取镜像称为"pull"。拉取ubuntu:latest映像。

$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
dfd64a3b4296: Download complete
6f8fe7bff0be: Download complete
3f5ef9003cef: Download complete
79d0ea7dc1a8: Download complete
docker.io/library/ubuntu:latest

我们将在后面的章节中详细介绍映像的存储位置和内部内容。现在,我们只需知道映像包含了操作系统(OS),以及运行任何应用程序所需的所有代码和依赖项就足够了。我们提取的Ubuntu镜像包含精简版的Ubuntu Linux文件系统和一些常用的Ubuntu实用程序。

如果拉取的是应用程序容器,如nginx:late,你将得到包含最小化操作系统和运行应用程序代码(NGINX)的镜像。

每个镜像都有自己唯一的ID。在引用图片时,可以使用镜像或名称。如果你使用的是镜像ID,通常键入ID的前几个字符就足够了,只要它是唯一的,Docker就会知道你指的是哪个镜像。

4.1.2 容器

现在,我们已经有了本地的镜像,可以使用docker run命令从中启动容器了。

$ docker run -it ubuntu:latest /bin/bash
root@6dc20d508db0:/#

shell提示已经改变了。这是因为-it标志将你的shell切换到了容器的终端--你的shell现在在新容器的内部!

docker run命令告诉Docker启动一个新容器。-it标志告诉Docker使容器具有交互性,并将当前的shell附加到容器的终端。容器基于 ubuntu:latestimage运行。最后,它告诉Docker我们想在容器内运行哪个进程: bash shell。

在容器内运行ps命令,列出所有正在运行的进程:

root@6dc20d508db0:/# ps -elf
F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root           1       0  0  80   0 -  1156 do_wai 09:46 pts/0    00:00:00 /bin/bash
4 R root           9       1  0  80   0 -  1765 -      09:51 pts/0    00:00:00 ps -elf

只有两个进程:

  • PID 1: 用docker run命令告诉容器运行的/bin/bash进程。
  • PID 9: 运行的 ps -elf 命令/进程,用来列出正在运行的进程。

实际容器内唯一长期运行的进程是/bin/bash进程。

按Ctrl-PQ退出容器,但不终止它。这样你的shell就会回到Docker主机的终端。使用"docker ps"可以查看运行的容器。

$ docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED  STATUS    NAMES
6dc20d508db0   ubuntu:latest  "/bin/bash"   7 mins   Up 7 min  vigilant_borg

4.1.3 附加到运行中的容器

你可以使用 docker exec 命令将 shell 附加到正在运行的容器终端。由于前面步骤中的容器仍在运行,让我们建立一个新的连接。

本示例引用了一个名为 "lig vigilant_borg "的容器。你的容器名称会有所不同,因此请记住用你的 Docker 主机上运行的容器名称或 ID 替换 "lig vigilant_borg"。

$ docker exec -it bold_swartz bash
root@6dc20d508db0:/#

docker exec 命令的格式是:docker exec <command/app> 。我们使用-it标志将我们的shell附加到容器的shell上。我们通过名称引用了容器,并告诉它运行bash shell。我们也可以用容器的十六进制ID引用它。

$ docker stop bold_swartz
bold_swartz

容器可能需要几秒钟才能优雅地停止。

$ docker rm bold_swartz
docker rm bold_swartz

运行带有-a标志的docker ps命令,验证容器是否已被成功删除。添加-a会列出所有容器,即使是处于停止状态的容器。

$ docker ps -a
CONTAINER ID   IMAGE                                                                            COMMAND       CREATED      STATUS                      PORTS     NAMES

参考资料

4.2 开发者视角

容器的核心是应用程序。我们将从Git仓库克隆应用程序,检查其Dockerfile,将其容器化,并将其作为容器运行。

$ git clone https://github.com/nigelpoulton/psweb.git
Cloning into 'psweb'...
remote: Enumerating objects: 71, done.
remote: Counting objects: 100% (37/37), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 71 (delta 24), reused 20 (delta 16), pack-reused 34
Receiving objects: 100% (71/71), 13.89 KiB | 1.74 MiB/s, done.
Resolving deltas: 100% (27/27), done.
$ cd psweb
$ ls -l
total 20
-rw-rw-r-- 1 andrew andrew  341  9月 19 19:37 app.js
-rw-rw-r-- 1 andrew andrew  324  9月 19 19:37 Dockerfile
-rw-rw-r-- 1 andrew andrew  404  9月 19 19:37 package.json
-rw-rw-r-- 1 andrew andrew  378  9月 19 19:37 README.md
drwxrwxr-x 2 andrew andrew 4096  9月 19 19:37 views

该应用程序是运行一些静态HTML的简单nodejs Web应用程序。

Dockerfile是一份纯文本文件,它告诉Docker如何将应用程序和依赖项构建到Docker镜像中。

$ cat Dockerfile
# Test web-app to use with Pluralsight courses and Docker Deep Dive book
FROM alpine

LABEL maintainer="nigelpoulton@hotmail.com"

# Install Node and NPM
RUN apk add --update nodejs npm curl

# Copy app to /src
COPY . /src

WORKDIR /src

# Install dependencies
RUN  npm install

EXPOSE 8080

ENTRYPOINT ["node", "./app.js"]

使用 docker build命令,按照Dockerfile中的说明创建新镜像。本例创建了名为test:latest 的新Docker镜像。

$ docker build -t test:latest .
[+] Building 36.2s (11/11) FINISHED
 => [internal] load .dockerignore                                0.0s
 => => transferring context: 2B                                  0.0s
 => [internal] load build definition from Dockerfile             0.0s
 <Snip>
 => => naming to docker.io/library/test:latest                   0.0s
 => => unpacking to docker.io/library/test:latest                0.7s

构建完成后,检查新的test:latest镜像是否存在于你的主机上。

$ docker images
REPO     TAG      IMAGE ID        CREATED         SIZE
test     latest   1ede254e072b   7 seconds ago    154MB

运行映像中的容器并测试应用程序。

$ docker run -d --name web1 --publish 8080:8080 test:latest

打开网页浏览器,导航到运行容器的Docker主机的DNS名称或IP地址,并将其指向8088端口。你将看到以下网页。

如果你在 Docker Desktop 上运行,则可以连接到 localhost:8080 或 127.0.0.1:8080。

4.3 小结

在本章的运维部分你下载了Docker 镜像,从中启动了容器,登录到容器中,在其中执行了命令,然后停止并删除了容器。

在开发部分,你从GitHub获取了一些源代码,并使用Dockerfile中将其构建为镜像,从而将简单的应用程序容器化。然后,你运行了容器化的应用程序。