Docker 技术笔记

Docker

docker 一种容器技术,解决软件跨环境迁移问题

镜像:相当于一个root文件系统。

容器:镜像和容器就是类和对象的关系,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动停止、删除暂停等

仓库:保存镜像文件

Docker是用Go编程语言编写的,它利用了Linux内核的几个特性来提供其功能。Docker使用名为命名空间的技术来提供名为容器的隔离工作空间。当您运行容器时,Docker会为该容器创建一组名称空间。

这些名称空间提供了一层隔离。容器的每个方面都在一个单独的命名空间中运行,其访问权限仅限于该命名空间

安装docker(centos)

# 1、yum 包更新到最新 
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y 
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v

docker架构

Docker使用客户端-服务器架构。Docker客户端与Docker守护进程对话,后者负责构建、运行和分发Docker容器。Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护进程通过UNIX套接字或网络接口使用REST API进行通信。另一个Docker客户端是Docker Compose,它允许您处理由一组容器组成的应用程序。

在这里插入图片描述

**Docker守护程序(dockerd)**监听Docker API请求并管理Docker对象,如图像、容器、网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。

**Docker客户端(Docker)**是许多Docker用户与Docker交互的主要方式。当您使用dockerrun等命令时,客户端将这些命令发送到dockerd,由dockerd执行这些命令。docker命令使用docker API。Docker客户端可以与多个守护进程通信。

Docker registry存储Docker图像。Docker Hub是一个任何人都可以使用的公共的registry,默认情况下Docker被配置为在DockerHub上查找image。您甚至可以运行自己的私有registry。

使用docker pulldocker run命令时,将从配置的registry中提取所需的image。当您使用docker push命令时,image将被推送到配置的registry中。

Docker 镜像加速器

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

  • 科大镜像:https://docker.mirrors.ustc.edu.cn/
  • 网易:https://hub-mirror.c.163.com/
  • 阿里云:https://<你的ID>.mirror.aliyuncs.com
  • 七牛云加速器:https://reg-mirror.qiniu.com

当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。

  • 对于使用 upstart 的系统

编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址:

DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

重新启动服务:

$ sudo service docker restart
  • 对于使用 systemd 的系统,

请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}

之后重新启动服务:

$ **sudo** systemctl daemon-reload
$ **sudo** systemctl restart docker

docker 常用命令

1.基础命令

#启动docker
systemctl start docker
#关闭docker
systemctl stop docker
#重启docker
systemctl restart docker
#docker设置随服务启动而自启动
systemctl enable docker
#查看docker 运行状态  如果是在运行中 输入命令后 会看到绿色的active
systemctl status docker
#查看docker 版本号信息
docker version
docker info
docker 帮助命令
#忘记了某些命令便可使用此进行查看与回顾
docker --help
#比如
docker pull --help
# 登陆 登出
docker login -u 用户名 -p 密码 
docker logout [OPTIONS] [SERVER]

2.镜像命令

docker images 
docker search 镜像名
docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像
docker pull 镜像名 
docker pull 镜像名:tag
#删除一个
docker rmi -f 镜像名/镜像ID
#删除多个 其镜像ID或镜像用用空格隔开即可 
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
#删除全部镜像  -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
#保存镜像将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像
docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
#加载镜像任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像
docker load -i 镜像保存文件位置
#镜像标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag 源镜像名:TAG 想要生成新的镜像名:新的TAG

使用 Dockerfile 创建镜像

docker build [OPTIONS] PATH | URL | -

OPTIONS说明:

  • **–build-arg=[] 😗*设置镜像创建时的变量;
  • **–cpu-shares 😗*设置 cpu 使用权重;
  • **–cpu-period 😗*限制 CPU CFS周期;
  • **–cpu-quota 😗*限制 CPU CFS配额;
  • **–cpuset-cpus 😗*指定使用的CPU id;
  • **–cpuset-mems 😗*指定使用的内存 id;
  • **–disable-content-trust 😗*忽略校验,默认开启;
  • **-f 😗*指定要使用的Dockerfile路径;
  • **–force-rm 😗*设置镜像过程中删除中间容器;
  • **–isolation 😗*使用容器隔离技术;
  • **–label=[] 😗*设置镜像使用的元数据;
  • **-m 😗*设置内存最大值;
  • **–memory-swap 😗*设置Swap的最大值为内存+swap,"-1"表示不限swap;
  • **–no-cache 😗*创建镜像的过程不使用缓存;
  • **–pull 😗*尝试去更新镜像的新版本;
  • **–quiet, -q 😗*安静模式,成功后只输出镜像 ID;
  • **–rm 😗*设置镜像成功后删除中间容器;
  • **–shm-size 😗*设置/dev/shm的大小,默认值是64M;
  • **–ulimit 😗*Ulimit配置。
  • **–squash 😗*将 Dockerfile 中所有的操作压缩为一层。
  • –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • –network: 默认 default。在构建期间设置RUN指令的网络模式

