Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样
启动时间
轻量级 容器镜像通常以 M 为单位,虚拟机以 G 为单位,容器资源占用小,要比虚拟要部署更快速
安全性
使用要求
节省项目环境部署时间
环境一致性
持续集成
微服务
弹性伸缩
命令 | 定义 | 示范 |
---|---|---|
ls | 查看全部镜像 | docker image ls |
search | 查找镜像 | docker search [imageName] |
history | 查看镜像历史 | docker history [imageName] [imageName] |
inspect | 显示一个或多个镜像详细信息 | docker inspect [imageName] |
pull | 拉取镜像 | docker pull [imageName] |
push | 推送一个镜像到镜像仓库 | docker push [imageName] |
rmi | 删除镜像 | docker rmi [imageName] |
prune | 移除未使用的镜像,没有被标记或补任何容器引用 | docker image prune |
tag | 标记本地镜像,将其归入某一仓库 | docker image tag [imageName] [username]/[repository]:[tag] |
export | 导出容器文件系统 tar 归档文件创建镜像 | docker export -o mysqlv1.tar a404c6c174a2 |
import | 导入容器快照文件系统 tar 归档文件创建镜像 | docker import mysqlv1.tar zf/mysql:v2 |
save | 保存一个或多个镜像到一个 tar 归档文件 | docker save -o mysqlv2.tar zf/mysqlv2:v3 |
load | 加载镜像存储文件来自 tar 归档或标准输入 | docker save -o mysqlv2.tar zf/mysqlv2:v3 |
build | 导入容器快照文件系统 tar 归档文件创建镜像 | docker build |
docker run centos /bin/echo "Hello world"
docker: Docker 的二进制执行文件。
run:与前面的 docker 组合来运行一个容器。
centos 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo "Hello world": 在启动的容器里执行的命令
命令 | 定义 |
---|---|
-i --interactive | 交互式 |
-t --tty | 分配一个伪终端 |
-d --detach | 运行容器到后台 |
-a --attach list | 附加到运行的容器 |
-e --env list | 设置环境变量 |
-p --publish list | 发布容器端口到主机 |
-P | --publish-all |
--mount mount | 挂载宿主机分区到容器 |
-v,--volumn list | 挂载宿主机分区到容器 |
docker ps
docker -a
docker -l
-a 显示所有的容器,包括已停止的
-l 显示最新的那个容器
字段 | 含义 |
---|---|
CONTAINER ID | 容器 ID |
IMAGE | 使用的镜像 |
COMMAND | 使用的命令 |
CREATED | 创建时间 |
STATUS | 状态 |
PORTS | 端口号 |
NAMES | 自动分配的名称 |
docker run -i -t centos /bin/bash
-t=--interactive 在新容器内指定一个伪终端或终端。
-i=--tty 允许你对容器内的标准输入 (STDIN) 进行交互。
docker run --detach centos ping www.baidu.com
docker ps
docker logs --follow ad04d9acde94
docker stop ad04d9acde94
docker kill [containerID]
kill 是不管容器同不同意,直接执行 kill -9,强行终止;stop 的话,首先给容器发送一个 TERM 信号,让容器做一些退出前必须的保护性、安全性操作,然后让容器自动停止运行,如果在一段时间内,容器还是没有停止,再进行 kill -9,强行终止
docker rm [containerID]
docker rmi [imageID]
docker rm $(docker ps -a -q) 删除所有没启动的容器
docker start [containerID]
docker stop [containerID]
docker attach [containerID]
docker container -exec -it [containerID] /bin/bash
docker container cp [containerID] /readme.md .
docker run --rm [imageID] /bin/bash
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS 说明:
-f : 指定返回值的模板文件。
-s : 显示总的文件大小。
--type : 为指定类型返回 JSON。
Docker 的网络原理是基于 Linux 内核的网络命名空间和虚拟以太网设备实现的。当 Docker 启动一个容器时,它会创建一个新的网络命名空间,并在其中启动一个虚拟网络接口。Docker 还会创建一个桥接网络,将容器连接到宿主机的网络。这样,容器就可以在独立的网络环境中运行,而不会干扰宿主机或其他容器的网络。
Docker 还支持多种网络模式,包括桥接模式、主机模式、容器模式和覆盖网络模式。桥接模式是默认的网络模式,它将容器连接到宿主机的网络上。主机模式将容器直接连接到宿主机的网络,使得容器与宿主机共享同一个网络接口。容器模式将容器连接到另一个容器的网络上,从而实现容器间的通信。覆盖网络模式则允许在多个 Docker 主机之间创建虚拟网络,从而实现容器间的通信。
总之,Docker 的网络原理基于 Linux 内核的网络命名空间和虚拟以太网设备,通过桥接网络、多种网络模式等方式实现容器的网络隔离和通信。
Docker 网络模式 | 配置 | 说明 |
---|---|---|
host 模式 | –net=host | 容器和宿主机共享 |
container 模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享 Network namespace。 kubernetes 中的 pod 就是多个容器共享一个 Network namespace。 |
none 模式 | –net=none | 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置 IP 等。 |
bridge 模式 | –net=bridge | (默认为该模式) |
定义:
Docker host 网络模式是 Docker 的一种网络模式。在这种模式下,容器共享主机的网络命名空间,并且可以直接访问主机上的网络接口。这意味着容器可以使用主机的 IP 地址,而不是分配给容器的虚拟 IP 地址,从而使容器的网络性能得到了提高。但是,这种模式也存在一些安全风险,因为容器可以直接访问主机上的网络接口。因此,Docker 官方建议只在需要直接访问主机网络栈的特定用例中使用 host 网络模式。
实验:
(1)启动一个 host 网络模式的容器
docker run -d --name hostc1 --network host -p 5001:5001 training/webapp python app.py
定义:
Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
实验:
(1)启动一个容器:
docker run -d --name hostcs1 -p 5001:5001 training/webapp python app.py
(2)启动另一个容器,并使用第一个容器的 network namespace
docker run -d --name hostcs2 --network container:hostcs1 training/webapp python app.py
注意:因为此时两个容器要共享一个 network namespace,因此需要注意端口冲突情况,否则第二个容器将无法被启动。
定义:
网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦 Docker 容器采用了 none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。Docker Container 的 none 网络模式意味着不给该容器创建任何网络环境,容器只能使用 127.0.0.1 的本机网络。
实验:
(1)创建并启动一个容器: docker run -d --name hostn1 --network none training/webapp python app.
Docker 的 bridge 网络模式是默认的网络模式。在这种模式下,docker 创建一个虚拟网络桥接器,将容器连接到这个桥接器上。此桥接器会为容器配置一个 IP 地址,并允许容器之间以及容器与主机进行通信。当容器通过容器名称进行通信时,Docker 会自动解析容器名称并将其映射到相应的 IP 地址。此外,用户还可以创建自定义 bridge 网络,以更好地控制网络环境。需要注意的是,bridge 模式下所有容器都可以互相访问,因此要确保网络安全。
要落地云原生架构,其中的一个核心点是通过容器来部署我们的应用。如果要使用容器来部署应用,那么制作应用的 Docker 镜像就是必要的,制作镜像的原理:
- 基于原镜像,启动一个 Docker 容器。
- 在容器中进行一些操作,例如执行命令、安装文件等。由这些操作产生的文件变更都会被记录在容器的存储层中。
- 将容器存储层的变更 commit 到新的镜像层中,并添加到原镜像上。
构建一个 Docker 镜像,最常用的有两种:
第一种:
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名: [TAG]
第二种:Dockerfile 下面详细说
Dockerfile 是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker 通过读取 Dockerfile 中的指令自动生成映像。
docker build 命令会读取 Dockerfile 的内容,并将 Dockerfile 的内容发送给 Docker 引擎,最终 Docker 引擎会解析 Dockerfile 中的每一条指令,构建出需要的镜像。
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
命令 | 含义 | 案例 |
---|---|---|
FROM | 继承的镜像 | FROM node |
COPY | 拷贝 | ./app /app |
WORKDIR | 指定工作路径 | WORKDIR /app |
RUN | 编译打包阶段运行命令 | RUN npm install |
EXPOSE | 暴露端口 | EXPOSE 3000 |
CMD | 容器运行阶段运行命令 | CMD npm run start |
# 设置基础镜像,若是本地没有该镜像,会从Docker.io服务器pull镜像
FROM node
# 配置环境变量
ENV NODE_ENV production
# 这个是容器中的文件目录
RUN mkdir -p /usr/src/nuxt
# 设置工做目录
WORKDIR /usr/src/nuxt
# 拷贝package.json文件到工做目录
# !!重要:package.json须要单独添加。
# Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,从新构建对应的层。
# 若是package.json和源代码一块儿添加到镜像,则每次修改源码都须要从新安装npm模块,这样木有必要。
# 因此,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
COPY package.json /usr/src/nuxt/package.json
# 安装npm依赖(使用淘宝的镜像源)
# 若是使用的境外服务器,无需使用淘宝的镜像源,即改成`RUN npm i`。
RUN npm i --production --registry=https://registry.npm.taobao.org
# 拷贝全部源代码到工做目
COPY . /usr/src/nuxt
# 暴露容器端口
EXPOSE 3000
CMD npm start
docker-compose 项目是 docker 官方的开源项目, 负责实现对 docker 容器集群的快速编排,它允许使用 YAML 文件定义应用程序的服务、网络和卷,然后使用一个命令启动整个应用程序。使用 Docker Compose,可以轻松地构建、启动和停止多个 Docker 容器,并管理它们之间的相互通信。这使得在开发、测试和部署应用程序时,管理多个 Docker 容器变得更加简单。
步骤:
- 在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
- 运行 docker-compose up,Compose 将启动并运行整个应用程序。
配置文件组成:
services 可以定义需要的服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷所属的网络和依赖的其它服务。
networks 是应用的网络,在它下面可以定义使用的网络名称,类性。
volumes 是数据卷,可以在此定义数据卷,然后挂载到不同的服务上面使用。
docker-compose 是 docker 的独立产品,因此需要单独安装 docker compose。
pip install docker-compose
字段 | 描述 |
---|---|
build | 指定 Dockerfile 文件名(要指定的 Dockerfile 文件需要在 build 标签的子级标签中用 dockefile 标签指定) |
dockerfile | 构建镜像上下文路径 |
context | 可以是 dockerfile 路径,或者时执行 git 仓库的 url 地址 |
images | 指定镜像(已存在) |
command | 执行命令,会覆盖容器启动后默认执行的命令(会覆盖 dockefile 中的 CMD 指令) |
container_name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法 scale 指定容器数量。 |
deploy | 指定部署和运行服务相关配置,只能在 swarm 模式使用 |
environment | 添加环境变量 |
networks | 加入网络,引用顶级 networks 下条目 |
network-mode | 设置容器的网络模式 |
deploy | 指定部署和运行服务相关配置,只能在 swarm 模式使用 |
ports | 暴露容器端口,与-p 相同,但是端口不能低于 60 |
volumes | 挂载一个宿主机目录或命令卷到容器,命令卷要在顶级 volumes 定义卷名称 |
volumes_from | 从另一个服务或容器挂载卷,可选参数:ro 和 rw(仅版本‘2’支持) |
hostname | 在容器内设置内核参数 |
links | 连接诶到另一个容器,- 服务名称[ : ] |
privileged | 用来给容器 root 权限,注意是不安全的,true) |
restart | 重启策略,定义是否重启容器 1、no,默认策略,在容器退出时不重启容器 2、on-failure,在容器非正常退出时(退出状态非 0),才会重启容器 3、on-failure:3 在容器非正常退出时,重启容器,最多重启 3 次 4、always,在容器退出时总是重启容器,5、unless-stopped,在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。 |
depends_on | 此标签用于解决容器的依赖,启动先后问题。如启动应用容器,需要先启动数据库容器。 |
php:depends_on | - apache- mysql |
运行这些命令需要结合 docker-compose 一起使用。
且必须要在含有 docker-compose.yml 文件的目录中才可以使用,不然报错。
命令 | 描述 |
---|---|
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服务容器启动数量 |
top | 显示正在运行的容器进程 |
logs | 查看服务容器的输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
一个 docker-compose.yml 文件的编写
version: '3' #定义编排版本,共3版(1,2,3),1被淘汰,2的话只能单机编排,3的话即可以实现单机编排,也可以实现多机编排。
services: #定义服务
nginx: #定义nginx服务
hostname: nginx #容器的主机名为nginx
build: #定义创建容器的过程 //如果有线程的镜像,直接写images:
context: ./nginx #指定创建容器的目录位置(存储dockerfile的目录)
dockerfile: Dockerfile #指定Dockerfile文件
ports: #定义端口
- 1234:80 #暴露端口
- 4321:443 #暴露端口
networks: #指定网络
ydq: #指定网络名称
ipv4_address: 172.100.0.10 #指定ip地址
volumes: #数据卷,挂载目录
- ./wwwroot:/usr/local/nginx/html #前面宿主机,后面容器
networks: #自定义网络
ydq: #自定义网络名称
driver: bridge #自定义网络模式
ipam: #网络管理器
config: #配置参数
- subnet: 172.100.0.0/16 #配置子网网段
//networks的参数ipam即网络管理,其下还有driver参数即指定使用的网络模式,以及config配置参数(比如配置子网等)
echo "this is ydq" >/opt/compose_nginx/wwwroot/index.html