先来看几个概念: 镜像(Image): 应用和运行应用所需的环境、配置和系统函数库 容器(container): docker在运行镜像时创建的一个隔离环境 docker下载应用时,会自动搜索并下载镜像。 **镜像仓库:**存储和管理镜像的平台
(图片来源于黑马程序员b站视频)
一个镜像可对应多个容器。这里可以类比程序和进程,进程是运行的程序实例,多开几个进程,就像多创建几个镜像的容器。
命令解读
docker run -d \ //run运行镜像,即创建容器执行 -d值后台运行
--name mysql \ //给容器起名,必须唯一
-p 3306:3306 \ //端口映射 本机端口:容器端口
-e TZ=Asia/Shanghai \ //e值environment 配置时区
-e MYSQL_ROOT_PASSWORD=123 \ //设置root密码
mysql //镜像名
镜像名称结构: Repository:TAG 如mysql:5.7 不写tag,就是最新版
常见命令
(图片来源于黑马程序员b站视频)
docker pull:拉取镜像
docker push:往仓库推送镜像
docker images: 列出本地镜像
docker rmi: 删除镜像
docker build: 使用dockerfile创建镜像
docker save :将指定镜像保存成 tar 归档文件。 -o 文件名.tar
docker load :导入使用镜像。 -i
docker run: 创建容器并启动
docker ps:查看容器(默认是启动的) -a(所有容器)
docker stop:停止容器
docker start:启动容器
docker rm:删除容器
docker logs:查看容器日志
docker exec:进入容器(应用)
注意:docker run是创建新容器并启动 docker start是启动已有的容器
数据卷
数据卷(volume):一个虚拟目录,是容器内目录和宿主机目录之间映射的桥梁。
挂载数据卷
•在创建容器时,利用 -v 数据卷名:容器内目录完成挂载 •容器创建时,如果发现挂载的数据卷不存在时,会自动创建
(图片来源于黑马程序员)
自定义镜像
构建一个java镜像的步骤
1.准备一个linux运行环境 2.安装jre并配置环境变量 3.拷贝jar包 4.编写运行脚本 每一步都会生成一个压缩包,所有包组合成镜像 层(layer) 添加安装包、依赖、配置等,每次操作都形成新的一层。 (不同镜像之间可能共享层,不用多次下载相同层) **基础镜像(BaseImage)**应用依赖的系统函数库、环境、配置、文件等
(图片来源于黑马程序员)
之前docker pull了一个镜像,
现在再pull一个其它的镜像,发现第一个uuid对应了Already exists,即层已存在,不必再下载一遍(层共享)
入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数
dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM centos:6 |
| ENV | 设置环境变量,可在后面指令使用 | ENV key value |
| COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jre11.tar.gz /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jre11.tar.gz |
| && EXPORTS path=/tmp/jre11:$path | ||
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
(来源于黑马程序员)
自定义镜像
docker build -t myImage:1.0 . 构建镜像的命令
-t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
. :是指定Dockerfile所在目录,如果就在当前目录,则指定为"."
网络
在一个网段中,可以相互访问 原因:都有相同的网关(gateway)
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上: docker0是网桥,连接到网桥上的容器被分配一个ip
(来源于黑马程序员)
自定义网络
新的网桥(络) 加入自定义网络(连接自定义的网桥)的容器可以通过容器名互相访问 docker的网络操作命令:
| 命令 | 说明 | 文档地址 |
|---|---|---|
| docker network create | 创建一个网络 | docker network create |
| docker network ls | 查看所有网络 | docker network ls |
| docker network rm | 删除指定网络 | docker network rm |
| docker network prune | 清除未使用的网络 | docker network prune |
| docker network connect | 使指定容器连接加入某网络 | docker network connect |
| docker network disconnect | 使指定容器连接离开某网络 | docker network disconnect |
| docker network inspect | 查看网络详细信息 | docker network inspect |
(来源于黑马程序员)
dockercompose
Docker Compose通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall
docker compose的命令格式 docker compose [OPTIONS] [COMMAND]
| 类型 | 参数或指令 | 说明 |
|---|---|---|
| Options | -f | 指定compose文件的路径和名称 |
| -p | 指定project名称 | |
| Commands | up | 创建并启动所有service容器 |
| down | 停止并移除所有容器、网络 | |
| ps | 列出所有启动的容器 | |
| logs | 查看指定容器的日志 | |
| stop | 停止容器 | |
| start | 启动容器 | |
| restart | 重启容器 | |
| top | 查看运行的进程 | |
| exec | 在指定的运行中容器中执行命令 |