基本概念
Docker给每个程序封装一套独立的运行环境,每套环境称为容器,运行在的机器称为宿主机,各个容器共用同一内核
镜像是容器的模板,容器是实际的软件,类似于类和实例的关系,镜像可以存放放在镜像仓库中
docker使用的是linux内核中自带的功能实现的容器化:
- Cgroups:可以隔离和限制进程的资源使用
- Namespace:用来隔离进程的资源视图
每个容器类似于一个独立的linux环境
常用命令
docker pull 地址:拉取镜像--platform=xxx可以指定拉取特定架构的镜像地址的命名格式如下:
docker仓库的注册表地址/命名空间/镜像名:版本号- 注册表地址表示在哪个仓库下载,如果是docker.io表示是官方仓库,可省略
- 命名空间表示作者,如果是官方仓库则为library,可省略
- 版本号不写默认为latest
docker images:查看拥有的镜像docker rmi 名字/id:删除镜像docker rm 名字/id:删除容器docker create 名字/id:创建容器不启动docker run 名字/id:使用镜像创建并运行容器- flags
-d可以以分离模式后台运行 - flags
-p可以用于宿主机到容器的端口转发,宿主机端口:容器内端口 - flags
-v可以将宿主机与容器的文件目录绑定,两者互相影响,这种目录称为挂载卷,可以用于持久化保存数据,宿主机目录:容器目录,若直接指定目录,称为绑定挂载,若使用docker volume创建命名卷,用其挂载则称为命名卷挂载,第一次使用时会将两边目录同步 - flags
-e可以往容器里传环境变量 - flags
--name可以自定义容器名 - flags
-it可以让终端进入控制台交互 - flags
--rm可以在容器停止时将容器删除 - flags
--restart容器停止时的策略,常用的有always:停止后立即重启,unless-stopped:除非手动停止不然重启 - 若不pull直接run会自动获取镜像再运行
- flags
docker ps:查看当前执行的容器,-a可以查看所有的docker volume create:创建一个卷docker volume inspect 名字:显示指定卷的信息docker volume list:查看创建的卷docker volume rm:删除一个卷docker volume prune -a:删除所有没有容器在用的卷docker start/stop 名字/id:启动/停止一个容器docker inspect id:查看容器详细信息docker logs id:查看容器日志,-f可以追踪输出docker exec id/名字 linux命令:在容器内执行Linux命令如:
docker exec -it id/名字 /bin/sh可以直接在容器内交互docker build:创建一个镜像,-t自定义名字
Dockerfile
制作镜像的图纸,创建一个Dockerfile,无后缀,可以有以下的参数使用:
| 命令 | 说明 |
|---|---|
| FROM | 指定基础镜像,用于后续的指令构建 |
| LABEL | 添加镜像的元数据,使用键值对的形式 |
| RUN | 在构建过程中在镜像中执行命令 |
| CMD | 指定容器创建时的默认命令(可以被覆盖) |
| ENTRYPOINT | 设置容器创建时的主要命令(不可被覆盖) |
| EXPOSE | 声明容器运行时监听的特定网络端口 |
| ENV | 在容器内部设置环境变量 |
| ADD | 将文件、目录或远程URL复制到镜像中 |
| COPY | 将文件或目录复制到镜像中 |
| VOLUME | 为容器创建挂载点或声明卷 |
| WORKDIR | 设置后续指令的工作目录 |
| USER | 指定后续指令的用户上下文 |
| ARG | 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置 |
| ONBUILD | 当该镜像被用作另一个构建过程的基础时,添加触发器 |
| STOPSIGNAL | 设置发送给容器以退出的系统调用信号 |
| HEALTHCHECK | 定义周期性检查容器健康状态的命令 |
| SHELL | 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令 |
Docker网络
桥接模式
docker网络默认是桥接模式,所有容器默认连接到该网络,在同一个网络中容器间可以互相访问,但宿主机和容器网络是隔离的
docker network create 名字创建子网,可以让容器加入不同子网,同一子网中的容器可以互相访问,且只需要使用容器名字访问(自带DNS机制)
docker network remove 名字删除子网
run的时候--network 可以指定子网
Host模式
docker容器在这种模式下可以直接共享宿主机的网络,而且端口无需映射,可以直接用宿主机的端口
run的时候--network host可以更改到这个模式
Docker Compose
如果一个项目需要多个docker镜像,则可以使用docker compose这个容器编排技术,它使用yml文件管理多个容器,定义了容器如何创建,如何协作
多个docker命令和一个compose文件对应关系如下:
- service表示一个服务,容器别名直接是服务名
- image定义了镜像名
- environment定义了环境变量
- volumes定义了挂载卷
- ports定义了端口映射
- depends_on表示依赖关系,可以定义容器启动顺序
- 一个docker-compose文件自动处于一个子网下
使用docker compose up/down即可运行/停止容器并删除
使用docker compose start/stop可以开始/停止容器而不删除
使用-f 指定非标准配置文件名