Docker学习笔记

目录

Docker概念

docker安装

docker架构

Docker命令

Docker服务命令

Docker镜像命令

Docker容器命令

Docker数据卷

数据卷概念

数据卷的作用

配置数据卷

Docker应用部署

Dockerfile

Docker镜像原理

docker镜像的制作

容器转镜像

dockerfile

制作centos镜像

Dockerfile关键字

Docker服务编排

服务编排

dockerCompose

安装dockerCompose

Docker私有仓库

搭建私有仓库

上传私有仓库

从私有仓库拉去镜像

Docker和虚拟机的比较

相同

不同


Docker概念

  • docker是开源的应用容器引擎

  • docker可以让开发者将应用及其依赖包打包到一个可移植轻量的容器中,发布到任何的Linux机器上

  • docker使用沙箱机制,互相隔离;性能高,可以快速启动,解决了软件跨环境部署的问题

docker安装

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 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
​
4. 安装docker,出现输入的界面都按 y
    yum install -y docker-ce
​
5. 查看docker版本,验证是否成功
    docker -v
6. 添加阿里云加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://q4s3bctf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
​
ps:有可能遇到yum没法用,可以按文章内容设置http://t.csdn.cn/EfTiR
大致步骤是
#进入配置文件夹
cd /etc/yum.repos.d/
#删除旧的配置文件
rm *.repo
#输入“y”回车确认
执行wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
命令
之后yum makecache
ps2:有可能遇到Cannot prepare internal mirrorlist: No URLs in mirrorlist
执行以下两个命令
sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
sudo sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
ps3:遇到了Failed to start docker.service: Access denied最后
kill -TERM 1恢复正常 #原因是重新加载了守护线程所以systemctl重新工作

docker架构

  • 客户端,核心,仓库三部分组成;其中核心有镜像和容器,仓库有中心仓库和私服

  • 镜像:Docker镜像(image),相当于一个完整的root文件系统

  • 容器:镜像和容器就像Java中的类和对象,镜像是静态的定义,而容器是镜像运行的实体,可以创建,启动,暂停,删除,停止等操作

  • 仓库:可以看做一个代码控制中心,用来存储镜像

  • 去阿里云找个docker加速器

Docker命令

Docker服务命令

systemctl start docker    #启动docker命令
systemctl stop docker     #停止docker命令
systemctl restart docker  #重启docker
systemctl enable docker   #开机自启
systemctl stauts docker   #查看docker状态

Docker镜像命令

docker images         #查看本地所有镜像
docker images -q      #查看所有镜像的id
docker search redis   #查看网络中有没有redis镜像
docker pull redis     #获取想要的镜像,不写版本就是默认的,如果指定要去官网(hub.docker.com)查看有哪些版本,不能乱写                           例如redis:6
docker rmi redis id   #删除镜像,根据id删除,或者根据镜像名称:版本;可以结合`-q`命令删除所有镜像

Docker容器命令

  • 查看命令

docker ps      #查看正在运行的容器
docker ps -a   #查看所有的容器 status中up表明正在运行,exit表明已经停止
  • 创建启动命令

docker run 参数
#-i 表示保持运行,配合t使用,一般-it进入运行的容器,退出后容器自动关闭;又叫交互式容器
#-d 表示后台运行使用docker exec进入容器退出后容器不会关闭;又叫守护式容器
docker exec  需要两个参数 -it /bin/bash
#docker exec -it c1 /bin/bash
#--name 为创建的docker起个别名
  • 启动,停止,暂停,删除命令

#容器(可以是容器id也可以是创建时候的别名)
docker stop 容器     #停止容器
docker start 容器    #启动容器
docker rm 容器       #指定删除容器,若容器在运行删不掉;可以在rm后面加docker ps -aq把所有的容器删除
docker inspect 容器  #可以查看容器的信息

Docker数据卷

数据卷概念

  • 外部机器-->宿主机-->容器;容器和外部机器是不通的

  • 数据卷就是宿主机的一个目录或者文件

  • 当数据卷和容器目录绑定后对方的修改会立即可见,也就是说在宿主机或者容器做了修改,这两个绑定的目录中的内容是同时修改的

  • 一个数据卷可以被多个容器挂载;一个容器也可以挂载多个数据卷

数据卷的作用

  • 实现了docker的数据持久化;因为如果不绑定数据卷,那么在容器删除后,docker的数据就会丢失;而有了数据卷,就实现了数据的持久化

  • 是外部机器和容器间可以通信;容器和外部机器是不通的,但是可以通过数据卷来传递

  • 可以实现容器间数据交换;因为容器时互相隔离的,那么可以采用多个容器挂载同一个数据卷来实现容间数据交互

配置数据卷

  • 在创建容器时添加 -v参数来绑定数据卷

docker run -it --name=c2 -v /root/data:/root/data_container centos:7
# 目录必须使用绝对路径; 两个目录中间使用:分割,并且:前后不能有空格;可以挂载多个数据卷
# 为了方便操作可以在命令后面 \ 表示还没输入完继续输入;

配置数据卷容器

  • 现在有三个容器c1,c2,c3绑定数据卷的时候,c3和宿主机绑定,之后c1,c2使用 --volumes-from c3 和c3绑定这样这三个容器和宿主机就可以互相交互了

  • 其实我觉得和123分别和宿主机绑定没啥区别,因为12其实里面的source目录就是宿主机的目录

