【Docker】容器化技术入门学习笔记

Docker容器化技术入门学习笔记

    • 前言
    • 什么是容器
    • Docker容器与虚拟机的区别
    • 安装Docker
    • Docker服务相关命令
    • Docker镜像相关命令
    • Docker容器相关命令
    • 数据卷
      • 数据卷的概念
      • 数据卷的作用
      • 如何设置容器的数据卷
    • 数据卷容器
      • 如何配置数据卷容器
    • Docker应用部署
      • docker部署MySQL
        • 步骤
        • 具体操作
    • Dockerfile
      • Docker镜像原理
      • Docker镜像制作
        • 容器转为镜像
        • Dockerfile
          • dockerfile概念
          • dockerfile关键字
          • 示例
    • Docker服务编排
      • 概念
      • Docker Compose
        • 1、安装Docker Compose
        • 2、如何卸载Docker Compose
        • 3、使用docker compose编排nginx+springboot项目
    • Docker私有仓库
      • 1、私有仓库搭建
      • 2、将镜像上传至私有仓库
      • 3、 从私有仓库拉取镜像

前言

【Docker】容器化技术入门学习笔记_第1张图片

本笔记是作者学习【黑马Docker容器化技术】所做的笔记。

Docker是一种容器技术,它解决了软件跨环境迁移的问题。

docker相当于静态环境,避免因为外部主机本身的区别,或是没有安装某些软件、库,或是环境变量的设置等情况,导致程序无法运行。

docker依赖linux内核,只能在linux下使用,Windows用的话需要安装linux虚拟机,在虚拟机上运行。

docker用于抹除Ubuntu、centos这些linux发行版之间的区别。

docker会打包需要用到的东西,比如python、库等,作为一个镜像,通过这个镜像创建容器,程序就可以运行在这个容器里。

什么是容器

容器就是将软件打包成标准化单元,以用于开发、交付和部署。

  • 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。

  • 容器化软件在任何环境中都能够始终如一地运行。

  • 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

【Docker】容器化技术入门学习笔记_第2张图片

Docker容器与虚拟机的区别

相同点:

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

不同点:

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

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

我们列一个表格来进一步区别容器和虚拟机。

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般是几十个

容器的基本虚拟原理图:

【Docker】容器化技术入门学习笔记_第3张图片

虚拟机的基本虚拟原理图:

【Docker】容器化技术入门学习笔记_第4张图片

安装Docker

Linux下安装命令:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

Docker服务相关命令

centOS系统下

  • 启动docker服务

    systemctl start docker
    
  • 停止docker服务

    systemctl stop docker
    
  • 重启docker服务

    systemctl restart docker
    
  • 查看docker服务状态

    systemctl status docker
    
  • 开机启动docker服务

    systemctl enable docker
    

Docker镜像相关命令

  • 查看本地镜像

    docker images
    -q  # 仅查看镜像ID
    
  • 搜索远程仓库镜像

    docker search [搜索内容]
    

    官方镜像仓库网站:Docker Hub

  • 拉取远程仓库镜像

    docker pull [镜像名称](:版本号)
    # 不写版本号默认下载最新版
    
  • 删除本地镜像

    docker rmi [镜像ID]/[镜像名称:版本号]
    # rmi:rm->remove,i->image
    
    docker rmi `docker images -q`
    # 删除所有本地镜像,嵌套命令
    

Docker容器相关命令

  • 查看容器

    docker ps  # 查看目前正在运行的容器
    
    -a  # 查看所有容器
    -q  # 仅查看容器ID
    
  • 创建并启动容器

    docker run [参数] --name=[容器名字] [镜像名称]:版本号 [进入容器的初始化指令]
    
    -i  # 保持运行。通常与-t同时使用。容器如果没有客户端连接,便会自动关闭,而加了-i参数,则该容器可一直保持运行状态。
    -t  # 给容器分配一个伪终端,便于输入命令。通常与-i同时使用。
    -d  # 创建容器后运行在后台,在退出容器后不会自动关闭容器。
    -p [宿主机端口]:[容器端口]  # 容器端口映射
    -v 宿主机目录:容器内目录  # 为容器挂载数据卷
    --name  # 为创建的容器命名。
    
    -it创建的容器一般称为交互式容器
    -id创建的容器一般称为守护式容器
    
    eg: docker run -it --name=ct7 centos:7 /bin/bash
    

    -it参数创建容器,创建完成之后会自动进入容器,并且在退出容器后会自动关闭容器。

    -id参数创建容器,创建完成之后不会自动进入容器,需要手动进入容器,并且在退出容器后不会自动关闭容器。

  • 退出容器

    exit
    # 退出容器交互界面
    
  • 进入容器

    docker exec [参数] [容器名称] [进入容器的初始化命令]
    -t  # 给容器分配一个伪终端,便于输入命令。
    
    # 使用该命令进入容器并退出容器后,容器不会被自动关闭。
    
  • 启动容器

    docker start [容器名称]
    # 启动创建并启动并停止后的容器
    
  • 停止容器

    docker stop [容器名称]
    
  • 删除容器

    docker rm [容器ID]/[容器名称]
    
    docker rm `docker ps -aq`
    # 删除所有容器。当前正在运行的容器不能被删除。
    
  • 查看容器信息

    docker inspect [容器名称]
    

