docker基础学习总结,一篇拿下docker!

81 阅读5分钟

先来看几个概念: 镜像(Image): 应用和运行应用所需的环境、配置和系统函数库 容器(container): docker在运行镜像时创建的一个隔离环境 docker下载应用时,会自动搜索并下载镜像。 **镜像仓库:**存储和管理镜像的平台

image.png (图片来源于黑马程序员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,就是最新版

常见命令

image.png (图片来源于黑马程序员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 数据卷名:容器内目录完成挂载 •容器创建时,如果发现挂载的数据卷不存在时,会自动创建

image.png (图片来源于黑马程序员)

自定义镜像

构建一个java镜像的步骤

1.准备一个linux运行环境 2.安装jre并配置环境变量 3.拷贝jar包 4.编写运行脚本 每一步都会生成一个压缩包,所有包组合成镜像 层(layer) 添加安装包、依赖、配置等,每次操作都形成新的一层。 (不同镜像之间可能共享层,不用多次下载相同层) **基础镜像(BaseImage)**应用依赖的系统函数库、环境、配置、文件等

image.png (图片来源于黑马程序员) 之前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

image.png (来源于黑马程序员)

自定义网络

新的网桥(络) 加入自定义网络(连接自定义的网桥)的容器可以通过容器名互相访问 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名称
Commandsup创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令