docker
Containerizing an application
workflow
- 首先创建 Docker image,为应用程序的每个组件创建和测试单独的 container
- 将您的容器和支持基础架构组装成一个完整的应用程序,以 Docker stack file 或 Kubernetes YAML 表示
- 测试,共享和部署完整的容器化应用程序
create image
-
Clone 一个示例项目:
git clone -b v1 https://github.com/docker-training/node-bulletin-board cd node-bulletin-board/bulletin-board-app
-
包含源代码和 dockerfile 文件:
FROM node:6.11.5 WORKDIR /usr/src/app COPY package.json . RUN npm install COPY . . CMD [ "npm", "start" ]
编写 Dockerfile 是容器化应用程序的第一步。您可以将这些 Dockerfile 命令视为有关如何构建映像的逐步指南。此步骤采取以下步骤:
- 启动
FROM
先前存在的node:6.11.5
图像。这是由 node.js 供应商构建的官方映像,并已由 Docker 验证为包含节点6.11.5解释器和基本依赖项的高质量映像。 - 使用
WORKDIR
指定的后续操作应该从目录中取/usr/src/app
你的映像文件系统(从不主机的文件系统)。 COPY``package.json
从您的主机到.
图像中当前位置()的文件(因此在此情况下为/usr/src/app/package.json
)RUN``npm install
映像文件系统内的命令(将读取该命令package.json
以确定应用程序的节点依赖性,并安装它们)COPY
在应用程序其余部分的源代码中,从主机到图像文件系统。
- 启动
-
在
node-bulletin-board/bulletin-board-app
目录下,执行此命令创建一个 image:docker image build -t bulletinboard:1.0 .
-
根据新的 image 启动容器:
docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
,我们在这里使用了几个常见的标志:--publish
要求Docker将主机端口8000上传入的流量转发到容器的端口8080(容器具有自己的专用端口集,因此如果我们要从网络访问一个端口,则必须以这种方式将流量转发给它;否则,防火墙规则将阻止所有网络流量到达您的容器,这是默认的安全状态)。--detach
要求Docker在后台运行此容器。--name
让我们指定一个名称,在以后的命令中,我们可以使用该名称来引用我们的容器bb
。
还要注意,我们没有指定我们要运行容器的进程。我们没有必要,因为我们
CMD
在构建Dockerfile时使用了指令。因此,Docker知道npm start
在容器启动时会自动运行该过程。 -
访问
localhost:8000
,看到公告板应用程序已启动并正在运行 -
删除容器:
docker container rm --force bb
-
还可以基于已有的 image 创建新的 image:在已有的 image 中操作之后,执行
docker commit -m="description" -a="author" containerID imageName
-
可以在 registry 中存储和管理 image
部署到 kubernetes
- 编辑 yaml 文件,如
bb.yaml
,内容 kubectl apply -f bb.yaml
kubectl get deployments
kubectl get services
- 访问
localhost:30001
- 删除应用程序:
kubectl delete -f bb.yaml
configure networking
分类
bridge
:需要多个容器在同一Docker主机上进行通信时host
:当网络堆栈不应与Docker主机隔离时,但希望容器的其他方面隔离时overlay
:需要在不同Docker主机上运行的容器进行通信时,或者当多个应用程序使用集群服务一起工作时macvlan
:从VM设置迁移或需要容器看起来像网络上的物理主机(每个主机都有唯一的MAC地址)时none
:通常与自定义网络驱动程序一起使用,none
不适用于群体服务网络插件
:可以将Docker与专用网络堆栈集成- 常用命令:
- 参考
docker network create --driver bridge net1
docker network inspect net1
docker network ls
docker network rm net1
docker network connect net1 container1
docker network disconnect net1 container1
docker network prune
bridge
- 可以使用默认的
bridge
网络,也可以自定义,参考
overlay
- 参考
- 集群中,两个主机上的容器,通过两个主机之间的相同的覆盖网络通信
docker cp
- 从容器复制文件或目录到宿主机:
docker cp container1:path <path>
- 从宿主机复制文件或目录到容器:
docker cp <path> container1:path
docker compose
intro
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。
基本分三个步骤:
- 编写
Dockerfile
定义环境 - 编写
docker-compose.yml
定义 app 的服务 - 运行
docker-compose up
,使用 compose 启动运行服务 - 参考
常用命令:
-
docker-compose up
docker-compose up -d(后台运行)
-
docker-compose down(删除)
-
docker-compose ps
-
docker-compose stop(停止)
-
docker-compose run cmd
执行服务的某一个命令