数据卷

思考一些问题

  • docker容器删除后,在容器中产生的数据会随之删除。

    如一个MySQL容器,其中包含的数据表在容器被删除之后会随之删除。

  • docker容器和外部主机之间不可以直接交换文件。

  • 同一宿主机内部的容器之间如何进行数据交换?

数据卷的概念

  • 数据卷是宿主主机中的一个目录。

  • 当容器目录和数据卷目录绑定后(即挂载),任何一方的文件修改会立即同步。

  • 一个数据卷可以被多个容器同时挂载。即可解决同一宿主机内部容器间的数据交换。

  • 一个容器也可以被多个数据卷同时挂载。

数据卷的作用

  • 实现容器数据持久化
  • 实现外部主机与容器间接通信
  • 实现容器之间的数据交换

如何设置容器的数据卷

在容器创建命令中,加入参数-v即可为容器挂载数据卷

docker run ... -v 宿主机目录:容器内目录 ...
# 为容器挂载数据卷

注意:

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

数据卷容器

创建一个容器,挂载一个目录,让其他容器可以继承自该容器的数据卷。

如何配置数据卷容器

1、创建并启动c3数据卷容器,使用-v参数设置其数据卷。

docker run -it --name=c3 -v /volume centos:7
// 此处未指明数据卷的宿主机目录,docker将会为我们自动创建一个宿主机目录

2、创建并启动c1、c2容器,使用--volumes-from参数挂载到数据卷容器上

docker run -it --name=c1 --volumes-from c3 centos:7

docker run -it --name=c2 --volumes-from c4 centos:7

Docker应用部署

在没有docker的时候,如果我们要在服务器上部署MySQL数据库,需要先安装好MySQL,然后再进行初始化以及各种配置,比较繁琐。而通过Docker来部署MySQL的话,操作将会非常简洁。同样的,通过docker来部署其他应用也会简单许多。

docker部署MySQL

步骤

1、搜索MySQL镜像

2、拉取MySQL镜像

3、创建容器

4、即可开始操作容器中的MySQL

具体操作

  1. 搜索mysql镜像
docker search mysql
  1. 拉取mysql镜像
docker pull mysql:5.6
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
  • 参数说明:
    • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    • **-e MYSQL_ROOT_PASSWORD=123456:**初始化 root 用户的密码。
  1. 进入容器,操作mysql
docker exec –it c_mysql /bin/bash

Dockerfile

思考:

  • Docker镜像的本质是什么?
  • Docker中一个centos镜像只要200mb,而一个centos操作系统的iso文件却要几个g?
  • Docker中一个tomcat镜像要500mb,而一个tomcat安装包只要70+mb?

Docker镜像原理

  • Docker镜像是由特殊的文件系统叠加而成

  • 最底端是 bootfs,并使用宿主机的bootfs(内核)

  • 第二层是 root文件系统rootfs,称为base image

  • 然后再往上可以叠加其他的镜像文件

  • 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。

  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
    【Docker】容器化技术入门学习笔记_第5张图片

Docker镜像制作

容器转为镜像

docker commit [容器id] [新镜像名称]:[版本号]
# 将容器转为镜像

注意:commit生成的新镜像中,并不包含原容器挂载的数据卷中的文件。可以在启动容器后手动挂载数据卷。

docker save -o [压缩文件名称] [镜像名称]:[版本号]
docker load –i [压缩文件名称]

【Docker】容器化技术入门学习笔记_第6张图片

Dockerfile

dockerfile概念
  • Dockerfile 是一个文本文件

  • 包含了一条条的指令

  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境

  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过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
示例

需求

自定义centos7镜像。要求:

  1. 默认登录路径为 /usr

  2. 可以使用vim

实现步骤

①定义父镜像:FROM centos:7

②定义作者信息:MAINTAINER zibesun <邮箱>

③执行安装vim命令: RUN yum install -y vim

④定义默认的工作目录:WORKDIR /usr

⑤定义容器启动执行的命令:CMD /bin/bash

⑥通过dockerfile构建镜像命令:

# cd到Dockerfile所在目录
# docker build -t mycentos7:1.0 .
-t参数:指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

最终dockerfile文件如下

FROM centos:7
MAINTAINER zibesun 

RUN yum install -y vim
WORKDIR /usr

CMD /bin/bash

Docker服务编排

概念

微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。

例如:

  • 要从Dockerfile build image 或者去dockerhub拉取image

  • 要创建多个container

  • 要管理这些container(启动停止删除)

docker服务编排可以按照一定的业务规则批量管理容器。

Docker Compose

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

当然现在更主流的容器编排技术是kubernetes,也就是k8s,在此先不做过多介绍,后面我可能会单独写一篇文章来讲k8s。

使用步骤:

1、利用 Dockerfile 定义运行环境镜像

2、使用 docker-compose.yml 定义组成应用的各服务

3、运行 docker-compose up 启动应用

【Docker】容器化技术入门学习笔记_第7张图片

1、安装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

2、如何卸载Docker Compose

# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

3、使用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、私有仓库搭建

# 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

2、将镜像上传至私有仓库

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

3、 从私有仓库拉取镜像

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

你可能感兴趣的:(容器技术,docker,学习,容器)