Docker教程4快速入门
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
$ 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
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html### 参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
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="[email protected]"
# 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中将其构建为镜像,从而将简单的应用程序容器化。然后,你运行了容器化的应用程序。