Doker学习

发布时间 2023-03-30 21:34:10作者: 假装空白

一、安装

官网:www.docker.com

安装步骤(CenteOS 7)
  1. yum包更新到最新

    yum update
    
  2. 安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

    # -y:意思是需要输入Y运行下一步的自动帮我们键入Y
    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架构

架构图

架构图

解析
  • 镜像(Image):Docker镜像,相当于是一个root文件系统。比如官方镜像Ubuntu:16.04 就包含了完整的一套Ubuntu16.01最小系统的root文件系统。
  • 容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像时静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可以看成是一个代码控制中心,用来保存镜像。

配置Docker镜像加速器

​ 从docker hub(https://hub.docker.com)下载docker镜像,太慢,一般都会配置镜像加速器:

  • USTC
  • 阿里云
  • 腾讯云
  • 。。。。。。
以阿里云为教程配置
  1. 登录阿里云
  2. 搜索【容器镜像服务】
  3. 选择【镜像加速器】
  4. 选择需要的配置代码复制粘贴即可
  5. 查看是否配置成功
# 查看配置文件是否配置加速器地址成功
cat /etc/docker/daemon.json

三、Docker命令

1. Docker服务相关命令

  1. 启动Docker服务

    systemctl start docker
    
  2. 停止Docker服务

    systemctl stop docker
    
  3. 重启Docker服务

    systemctl restart docker
    
  4. 查看Docker服务状态

    systemctl status docker
    

2. Docker镜像相关命令

  1. 查看镜像:查看本地所有的镜像

    docker images
    # 查看所有镜像的ID
    docker images -q
    
  2. 搜索镜像:从网络中查找需要的镜像

    docker search <镜像名称>
    
  3. 拉取镜像:从Docker仓库下载镜像到本地

    • 镜像名称格式:名称:版本号
    • 如果版本号不指定则获取最新的版本
    • 如果不知道镜像版本,可以去 docker hub 搜索对应镜像查看
    docker pull <镜像名称>[:版本号]
    
  4. 删除镜像:删除本地Docker镜像

    # rmi:remove image
    # 按ID删除
    docker rmi <id>
    # 按镜像名称和版本号删除
    docker rmi <镜像名称:版本号>
    # 删除全部镜像,删除所有查询到的镜像ID
    docker rmi `docker images -q`
    

3. Docker容器相关命令

  1. 查看容器

    # 查看正在运行的容器
    docker ps
    # 查看所有容器
    docker ps -a
    
  2. 创建并启动容器

    docker run <参数>
    # 例子1: docker run -it --name=<容器名称> <镜像名称><:版本号> [/bin/bash]
    # /bin/bash 进入终端
    docker run -it --name=c1 centos:7 /bin/bash
    # 例子2:
    # 创建容器
    docker run -id --name=c2 centos:7
    # 进入容器: docker exec -it <容器名称> /bin/bash
    docker exec -it c2 /bin/bash
    

    参数说明:

    • -i:保持容器运行。通常与【-t】同时使用。加入【it】两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。

    • -t:为容器重新分配一个伪输入终端,通常与【-i】同时使用。

      # 退出终端命令
      exit
      
    • -d:以守护(后台)模式运行容器。创建一个容器,在后台运行,需要使用docker.exe进入容器。推出后,容器不会关闭。

    • -it:创建的容器一般称为交互容器

    • -id:创建的容器一般称为守护式容器

    • --name:为创建的容器命名

  3. 启动容器

    docker start <容器名称>
    
  4. 停止容器

    docker stop <容器名称>
    
  5. 删除容器:未停止容器无法删除

    # 按名称删除
    docker rm <容器名称>
    # 按ID删除
    docker rm <容器ID>
    # 按ID删除所有容器
    docker rm `docker ps -aq`
    # 查看所有容器ID
    docker ps -aq
    
  6. 查看容器信息

    docker inspect <容器名称>
    

四、Docker容器的数据卷

概念及作用

数据卷

概念

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,修改会立即同步(与共享文件夹/目录类似)
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以挂载多个数据卷

作用

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 同期之间数据交换

配置数据卷

  • 创建启动容器时,使用-v参数设置数据卷,需要挂载多个就写多个 -v

    ​ 注意:

    1. 目录必须绝对路径
    2. 如果目录不存在会自动创建
    3. 可以挂载多个数据卷,写多个 -v
    4. 宿主目录可不写,但会自动分配生成创建目录
docker run ... -v 宿主机目录(文件):容器内目录(文件)...
# 例子
docker run -it --name=c1 -v /root/data:/root/data_container center:7 /bin/bash

配置数据卷容器

数据卷容器

概念

  1. 创建一个容器,挂载一个目录,让其他容器继承该容器(--volume-from)
  2. 通过简单的方式实现数据卷配置
  3. 其原理都是挂载到数据卷,即使数据卷容器挂了,也是可以使用
配置
  1. 创建启动c3数据卷容器

    docker run --name=c3 -v /volume centos:7 /bin/bash
    
  2. 创建启动c1、c2容器,使用--volumes-from 参数 设置数据卷

    #  创建启动c1容器,并挂载c3数据卷容器
    docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
    #  创建启动c2容器,并挂载c3数据卷容器
    docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
    
  3. 查看容器细节,查看数据卷挂载情况

    docker inspect c1
    

    HostConfig:

    • Binds :可看到挂载信息

    Mounts:

    • Source:挂载宿主机目录
    • Destination:容器挂载目录

小结

  1. 数据卷概念
    • 宿主机的一个文件或目录
  2. 数据卷作用
    • 容器数据持久化
    • 客户端和容器数据交换
    • 容器间数据交换
  3. 数据卷容器
    • 创建一个容器,挂载一个目录,让其他容器继承该容器(--volume-from)
    • 通过简单的方式实现数据卷配置
    • 其原理都是挂载到数据卷,即使数据卷容器挂了,也是可以使用

五、Docker应用部署

部署Mysql

​ 因容器与外部机器不能通信,只能通过宿主机进行容器端口映射进行通信。

​ 需要注意宿主机器的防火墙配置,需要开放相应端口外部机器才能访问。

容器通信

步骤

  1. 搜索Mysql镜像

    docker search mysql
    
  2. 拉取Mysql镜像

    docker pull mysql:5.6
    
  3. 创建容器,设置端口映射,目录映射

    # 在/root目录下创建muysql目录用于存储mysql数据信息
    mkdir ~/mysql
    cd ~/mysql
    
    # \:表示未输入完全,进入下一行接着输入
    docker run -id \
    # 端口映射,将容器的3306端口映射到宿主机的3307端口一般不需要修改直接使用原端口
    -p 3307:3306 \
    # 设置容器名称
    --name=c_mysql \
    # 挂载文件,$PWD的意思是获取当前所在路径
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    # 设置mysql密码
    -e MYSQL_ROOT_PASSWORD=123456 \
    # 启动运行的镜像名称和版本号
    mysql:5.6
    
  4. 操作容器中的Mysql

部署Tomcat

步骤

  1. 搜索镜像

    docker search tomcat
    
  2. 拉取镜像

    docker pull tomcat
    
  3. 创建容器,设置端口映射,目录映射

    # 在/root目录下创建tomcat目录用于存储tomcat数据信息
    mkdir ~/tomcat
    cd ~/tomcat
    
    docker run -id --name=c_tomcat \
    -p 8080:8080
    -v $PWD:/usr/local/tomcat/webapps \
    tomcat
    
  4. 外部机器访问Tomcat

部署Nginx

步骤

  1. 搜索镜像

    docker search nginx
    
  2. 拉取镜像

    docker pull nginx
    
  3. 创建容器,设置端口映射、目录映射,需要注意,Nginx需要在宿主机中创建nginx.conf配置文件

    mkdir ~/nginx
    cd ~/nginx
    mkdir conf
    cd conf
    # 在nginx/conf/下创建nginx.conf配置文件
    vim nginx.conf
    
    # 一下内容未nginx.conf的配置文件信息
    # 此处未贴出,可直接下载nginx后复制conf文件配置内容到此处
    
    docker run -id --name=c_nginx \
    -p 80:80 \
    -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v $PWD/logs:/var/log/nginx \
    -v $PWD/html:/usr/share/nginx/html \
    nginx
    
  4. 外部机器访问Nginx

部署Redis

步骤

  1. 搜索镜像

    docker search redis
    
  2. 拉取镜像

    docker pull redis:5.0
    
  3. 创建容器,设置端口映射

    docker run -id --name=c_redis -p 6379:6379 redis:5.0
    
  4. 外部机器访问Redis

    # 外部机器客户端访问redis:redis-cli.exe -h <宿主机IP> -p <宿主映射端口>
    redis-cli.exe -h 192.168.149.135 -p 6379
    

六、Dockerfile

镜像原理

Linux系统组成

Linux系统组成

Tomcat镜像组成

Tomcat镜像组成

Docker镜像的本质

​ 就是一个分层文件系统。docker镜像是由特殊的文件系统叠加而成。

Docker中一个centos镜像为什么只有200MB而一个操作系统的ISO文件要几个G

​ Centos的ISO镜像文件包含了bootfs和rootfs,而docker的centos镜像复用了操作系统的bootfs,只有rootfs和其他镜像层,所以更小。

​ 也就是说内核是共用的。

Docker中一个Tomcat镜像有500MB而一个Tomcat安装包只有70MB

​ 由于docker中镜像是分层的,tomcat虽然只有70MB,但是他需要依赖父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小是500MB

镜像制作

  1. 容器转换为镜像

    # 容器转镜像
    docker commit <容器ID> <新镜像名称:新版本号>
    # 镜像转压缩包
    docker save -o <压缩文件名称> <新创建的镜像名称:版本号>
    # 压缩包转镜像
    docker load -i <压缩文件名称>
    

镜像制作图

概念

概念
  • Dockerfile是一个文本文件
  • 包含了而一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像

dochub网址:https://hub.docker.com

关键字

都是大写

关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于哪个iamge构建,如果该镜像没有会自动下载,如果已有会直接使用镜像
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 环境变量
ARG 构建参数
VOLUME 定义外部可以挂载的数据卷 指定guild的image那些目录可以启动的时候挂载到文件系统中,启动容器的时候使用-v绑定,格式VOLUME ["目录"]
EXPOSE 暴露端口 定义容器运行的时候监听的端口,启动容器的使用-p来绑定暴露端口,格式:EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目录 指定容器内部的工作目录,如果没有创建则自动创建,如果指定/使用的时绝对地址,如果不是/开头那么是在上一条workdir的路径的相对路径
USER 指定执行用户
。。。。。。

案例

案例一

需求

自定义centos7镜像。要求:

  1. 默认登录路径为:/usr
  2. 可以使用vim(默认安装的centos没有vim)

步骤

  1. 创建文件
  2. 定义父镜像:FROM centos:7
  3. 定义作者信息:MAINTAINER itherma itherma@itheima.cn
  4. 执行安装vim命令:RUN yum install -y vim
  5. 定义默认的工作目录:WORKDIR /usr
FROM centos:7
MAINIAINER itherma <itherma@itheima.cn>

RUN yum install -y vim
WORKDIR /usr

CMD /bin/bash
docker build -f ./<文件名称> -t <镜像名称>:<版本号> .

案例二:

需求

​ dockerfile,发布springboot项目

步骤

  1. 项目打包
  2. 把包发送到宿主机器
  3. 创建文件:springboot_dockerfile
  4. 定义父镜像:FROM java:8
  5. 定义作者信息:MAINTAINER itherma itherma@itheima.cn
  6. 将jar包添加到容器:ADD springboot.jar app.jar=>ADD <包名> <创建镜像名称>
  7. 定义容器启动执行的命令:CMD java -jar app.jar
  8. 通过dockerfile构建镜像:docker build -f <dockerfile文件路径> -t <镜像名称:版本号>
FROM java:8
MAINTAINER itherma <itherma@itheima.cn>

ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar

CMD java -jar app.jar
  1. 运行镜像
  2. 端口映射
  3. 外部机器访问

七、Docker服务编排

服务编排概念

当部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。

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

Docker Compose概述

​ 一个编排多个容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。

  1. 利用Dockerfile定义运行环境镜像
  2. 使用docker-compose.yml定义组成应用的各服务
  3. 运行docker-compose up 启动应用

安装Docker Compose

一、安装Docker Compose

# Compose 目前已经完全支持Linux、Mac OS、Windows,在我们安装Compose之前,需要先安装Docker,下面我们一边一号的二进制包方式安装在Linux系统中。
curl -Lhttps://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
    
  2. 编写 docker-compose.yml文件

    version: '3'
    services:
    	# 自定义名称
    	nginx:
    		# image镜像名称
    		image: nginx
    		# 映射端口
    		ports:
    			- 80:80
    		# 链接镜像
            linkes:
            	- app
            # 数据卷挂载配置
            volumes:
            	- ./nginx/conf.d:/etc/nginx/conf.d
    	app:
    		image: app
    		# 暴露端口
    		expose:
    			- "8080"
    
  3. 创建./nginx/conf.d目录

    mkdir -p ./nginx/conf.d
    
  4. 在./nginx/conf.d目录下,编写itheima.conf文件,也就是nginx.conf配置文件内容

    server{
    	listen 80;
    	access-log off;
    	location / {
    		proxy_pase http://app:8080;
    	}
    }
    
  5. 在~/docker-compose目录下,使用docker-compose启动容器

    docker-compose up
    
  6. 测试访问

    http://192.168.149.135/hello
    

八、Docker私有仓库

一、私有仓库搭建

# 1.拉取私有仓库镜像
# 2.启动私有仓库容器
# 3.打开浏览器输入地址:http://私有仓库服务器IP:5000/v2/_catalog,看到{”repositories“:[]}表示私有仓库搭建成功
# 4.修改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

三、从私有仓库拉取镜像

九、Doker相关概念

docker容器虚拟化和传统虚拟机对比

  • 容器镜像时轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件在任何环境中都能够始终如一的运行
  • 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

对比

  • 相同
    • 容器和虚拟机具有相似的资源隔离和分配优势
  • 不同
    • 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件
    • 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统(因为核心复用的是宿主机核心)。