Docker 简介
Docker 简介
Docker 是一个开源的容器平台,可以轻松地创建、运行、分享和部署应用。Docker 容器是应用运行环境,容器内运行应用,容器之间互相隔离。Docker 容器可以运行在任何支持 Linux 的操作系统上,如 Windows、MacOS、Linux 等。Docker 容器可以运行在任何支持 Linux 的操作系统上,如Windows、MacOS、Linux 等。
使用
- 需要使用
docker就需要准备一台docker主机,docker主机一般指Linux系统,在主机中随时有一个docker服务进程Docker daemon在运行。 docker容器具有一个客户端docker cli,该客户端用于向Docker daemon发送命令,并返回结果。Registry应用市场,应用市场中的软件称为镜像。镜像是应用的运行环境。我们把用镜像启动的应用称为容器。容器可以有很多个,每一个容器都运行一个应用。
docker常用命令
| 命令 | 作用 |
|---|---|
docker pull | 从镜像仓库拉取镜像 |
docker run | 运行镜像 |
docker ps | 列出正在运行的容器 |
docker stop | 停止正在运行的容器 |
docker rm | 删除容器 |
docker images | 列出本地镜像 |
docker rmi | 删除镜像 |
docker exec | 在容器中执行命令 |
docker logs | 查看容器的日志 |
docker build | 构建镜像 |
docker push | 将镜像推送到镜像仓库 |
docker login | 登录镜像仓库 |
docker logout | 登出镜像仓库 |
docker tag | 为镜像打标签 |
docker inspect | 查看容器或镜像信息 |
docker run命令
格式:docker run -d --name [容器名称] -p [端口:端口映射] [镜像名称] [镜像标签]
docker inspect命令为查看容器或镜像信息 在信息中的Mounts字段中查看挂载信息
Mounts字段详情
Type字段为挂载类型 可选值有bind(绑定)、volume(卷)、tmpfs(临时文件系统)Source字段为挂在的宿主机目录Destination字段为容器目录的映射Mode字段为权限RW字段为读写权限Propagation字段为数据卷传播模式 可选值有rprivate(私有)、rshared(共享)、rslave(从属)、rpropagated(传播)
数据卷
- 数据卷是一个虚拟目录,是容器内目录与宿主目录之间的映射桥梁
| 命令 | 作用 |
|---|---|
docker volume create | 创建数据卷 |
docker volume inspect | 查看数据卷信息 |
dockerfile
Dockerfile是一个文本文件,用于定义如何构建镜像。Dockerfile文件其中都包含一个一个的指令,用指令来说明要执行什么操作来构建镜像- 将来
docker可以根据Dockerfile文件来构建镜像
| 指令 | 作用 |
|---|---|
FROM | 指定基础镜像 |
RUN | 执行Linux的shell命令,一般是安装过程的命令 |
ENV | 设置环境变量,可在后面指令使用 |
COPY | 拷贝本地文件到镜像的指定目录 |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 |
示例基于ubuntu镜像创建一个java镜像的Dockerfile文件
#指定基础镜像 当前基础镜像为`ubuntu:18.04`
FROM ubuntu:18.04
# 配置环境变量 JDK的安装目录 容器内的时区
ENV JAVA_DIR=/usr/local
# 拷贝JDK和java项目包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \ && \
tar -zxvf jdk8.tar.gz \
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 入口
ENTRYPOINT ["java","-jar","/tmp/app.jar"]
使用基础java镜像来构建java镜像
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
当编写好了Dockerfile文件后,就可以使用docker build命令来构建镜像了
- 格式:
docker build -t [IMAGE_NAME]:[TAG] [DOCKERFILE_DIR] -t参数指定镜像的标签IMAGE_NAME镜像名称TAG镜像版本不填默认为latestDOCKERFILE_DIR镜像构建的目录
docker build -t java-demo:1.0 .
容器网络互联
- 默认情况下,所有容器都是以
bridge(网桥)方式连接到docker的一个虚拟机上, - 在安装
docker的那一刻,docker会创建一个虚拟的网卡docker deskTap会使用wsl创建一个虚拟网卡 - 容器间由于网关一致,因此可以通过ip地址互相访问,但容器的ip地址并非是静态的,每次重启容器的ip地址都会改变
自定义网络容器
加入自定义网络的容器可以通过容器名相互访问,Docker的网络操作命令如下
- 在运行容器时,指定网络名称就可以实现在运行容器时直接加入网络
docker run -d --name [容器名] --network [网络名] [镜像名] [镜像标签]
| 命令 | 作用 |
|---|---|
docker network create [网络名] | 创建自定义网络 |
docker network ls | 列出所有自定义网络 |
docker network rm [网络名] | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network inspect [网络名] | 查看指定网络的信息 |
docker network connect [网络名] [容器名] | 将容器加入指定网络 |
docker network disconnect [网络名] [容器名] | 将容器从指定网络中移除 |
使用docker部署java应用
使用dockerFile 生成java镜像
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
docker build -t heima-java .
使用镜像启动容器
--name指定容器名称-d后台运行-p映射端口--network指定网络heima-java镜像名称
docker run --name heimaJava -d -p 8080:8080 --network heima heima-java
部署前端项目
--name容器名称-d后台运行-p映射端口-v挂载卷--network指定网络
docker run --name hmallHtml -d -p 18080:18080 -p 18081:18081 -v E:\desktop\duckicon\system\hmall\hmHtml\nginx\html:/usr/share/nginx/html -v E:\desktop\duckicon\system\hmall\hmHtml\nginx\nginx.conf:/etc/nginx/nginx.conf --network heima nginx
dockerCompose
dockerCompose通过一个单独的docker-compose.yml文件来定义一组相关联的应用容器,帮助我们实现多个相互关联的docker容器的快速部署
格式
version: '3.8' #项目版本号
# 服务定义
services:
hmall-data: # 服务名称(创建的容器名)
image: mysql # 使用的镜像名称
container_name: hmall-data # 容器名称
ports: # 端口映射
- '3306:3306'
environment: # 环境变量
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes: # 挂载卷
- '../hmData/conf:/etc/mysql/conf.d'
- '../hmData/data:/var/lib/mysql'
- '../hmData/init:/docker-entrypoint-initdb.d'
networks: # 网络
- hm-net
hmall-item-service: # 服务名称(创建的容器名)
build: # 构建镜像
context: ./java # 构建镜像的Dockerfile文件位置
dockerfile: Dockerfile # Dockerfile文件名称
container_name: hmall-item-service # 容器名称
ports: # 端口映射
- '8080:8080'
networks: # 网络
- hm-net
depends_on: # 启动依赖
- hmall-data
hmall-nginx: # 服务名称(创建的容器名)
image: nginx # 镜像名称
container_name: hmall-nginx # 容器名称
ports: # 端口映射
- '18080:18080'
- '18081:18081'
volumes: # 挂载卷
- '../hmHtml/nginx/nginx.conf:/etc/nginx/nginx.conf'
- '../hmHtml/nginx/html:/usr/share/nginx/html'
depends_on: # 启动依赖
- hmall-item-service
networks: # 网络
- hm-net
hamll-nocos: # 服务名称(创建的容器名)
image: nacos/nacos-server:v2.1.0-slim
container_name: hamll-nocos
restart: always
environment:
- PREFER_HOST_MODE=hostname # 指定容器启动时,使用主机名作为容器的IP地址
- MODE=standalone # 启动模式 单机模式
- SPRING_DATASOURCE_PLATFORM=mysql # 数据库类型
- MYSQL_SERVICE_HOST=hmall-data # 数据库服务名称
- MYSQL_SERVICE_DB_NAME=nacos # 数据库名称
- MYSQL_SERVICE_PORT=3306 # 数据库端口
- MYSQL_SERVICE_USER=root # 数据库用户名
- MYSQL_SERVICE_PASSWORD=123 # 数据库密码
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
ports: # 端口映射
- '8848:8848'
- '9848:9848'
- '9849:9849'
networks:
- hm-net
depends_on:
- hmall-data
networks: # 网络
hm-net: # 网络名称
name: hm-net
dockerCompose 命令
格式:docker compose [参数] [指令]
| 类型 | 参数或指令 | 说明 |
|---|---|---|
| 参数 | -f | 指定docker-compose.yml文件路径和名称 不指定默认当前文件 |
| 参数 | p | 指定项目名称 |
| 指令 | up | 创建并启动所有的service容器 |
| 指令 | down | 停止并删除所有的service容器、网络 |
| 指令 | ps | 列出所有启动的容器 |
| 指令 | logs | 查看指定容器日志 |
| 指令 | stop | 停止指定容器 |
| 指令 | start | 启动指定容器 |
| 指令 | restart | 重启指定容器 |
| 指令 | top | 查看运行的进程 |
| 指令 | exec | 在指定运行的容器中执行命令 |