Docker基础

Docker 介绍

Docker 是一种管理应用的现代手段,让应用管理变得可以预测和高效

Docker 安装

Docker 安装位置

默认位置是 C:\Program Files\Docker

软连接

mklink /j "C:\Program Files\Docker" "F:\Docker"

注意

  • 是否以管理员身份打开的命令行?

  • 目标路径下是否已经有 命令行里的目录,例如:命令 mklink /j "C:\Program Files\Docker" "D:\Program Files\Docker" 中,D:\Program Files\Docker 这个目标路径要已经存在,即这个文件夹已经存在。

  • 源路径必须不存在,即:C:\Program Files\Docker 必须不存在,否则提示 :文件夹已存在

  • 为了保证安装成功,最好把安装包,直接放在 目标文件夹里 双击运行安装。

启动


Docker 使用

命令行操作

镜像操作

  • docker search <镜像名>: 查询镜像
  • docker image ls: 显示所有镜像
  • docker image rmi <镜像名>: 删除镜像
  • docker history <镜像名>:显示镜像历史
  • docker inspect <镜像名>: 显示一个或多个镜像详细信息
  • docker pull <镜像名>:拉取镜像
  • docker push <镜像名>:推送一个镜像到镜像仓库
  • docker rmi <镜像名>: 删除镜像
  • docker image tag <镜像名> [用户名]/[仓库]:[tag 名]: 标记本地镜像,将其归入某一仓库
  • docker image prune: 移除未使用的镜像
  • docker save -o [filename].tar [镜像]:将镜像保存为.tar 文件
  • docker load -i [filename].tar: 将.tar 文件导入创建镜像
  • docker build -t [镜像名] . : 构建镜像

容器操作

  • docker run <镜像>
  • docker container ls
  • docker inspect
  • docker container stats: 显示容器资源使用统计
  • docker container top: 显示一个容器运行的进程
  • docker container update -m 500m [容器 ID]: 更新一个或多个容器配置
  • docker container port <容器 ID>: 端口
  • docker container stop <容器 ID>: 停止
  • docker container start <容器 ID>: 开始
  • docker container rm <容器 ID>: 删除
    • docker container rm $(docker ps -a -q)
  • docker kill <容器 ID>: 终止容器(发送)
  • docker logs <容器 ID>: 查看容器的输出
  • docker container exec -it [容器 ID] 命令:进入一个正在运行的 docker 容器执行命令
  • docker container cp [容器 ID]:文件路径: 将文件拷贝到本机
  • docker commit -a '作者' -m '说明' [容器 ID]: 创建一个新镜像,来自一个容器
  • docker export -o [filename].tar [容器 ID]: 将容器导出为一个 tar 文件
  • docker import [filename].tar: 将容器快照文件 tar 归档并创建镜像

参数

  • -i:交互式
  • -t:分配一个伪终端
  • -d:运行容器到后台
  • -a:指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
  • -e:设置环境变量
  • -p:指定端口映射,格式为:主机(宿主)端口:容器端口
  • -q:只显示容器 ID
  • --name="nginx-lb": 为容器指定一个名称

制作 Dockerfile

编写 Dockerfile

命令 含义
FROM 继承的镜像
COPY 拷贝
WORKDIR 指定工作路径
RUN 编译打包阶段运行的命令
EXPOSE 暴露端口
CMD 容器运行阶段运行命令

RUN 和 CMD

RUN 是

.dockerignore

表示要排除,不要打包到 image 中的文件

.git

node_modules

数据盘

删除容器时,一些数据需要永久保存时

位置: 宿主机 /var/lib/docker/volumes/自定义名称/_data

创建

docker volume create [数据盘名称]

挂载

docker volume create nginx-vol

挂载
docker run -d --name=nginx1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d --name=nginx2 -v nginx-vol:/usr/share/nginx/html -p 3000:80 nginx

删除

docker stop nginx1  停止容器
docker rm nginx1 删除容器
docker volume rm nginx-vol  删除数据盘

管理数据盘

docker volume ls 列出所有数据盘
docker volume ls -f dangling=true  列出所有已经孤立的数据盘
docker volume rm xxx 删除数据盘

多个容器共用一个数据盘

docker create -v /logger:/logger --name logger centos

docker run --volume-from logger --name logger1 -it centos bash
docker run --volume-from logger --name logger2 -it centos bash

网络

安装 Docker 时,会自动创建三个网络,bridge、none、host

使用 --network 指定容器应该连接哪些网络

bridge(桥接)

该模式下会为每一个容器分配 IP,默认设置