Docker应用部署

  • 部署mysql应用,因为外部是无法访问容器的,因此可以使用端口映射的机制-p来将宿主机的端口映射到容器中,这样将来外部机器访问宿主机的ip端口就是访问容器中的端口了

  • #拉去mysql的镜像,之后宿主机创建一个mysql的目录;$PWD是获取路径
    #-p 端口映射  -e设置密码
    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
  • 其他应用的部署也都是类似的

    1. 拉取镜像

    2. 创建宿主机目录,准备文件

    3. 创建容器,-p映射端口,-v映射目录;镜像名称:版本号

Dockerfile

Docker镜像原理

  • docker镜像是由特殊的文件系统叠加而成,最底层是bootfs是宿主机的bootfs,第二层是rootfs在往上是其他的镜像叠加

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

  • 一个镜像可以放在另一个镜像的上面,下面的镜像就成为父镜像

  • 基础镜像都是可以复用的,这也是为什么centos操作系统几个G而centos镜像只有200M的原因

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

docker镜像的制作

  • 有两种方式一种是把容器转成镜像;一种是使用dockerfile(推荐)

容器转镜像

  • #将容器转成镜像
    docker commit 容器id 镜像名称:版本号
    #镜像是不可以传输的,所以将镜像压缩传输,-o就是output
    docker save -o 压缩文件名称:版本号
    #将压缩包还原成镜像,
    docker load -i 压缩文件名称
    #注意:在压缩传输的时候,挂载的文件也就是数据卷中的文件是不会打包到镜像的,需要重新建立连接

dockerfile

  • dockerfile就是文本文件,包含了一条条指令,每一条指令构建一层,基于基础镜像,最后构建出新的镜像

  • 抄就行了,参数太多了记不住的还是hub.docker.com找个网址

  • 例如将boot项目部署并连接数据库,将boot项目的配置文件的连接ip由localhost改成mysql容器映射的ip端口,之后将boot项目打包,编写dockerfile文件定义镜像,之后基于该镜像启动容器并映射暴露端口,之后直接访问找个容器就好了

制作centos镜像

  • 随便创建一个目录,之后定义一个文件,在里面写一下内容

  1. 定义父镜像:FROM centos:7

  2. 定义作者信息:MAINTAINER crisp077 www.crisp077.xyz

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

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

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

  • docker build -f dockerfile文件路径 -t 镜像名称:版本 .

    • -f指定文件路径,-t指定自定义的镜像名称,. 代表将来的取值路径

Dockerfile关键字

关键字作用备注
FROM指定父镜像指定dockerfile基于哪个images构建
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 的时候添加文件到iamge 中,不仅仅局限于当前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 ENTRYPOINT执行的时候的用户
HEALTHCHECK健康检查指定监测当前容器的健康测试的命令 基本上没有 因为很多时候 应用本身由健康监测机制
ONBUILD触发器当存在ONBUILD 关键字的镜像作为基础镜像的时候 当执行FROM 完成之后 会执行ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL发送信息量到宿主机该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

Docker服务编排

服务编排

  • 在微服务的架构中有许多的微服务,每个微服务又有许多的实例,所以会有很多的容器,如果手动维护工作量太大

dockerCompose

  • 是一个编排多容器分布式部署的工具,包括了容器的启动暂停等等

    • 利用dockerfile定义运行环境的镜像

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

    • 利用docker-compose up命令启动应用

安装dockerCompose

#下载
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#添加执行权限
chmod +x /usr/local/bin/docker-compose
#验证是否安装成功
docker-compose -v
#卸载
rm /usr/local/bin/docker-compose

实例

使用docker compose编排nginx+springboot项目

  • 创建docker-compose目录

mkdir ~/docker-compose
cd ~/docker-compose
  • 编写docker-compose.yml文件

version: '3'
services:
  nginx:
   iamge: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
   app:
     image: app
     expose:
       - "8080"
  • 创建./nginx/conf.d目录

mkdir -p ./nginx/conf.d
#在./nginx/conf.d目录下编写crisp.conf文件
server {
    listen 80;
    acess_log off;
    
    location / {
        proxy_pass https://app:8080;
    }
    
}
  • 在docker-compose目录下启动

docker-compose up

Docker私有仓库

搭建私有仓库

  • docker pull registry拉去私有仓库镜像

  • 启动私有仓库镜像 docker run -id --name=registry -p 5000:5000 registry

  • 打开浏览器,输入地址http://私有仓库服务器ip:5000/v2/_catalog看到{"repositories":[]}表示私有仓库搭建成功

  • 信任私有仓库

vim /etc/docker/daemon.json
#此步用于让docker信任私有仓库地址
#注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries": ["私有仓库服务器ip:5000"]}

上传私有仓库

#标记镜像为私有镜像,centos:7就是本地镜像名:版本;/centos:7就是上传私库后镜像名称:版本
docker tag centos:7 私有仓库服务器ip:5000/centos:7
#将私有镜像上传
docker push 私有仓库服务器ip:5000/centos:7

从私有仓库拉去镜像

#和网络拉去镜像一样的不过前面加个ip端口
docker pull 私有仓库服务器ip:5000/centos:7

Docker和虚拟机的比较

相同

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

不同

  • 虚拟机是共享宿主机的硬件,容器是共享软件

  • 虚拟机可以装不同的操作系统,容器只能是宿主机的操作系统

特性容器虚拟机
启动秒级分钟级
性能接近原生弱于
系统支持两单机支持上千个容器一般几十个

未解之谜

??????如果一个容器已经存在了如何挂载数据卷???????

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值