3.容器命令

# 查看正在运行容器列表
docker ps
# 查看所有容器 -----包含正在运行 和已停止的
docker ps -a
# 运行一个容器
# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行)  --name 给要运行的容器 起的名字  /bin/bash  交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash 
# 获取容器/镜像的元数据。
docker inspect NAME|ID 
# 查看容器中运行的进程信息,支持 ps 命令参数。
docker top [OPTIONS] CONTAINER [ps OPTIONS]
# 连接到正在运行中的容器。
docker attach [OPTIONS] CONTAINER
# 容器日志
docker logs [OPTIONS] CONTAINER
# 从容器创建一个新的镜像。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# 用于容器与主机之间的数据拷贝。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • –name=“nginx-lb”: 为容器指定一个名称;
  • –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • –dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h “mars”: 指定容器的hostname;
  • -e username=“ritchie”: 设置环境变量;
  • –env-file=[]: 从指定文件读入环境变量;
  • –cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
  • **-m 😗*设置容器使用内存最大值;
  • –net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • –link=[]: 添加链接到另一个容器;
  • –expose=[]: 开放一个端口或一组端口;
  • –volume , -v: 绑定一个卷

Docker 容器的数据卷

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷

作用

  • 容器数据持久化
  • 外部机器和容器简介通信
  • 容器之间数据交换

配置

docker run -v 宿主机的目录:容器内目录

目录必须是绝对路径、如果目录不存在会自动创建、可挂载多个数据卷

数据卷容器

多个容器挂载同一个数据卷,数据卷容器

docker run -it --name=c3 -v /volume centos:7 /bin/bash

docker run -it --name=c1 -v /volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 -v /volumes-from c3 centos:7 /bin/bash

Dockerfile

docker 镜像原理

  • docker 镜像是由特殊的文件系统叠加而成的
  • 最底端是bootfs,并使用宿主机的bootfs
  • 第二层是root文件系统rootfs,称为base image
  • 再往上叠加其他的镜像文件

**统一文件系统(Union FS)**技术能够将不同的层整合成一个文件系统,提供了一个统一的视角隐藏了多层的存在,一个镜像可以放在另一个镜像的上面,位于下面的镜像成为父镜像,最底部的镜像成为基础镜像

  • 从一个镜像启动容器时,Docker 会在最顶层加载一个读写文件系统作为容器

Dockerfile概念

Dockerfile 包含一条一条的指令的文本文件

关键字作用备注
FROM指定父镜像指定dockerfile基于那个image构建
MAINTAINER作者信息用来标明这个dockerfile谁写的
LABEL标签用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN执行命令执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD容器启动命令提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV环境变量指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG构建参数构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME定义外部可以挂载的数据卷指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE暴露端口定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER指定执行用户指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK健康检查指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL发送信号量到宿主机该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

docker compose

服务编排的工作,拉取镜像、创建容器、管理容器等

服务编排:按照一定的业务规则批量管理容器

docker compose步骤

  1. 利用Dockerfile 定义运行环境的镜像
  2. 使用docker-compose.yml文件定义应用的各个服务
  3. 运行docker-compose up 启动应用
安装Docker Compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version
卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
使用docker compose编排nginx+springboot项目
  1. 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
  1. 编写 docker-compose.yml 文件
version: '3'
services:
  nginx:
   image: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"
  1. 创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
  1. 在./nginx/conf.d目录下 编写itheima.conf文件
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }
   
}
  1. 在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
  1. 测试访问
http://192.168.149.135/hello

docker 私有仓库

私有仓库搭建
# 1、拉取私有仓库镜像 
docker pull registry
# 2、启动私有仓库容器 
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改daemon.json   
vim /etc/docker/daemon.json    
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip 
{"insecure-registries":["私有仓库服务器ip:5000"]} 
# 5、重启docker 服务 
systemctl restart docker
docker start registry

将镜像上传至私有仓库
# 1、标记镜像为私有仓库的镜像     
docker tag centos:7 私有仓库服务器IP:5000/centos:7
 
# 2、上传标记的镜像     
docker push 私有仓库服务器IP:5000/centos:7

从私有仓库拉取镜像
#拉取镜像 
docker pull 私有仓库服务器ip:5000/centos:7

Docker 与 传统虚拟机

相同:

容器和虚拟机具有相同的资源隔离分配优势

不同:

容器虚拟化的是操作系统,虚拟机虚拟化的是操作硬件

传统虚拟机可以运行不同的操作系统,容器只能运行同一类型的操作系统


微信 公众号 搜索 Brillint技术圈 回复 “文章” 查看往期技术话题
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值