docker run --network=bridge

docker network ls 列举所有网络
docker inspect bridge 列举网络为bridge的容器
docker run -d --name nginx1 nginx
docker run -d --name nginx2 --link nginx1 nginx  # --link的作用:进入到nginx2容器中,可以通过ping nginx1测试是否连接
docker exec -it nginx2 bash
apt update
apt install -y inetutils-ping  # ping
apt install -y dnsutils # nslookup
apt install -y net-tools # ifconfig
apt install -y iproute2 #ip
apt install -y curl  # curl
cat /etc/hosts
ping nginx1

none

关闭了容器的网络功能,对外界完全隔离

host

容器将不会虚拟出自己的网卡,配置自己的 IP,而是使用宿主机的 IP 和端口

自定义网络

子网络之间,相互隔离,子网络内的容器可以通信

创建多个网络,每个网络 IP 范围均不相同

自带一个 DNS 服务器,可以通过容器的名字和 ID 访问对应的容器

docker network create --driver bridge [自定义名]

# 创建自定义网络
docker network create --dirver bridge myweb1
docker network create --dirver bridge myweb2

# 查看
docker network inspect myweb1

# 创建容器时指定网络
docker run -d --name nginx1 --net myweb1 nginx
docker run -d --name nginx2 --net myweb1 nginx
docker run -d --name nginx3 --net myweb2 nginx
docker run -d --name nginx4 --net myweb2 nginx

#nginx1、nginx2同属于 myweb1网络 可以通信,nginx3、nginx4同属于 myweb2网络 可以通信 , 不能与nginx1、nginx2通信


# 连接到指定网络
docker run -d --name nginx5 nginx
docker network connect myweb1 nginx5

# 断开连接网络
docker network disconnect myweb1 nginx5


# 移除网络
docker network rm myweb1

docker-compose

通过一个配置文件管理多个 Docker 容器

  • services: 定义需要的服务,每一个服务都有自己的名字、使用的镜像,挂载的数据卷所属的网络和依赖的其他服务
  • networks: 是应用的网络,在它下面可以定义使用的网络名称
  • volumes: 是数据卷,可以在此定义数据卷,然后挂载到不同的服务上面使用

安装

yum -y install python-pip
pip install docker-compose

docker-compose.yml

version: "2" # Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
services:
  nginx1:
    image: nginx
    networks:
      - "myweb"
      - "default"
    ports:
      - "8081:80"
    volumes:
      - "data:/data" #  "/var/lib/docker/volumes/nginx_data/_data"
      - "./front:/usr/share/nginx/html"
  nginx2:
    image: nginx
    ports:
      - "8082:80"
volumes: # 数据卷,
  data:
    driver: local # 本地的
networks:
  myweb:
    driver: "bridge"

build

version: "3.9"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
  • context 上下文路径,可以是文件路径,也可以是到链接到 git 仓库的 url。当是相对路径时,它被解释为相对于 Compose 文件的位置。
  • dockerfile 指定构建镜像的 Dockerfile 文件名
  • args 构建参数,只能在构建过程中访问的环境变量
  • cache_from 缓存解析镜像列表
  • labels 设置构建镜像的元数据
  • network 设置网络容器连接,none 表示在构建期间禁用网络
  • shm_size 设置/dev/shm此构建容器的分区大小
  • target 多阶段构建,可以指定构建哪一层

命令

  • docker-compose up -d: 后台启动所有服务
  • docker-compose ps: 查看
  • docker-compose start: 启动所有容器
  • docker-compose stop: 停止所有容器
  • docker-compose rm <容器 ID>: 删除服务容器
  • docker-compose logs -f : 持续跟踪日志
  • docker-compose down: 删除网络及容器

node 服务

目录结构

docker-compose.yml

version: "3"
services:
  db:
    image: mariadb
    environment: # 环境变量
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_DATABASE: "nodeapp"
      MYSQL_USER: "hyf"
      MYSQL_PASSWORD: "123456"
    volumes:
      - dbdata:/var/lib/mysql
  node:
    build:
      context: "./images/node"
      dockerfile: Dockerfile
    depends_on:
      - db
  web:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - "./images/nginx/conf.d:/etc/nginx/conf.d"
      - "./images/node/public:/public"
volumes:
  dbdata:
    driver: local

node/Dockerfile

FROM node
COPY web /web
WORKDIR /web
RUN pnpm i
EXPORSE 80
CMD npm start
posted @ 2023-06-01 03:11  转角90  阅读(17)  评论(0编辑  收藏  举报