前言
Docker:Docker容器不是模拟一个完整的操作系统,而是对进程进行隔离,它所接触的资源都是虚拟的。
- 镜像是静态模板,类似于类,
- 容器是镜像的运行实例化对象,并且与其他容器和主机相互隔离,容器都共享主机资源。
Docker Compose: 用于定义和运行多容器应用程序的工具,通过单个 YAML 文件管理所有服务,通过yaml文件【程序】管理多个容器。
Docker
#image
docker images #查看 = docker image ls
docker pull 镜像 #拉取 = docker image pull 镜像
docker rmi 镜像id #删除 = docker image rmi 镜像id
docker run [OPTIONS] IMAGE:Tag [COMMAND] [ARG...]
#docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:
与交互时:
-i:表示交互界面, interactive;
-t:表示伪终端;tty
-d:,detach,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里);
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p
--name:为创建的容器命名;
--rm: 容器退出时自动删除。非常适合运行“临时任务”。
网络与端口映射
-p (publish): 端口映射。宿主机端口:容器端口(如 -p 8080:80)。
--network: 指定网络。将容器连接到特定的 Docker 网络(如 --network my-net)。
-h (hostname): 设置容器主机名
存储挂载(数据持久化):
-v (volume): 挂载卷或目录。格式为 宿主机路径:容器路径
--mount: 更明确的挂载方式。
环境变量与配置
-e (env): 设置环境变量
单横杠 - (Short Options) 用于 “缩写” 或 “单字母” 参数。可以合并连写。
双横杠 -- (Long Options) 用于 “全拼” 或 “多字母单词” 参数。不能合并。
#通用:
docker run -it --name 容器名称 镜像名称:标签 /bin/bash
exit #退出当前容器
注意:Docker 容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为是空闲状态,就会自动退出。
# 只读。只能通过修改宿主机内容实现对容器的数据管理。
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 读写,默认。宿主机和容器可以双向操作数据。
docker run -it -v /宿主机目录:/容器目录:rw 镜像名
#以守护式方式创建容器
docker run -di --name 容器名称 镜像名称:标签
#登录守护式容器方式【running】
docker exec -it 容器名称|容器ID /bin/bash
# 启动容器
docker start 容器名称|容器ID
# 停止容器,会善后清理
docker stop 容器名称|容器ID
# 终止容器,会善后清理
docker kill 容器名称|容器ID
# 删除指定容器
docker rm 容器名称|容器ID
# 删除多个容器
docker rm 容器名称|容器ID 容器名称|容器ID
#删除所有容器
docker rm `dcoker -ps -q -a`
#拷贝到容器内:
docker cp 需要拷贝的文件或目录 容器名称:容器目录
#拷贝出容器:
docker cp 容器名称:容器目录 需要拷贝的文件或目录
Dockerfile
-
排除打包路径或文件
新建一个文本文件
.dockerignore -
在项目的根目录下,新建一个文本文件 Dockerfile
FROM node:8.4 #该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。 COPY . /app #将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。 WORKDIR /app #指定接下来的工作路径为/app。 RUN npm install #在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。 EXPOSE 3000 #将容器 3000 端口暴露出来, 允许外部连接这个端口。 CMD node demos/01.js #进入容器默认执行,可以被覆盖 -
创建镜像文件
docker image build -t koa-demo . -t:tag,镜像标签 .:对应Dockerfile文件的目录
Docker Compose
docker compose:多个容器的协同维护,定义容器之间的编排。
- Docker Compose主要用于在单个主机上管理和运行多个容器应用程序。
- K8s更灵活,它在docker的基础上,还可以在多个主机上运行这些应用程序。
#启动,类似于,docker run
docker-compose up -d -f -p
-d “后台”运行
-f 识别 Docker Compose 配置文件
-p 定义项目名
#相反的操作,跑路
docker-compose down
Docker Compose 配置项:
#项目版本号
version: "3"
#服务
services:
#指定镜像
1. image #指定镜像 eg:
image: redis:3.2
2. Dockerfile #构建镜像 eg:
build:
context: ./webapp
dockerfile: webapp-dockerfile
args:
- JAVA_VERSION=1.6
#依赖声明
depends_on
#文件挂载 相对位置文件挂载,便于管理调式代码
#使用数据卷 存放大量数据【独立声明】
volumes:
mysql-data:
external: true
#配置网络 网络也是容器间互相访问的桥梁【独立声明】
networks:
frontend:
backend:
networks:
frontend:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.1.0/24
## ......
#使用网络别名 直接使用容器名或服务名【别名】来作为连接其他服务的网络地址
#端口映射 宿主机与容器端口的映射
note,由于 YAML 格式对 xx:yy 这种格式的解析有特殊性,在设置小于 60 的值时,会被当成时间而不是字符串来处理,所以我们最好使用引号将端口映射的定义包裹起来,避免歧义