这篇文章是 docker-curriculum.com 的学习笔记,包含 docker 的基础概念和入门用法。通过阅读该教程,我对 docker 以及容器化的软件开发、分发和部署有了初步的认识。

1 基础概念

Docker 允许将应用程序部署在一个容器(沙盘)中。Docker 优势在于可以将应用程序和它所依赖的组件打包为一个标准化单元。Docker 并没有很高开销,因此能比虚拟机(virtual machine)更有效率地调动底层系统资源。

使用 Docker 可以实现宿主系统与容器系统的相互隔离,降低两者之间的相互影响。

容器提供了一种逻辑封装机制,能够将应用程序所运行的环境抽象出来。这种解耦过程让基于容器的应用程序更易于部署和维护。容器除了提高可移植性之外,还可以对资源进行更精细的控制,从而提高基础架构的效率,从而提高计算资源的利用率。

2 简单的 docker 应用

学习 Docker 的第一步是安装 Docker。在 Docker 的官网上就能找到对应平台的安装教程。

启动 docker 服务。

service docker start

Docker 的 hello world,用于测试 Docker 已经安装成功。

docker run hello-world

Docker 的 busybox,提供命令行的交互。

docker run busybox echo "hello from busybox"

查看 Docker 容器

docker ps

查看所有 Docker 容器,包含已经退出的容器。

docker ps -a

以交互模式模式运行容器,其中的 it 是 interactive 的缩写。

docker run -it busybox sh

停止一个正在运行的容器

docker stop <container id>

删去容器

docker rm <container id>

删去所有停止的容器

docker rm $(docker ps -a -q -f status=exited)
docker container prune

重新连接到一个正在运行的容器

docker attach <container name>
# 或
docker exec -it <container name> /bin/bash

3 运行web应用

教程的作者提供了一个 web 应用的 Docker image 用于测试。

docker run --rm prakhar1989/static-site

将服务的端口映射到宿主机

docker run -d -P --name static-site prakhar1989/static-site

查看端口映射

docker port static-site

指定端口映射

docker run -p 8888:80 prakhar1989/static-site

停止运行容器

docker stop static-site

4 Docker 镜像

查看本机上的 Docker image

docker images

对于 Docker image 的分类:

  • base images: 没有父镜像的镜像,一般是操作系统镜像,如 ubuntu,busybox
  • child images: 基于 base image 的镜像,附加有额外的功能
  • offical images: 官方维护的镜像,它们的名字大多由一个单词组成
  • user images: 用户创建的镜像,它们名字的格式为 user/image-name

可以使用 Dockerfile 定义一个镜像。
构建 docker 镜像,注意这个名称应该与自己在Docker hub上的用户名相同,因为后续会将制作好的镜像推送到 docker hub 中。

docker build -t samsonwang/catnip .

推送镜像到 Docker hub 中

docker push samsonwang/catnip

删除镜像

docker rmi image-name

5 多容器应用

现代的网络服务系统大都由多个模块组成,这也就需要多个容器配合完成服务功能。
多容器之间的通信需要借助 Docker 提供的桥接网络。

查看 Docker 网络

docker network ls

查看桥接网络

docker network inspect bridge

创建专用桥接网络

docker network create xxx-net

在特定的网络中运行

docker run -it --rm --net foodtrucks-net prakhar1989/foodtrucks-web bash

docker 支持自动服务发现(automatic service discovery)特性,可以使用容器名称指代 ip 地址。

使用 docker compose 工具完成多容器应用的部署,它的配置文件名为 docker-compose.yml ,在配置文件中可以设置各个容器的依赖关系。
使用 docker compose 启动多个容器

docker-compose up
docker-compose down