Docker基础

Posted 转角90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

Docker 基础镜像

参考技术A

buster 现在更常见,未来 bullseye 会越来越多。 一般情况下,其它几个都不是我们的第一选择。

Alpine 是众多 Linux 发行版中的一员,和 CentOS、Ubuntu、Archlinux 之类一样,只是一个发行版的名字,号称小巧安全,有自己的包管理工具 apk 。

Alpine 非常非常小:100M vs 5M !

官方 Alpine 镜像的文档: http://gliderlabs.viewdocs.io/docker-alpine/

但是 Alpine 的小是有代价的,在不轻易间可能会给你造成麻烦!

Alpine Linux 除了插件了一些不必要的软件之外,特别重要的是,它使用了 musl libc 代替了大名鼎鼎的 glibc 。

musl libc 含有和 glibc 一样的标准功能,但是问题是 glibc 还有标准功能之外的扩展功能,由于 glibc 的历史地位和市场占有率,导致 glibc 的扩展功能实际上的使用也很广泛!有不少软件的编译、安装和运行都用到了 glibc 的扩展功能,因此这些软件在使用了 glibc 的基础颈项上就能运行,在使用了 musl libc 的 alpine 上则不行。

另外,Alpine 并没有像 Red Hat 或 Canonical 之类的大公司为其提供维护支持,软件包的数量也比这些发行版少很多(如果只看开箱即用的默认软件仓库,Alpine 只有 10000 个软件包,而 Ubuntu、Debian 和 Fedora 的软件包数量均大于 50000。)

如果实在不想折腾,可以选择一个折衷的镜像 xxx:slim。slim 镜像一般都基于 Debian 和 glibc,删除了许多非必需的软件包,优化了体积。如果构建过程中需要编译器,那么 slim 镜像不适合,除此之外大多数情况下还是可以使用 slim 作为基础镜像的。

以上是关于Docker基础的主要内容,如果未能解决你的问题,请参考以下文章

Docker基础

Docker 镜像:基于 Ubuntu 的基础镜像中文问题解决

Docker 基础镜像

Docker——Docker基础+Docker安装

docker入门基础

Docker基础