zoukankan      html  css  js  c++  java
  • docker入门

    第1章 docker的概述

    1.1 什么是docker

    1. Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源。
    2. Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等.由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率
    

    1.2 docker的组成部分

    1. docker是传统的CS架构分为docker client和docker server
    2. Docker客户端是Docker用户与Docker交互的主要方式,当您使用Docker命令行运行命令时,Docker客户端将这些命令发送给服务器端,服务端将执行这些命令。
    3. Docker命令使用Docker API,Docker客户端可以与多个服务端进行通信
    

    1.3 docker概念的引入

    如上图所示,一个宿主机上运行了多个容器,多个容器带来的一下问题怎么解决
    1.怎么样保证不同的容器之间有不同的文件系统,并且相互之间不影响
    2.一个docker主进程内的各个容器都是其子进程,怎么实现同一个主进程下不同的子进程?各个进程之间能相互访问数据吗?
    3.每个容器怎么解决IP及端口分配的问题
    4.每个容器要不要root?怎么解决账户重名的问题?
    

    1.4 namespace(命名空间)

    namespace是linux系统底层的概念,在内核层实现,即有一些不同类型的命名空间被部署在内核,各个docker容器运行在同一个docker主进程,并且共用同一个宿主机内核。各docker容器运行在宿主机的用户空间,每个容器都需要有类似虚拟机一样的相互隔离的运行空间,但是容器技术是在一个主进程内实现运行指定服务的运行环境。并且还可以保证宿主机的内核不受其它进程的干扰和影响!如文件系统空间,网络空间!目前主要通过以下技术来实现容器运行空间的相互隔离
    
    隔离类型 功能 内核版本
    Mount Namespace 用于隔离文件系统的挂载点 Linux 2.4.19
    UTS Namespace 用于隔离 HostName 和 DomianName Linux 2.6.19
    IPC Namespace 用于隔离进程间通信 Linux 2.6.19
    PID Namespace 用于隔离进程 ID Linux 2.6.24
    Network Namespace 用于隔离网络 Linux 2.6.29
    User Namespace 用于隔离用户和用户组 UID/GID Linux 3.8
    从上表可以看出,我们使用docker对版本也是有要求的,内核版本至少要用3.8(为了更好的使用docker,通常都是使用3.10+的内核)
    

    1.1 Mount Namespace

    每个容器都要有独立的根文件系统和独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境!即一个宿主机是Ubuntu系统,可以在里面运行一个Centos的运行环境,并且在容器里面运行一个Nginx服务。此Nginx运行的环境就是Centos系统的环境。但是在容器里面是不能访问宿主机资源的,宿主机是使用了chroot技术把容器锁定在一个指定的运行目录里面
    例如:/var/lib/containerd/io.containerd.runtime.v1.linux/moby/容器ID
    启动三个容器验证
    docker run -d --name="n1" nginx:1.14
    docker run -d --name="n2" nginx:1.14
    docker run -d --name="n3" nginx:1.14
    cd /var/lib/containerd/io.containerd.runtime.v1.linux/moby/
    ll
    total 0
    drwx--x--x 2 root root 52 May 21 19:30 53e162cac347a55f1feff49e81e67250f908741b6cab63ca7c2b554de1f6f5e5
    drwx--x--x 2 root root 52 May 21 19:30 e29fcbcd42727e0082400697fd9e7401a5c4673e31258f260507293d30f0a6f7
    drwx--x--x 2 root root 52 May 21 19:30 ec9eb6a7402ca85253c200334be8034f757937a42a27c27d1700172914138254
    

    1.2 IPC Namespace

    一个容器内的进程间通信,允许一个容器的不同进程的数据访问,但是不能跨容器访问其它的容器
    

    1.3 UTS Namespace

    UTS Namespace包含了运行内核的名称,版本,底层体系结构类型等信息,用于系统标识,其中包含了HOSTNAME和DomianName,它使得一个容器拥有自己的hostname标识,这个主机标识独立于宿主机系统和其上的其他容器
    这里引出的问题,既然容器是没有内核的,为什么在centos上能够运行Ubuntu(Ubuntu系统的内核是要比centos的系统要新的)的环境且Ubuntu上也能使用ls等这样的命令
    1.官方会进行适配
    2.这样的命令其实就是二进制文件,只要Ubuntu和centos上该命令的二进制文件相同且CPU能够读取这个二进制文件,就能够使用了
    

    1.4 PID Namespace

    Linux系统中,有一个PID为1的进程,是其他所用进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程!多个容器的PID通过PID Namespace来隔离
    

    上图就是容器的PID和宿主机PID的关系
    

    1.5 cgroups资源限制

    控制组(cgroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等.只有控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。
    控制组技术最早是由Google的程序员在2006年提出,Linux内核自2.6.24开始支持。
    控制组可以提供对容器的内存,CPU,磁盘,IO等资源的限制和审计管理。
    

    第2章 docker的安装

    1.1 第一个里程:之前安装过docker先删掉

    yum remove docker docker-common docker-selinux docker-engine
    

    1.2 第二个里程:安装依赖

    yum install -y yum-utils device-mapper-persistent-data lvm2
    

    1.3 第三个里程:下载repo文件

    wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
    

    1.4 第四个里程: 把软件仓库地址替换为清华源

    sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
    yum makecache fast
    yum install docker-ce -y
    

    1.5 第五个里程: 启动docker

    systemctl start docker
    systemctl enable docker
    systemctl daemon-reload
    

    1.6第六个里程: 配置国内镜像加速

    cd /etc/docker/
    vim daemon.json
    {
        "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    systemctl daemon-reload
    systemctl restart docker
    

    1.7 docker info命令的详解

    Server:
     Containers: 4 #当前主机运行的容器总数
      Running: 1   #有几个是正在运行的
      Paused: 0    #有几个容器是暂停的
      Stopped: 3   #有几个容器是停止的
     Images: 2     #当前服务器的镜像数
     Server Version: 19.03.9  #服务端版本
     Storage Driver: overlay2 #正在使用的存储引擎
      Backing Filesystem: xfs #后端文件系统,即服务器的磁盘文件系统
      Supports d_type: true   #是否支持d_type(分层的功能)
      Native Overlay Diff: true #是否支持差异数据存储
     Logging Driver: json-file  #日志类型
     Cgroup Driver: cgroupfs    #Cgroup类型
     Plugins:  #插件
      Volume: local  #卷
      Network: bridge host ipvlan macvlan null overlay  #支持的网络类型
      Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog #支持的日志类型
     Swarm: inactive  #是否支持Swarm
     Runtimes: runc   #
     Default Runtime: runc
     Init Binary: docker-init
     containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
     runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
     init version: fec3683
     Security Options:
      seccomp
       Profile: default
     Kernel Version: 3.10.0-693.el7.x86_64 #宿主机内核版本
     Operating System: CentOS Linux 7 (Core) #宿主机操作系统
     OSType: linux #宿主机操作系统类型
     Architecture: x86_64 #宿主机架构
     CPUs: 1 #宿主机CPU数量
     Total Memory: 1.938GiB #宿主机总内存
     Name: docker #宿主机hosrname
     ID: HRW7:I23X:RFNF:A26S:NLT7:VJRF:DUW2:FF5H:VVXF:AQFX:SEDY:F77R
     Docker Root Dir: /var/lib/docker #宿主机数据保存目录(如果有需求可以挂载一个大的数据盘在此目录)
     Debug Mode: false
     Registry: https://index.docker.io/v1/ #默认进项仓库
     Labels: #标签
     Experimental: false #是否测试版
     Insecure Registries: #非安全的镜像仓库
      127.0.0.0/8
     Registry Mirrors:
      http://hub-mirror.c.163.com/
     Live Restore Enabled: false
    

    第3章 docker服务进程

    1.1 containerd进程的关系

    dockerd:被client直接访问,其父进程为宿主机的systemd守护进程
    docker-proxy: 实现容器的相互通信(实质就是维护iptables规则的),其父进程为containerd
    containerd: 被dockerd进程调用实现与runc交互
    containerd-shim: 真正运行容器的载体,其父进程为containerd
    

    1.2 容器的创建和管理过程

    1.dockerd通过grpc和containerd模块通信,dockerd和containerd通信的socket文件:/run/containerd/containerd.socket
    2.containerd在dockerd启动时就被启动了,然后containerd启动grpc请求监听,containerd处理grpc请求,根据请求作相应的动作!
    3.如果是创建容器,containerd会拉起一个containerd-shim的容器进程,并运行相应的创建动作
    4.container-shim被拉起后,start/exec/create拉起runC进程,通过exit、controt文件和containerd通信,通过父子进程的关系和SIGHLD(信号),监控容器中进程状态
    5.在整个容器生命周期中,containerd通过epoll监控容器文件,监控容器事件
    

    图解如下

    第4章 Docker的镜像基础管理

    1.1 搜索镜像

    docker search centos
    镜像选择建议:
    1) 优先选择官方
    2) 其次是stars数量多的
    

    1.2 下载镜像

    docker pull centos:7
    如果不指定版本,默认会下载最新的版本
    

    1.3 查看镜像列表

    docker image ls
    标识镜像唯一性的方法:
    1) REPOSITORY:TAG
    centos:7.5.1804 
    2) IMAGE ID (sha256:64位的号码,默认只截取12位)
    82f3b5f3c58
    1. 把截断的信息也显示出来   
    docker image ls --no-trunc
    

    1.4 只查看镜像ID

    docker image ls -q
    

    1.5 镜像详细信息查看

    docker image inspect nginx:latest    (镜像名字+标签的方式)
    docker image inspect 965ea09ff2eb     (直接用镜像的ID)
    

    1.6 导出镜像

    docker save centos:7 >/tmp/centos7.tar
    

    1.7 导入镜像

    docker load </tmp/centos7.tar 
    

    1.8 删除镜像

    docker rmi centos:7
    强制删除镜像
    docker rmi -f centos7
    -f: 强制删除
    

    1.9 删除所有镜像

    docker rmi $(docker images ls -q)
    

    1.10 给镜像重新打上标签

    docker image tag 775349758637 kk/ubuntu:v1
    

    第4章 容器的管理

    1.1 容器的分类

    容器可以分为2大类
    1. 交互式的容器
    2. 守护式的容器
    

    1.2 容器的应用场景

    1. 交互式的容器: 工具类: 开发,测试,临时性的任务(测试完以后直接删除掉可以加参数--rm)
    [root@docker01 ~]# docker container run -it --name="yf_centos7"  --rm 9f38484d220f
    2. 守护式容器: 服务(把容器里面的端口,映射到宿主机上)
    [root@docker01 ~]# docker run -d -p 8080:80 --name="oldguo_nginx_80" nginx:1.14
    

    1.3 交互式的容器

    [root@docker01 ~]# docker container run -it centos:7
    [root@docker01 ~]# docker container ls
    CONTAINER ID : 容器的唯一号码(自动生成的)
    NAMES: 容器的名字(可以自动,也可以手工指定)
    例子: 手工指定容器名启动
    [root@docker01 ~]# docker container run -it --name="yfc_centos7" centos:7
    [root@docker01 ~]# docker container ls
    

    1.4 守护式容器

    [root@docker01 ~]# docker run -d --name="yfc_nginx" nginx:1.14
    查询容器的详细信息:
    [root@docker01 ~]# docker container inspect yfc_nginx
    

    1.5 容器的启动和关闭

    守护式容器的关闭和启动
    [root@docker01 ~]# docker container stop 容器的名称
    [root@docker01 ~]# docker container start 容器的名称
    交互式的容器的关闭和启动
    [root@docker01 ~]# docker container stop 容器的名称
    [root@docker01 ~]# docker container start -i  容器的名称
    

    1.6 容器的连接方法

    1.子进程的方式登录(在已有工作容器中生成子进程,做登录.可以用于进行容器的调试,退出时也不会影响到当前容器)
    [root@docker01 ~]# docker container exec -it 容器的名称 /bin/bash
    2. 使用nsenter命令
    nsenter是通过PID进入容器,我们可以用docker inspect来获取容器的PID
    yum install util-linux #安装nesenter命令
    讲nesenter命令写入脚本调用
    vim docker_in.sh
    #!/bin/bash
    docker_in(){
       NAME_ID=$1
       PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
       nsenter -t ${PID} -m -u -i -n -p
    }
    docker_in $1
    给予脚本权限
    chmod +x docker_in.sh
    执行脚本
    sh docker_in.sh 容器的ID,就可以登录进去了
    

    1.7 容器的网络映射

    指定映射(docker通过调用docker-proxy会自动添加一条iptables规则来实现端口映射)
    -p hostPort:containerPort
    例子:[root@docker01 ~]# docker container run -d -p 8080:80 --name='n1' nginx:1.14
    -p ip:hostPort:containerPort
    例子:[root@docker01 ~]# docker container run -d -p 10.0.0.100:8081:80 --name='n2' nginx:1.14
    -P ip::containerPort(随机端口:32768-60999)
    例子:[root@docker01 ~]# docker container run -d -p 80 --name='n3' nginx:1.14
    -p 81:80 –p 443:443(一个容器里面跑多个服务,需要把多个服务的端口映射出来)
    例子:[root@docker01 ~]# docker container run -d -p 33060:3306 -p 2222:22 --name='n6' 镜像
    

    1.8 查看容器的日志

    [root@oldboy docker]# docker logs 容器的ID
    [root@oldboy docker]# docker logs -tf 容器的ID
    

    1.9 容器相关的命令整理

    1.1 查看当前正在运行的容器

    docker ps
    

    1.2 显示所有容器的信息(不管是运行的还是没有运行的)

    docker container ls –a 
    

    1.3 只显示正在运行的容器信息

    docker container ls
    

    1.4 启动一个容器并保持不退出并自定义命名

    docker run --name mycentos -it -d centos:7 /bin/bash
    

    1.5 进入一个容器里

    docker exec -it 容器ID /bin/bash
    

    1.6 停止一个容器

    docker stop 容器ID
    

    1.7 批量停止所有运行的容器

    docker  stop $(docker ps -q)
    

    1.8 批量删除所有的容器

    docker rm $(docker ps -qa)
    

    1.9 基于容器提交新镜像

    docker commit 容器ID 新镜像名称:版本号
    

    第5章 docker的数据卷实现持久化存储

    1.1 数据卷的引入

    在容器中,运行的服务,有时候我们可能需要改配置文件,首先想到的就是登录容器里面去修改,但是这样会显得很麻烦!
    解决思路:
    在宿主机把文件编写好,然后把编写好的文件直接拷贝到容器里面去
    

    1.2 手工交互数据

    [root@docker opt]# docker container cp index.html n1:/usr/share/nginx/html/ (拷贝宿主机的文件到容器里面去)
    [root@docker opt]# docker container cp n1:/usr/share/nginx/html/50x.html ./  (把容器里面的文件拷贝到宿主机上)
    但是这样修改还有一个问题,如果容器有很多,我们修改一次就要拷贝一次,这样也很麻烦
    解决思路:
    把宿主机编写好的文件实现与容器里面的文件相互关联,修改宿主机的文件就相当于修改容器里面的文件
    

    1.3 Volume实现宿主机和容器的数据共享

    语法: -v 宿主机目录:容器目录
    实现宿主机与容器的服务nginx服务数据共享
    第一个里程:宿主机创建目录
    mkdir /data
    第二个里程:创建容器并映射数据卷
    docker container run -d --name "nginx_2" -p 8081:80 -v /data/html:/usr/share/nginx/html nginx
    第三个里程:访问页面
    直接修改宿主机/data/html/index.html
    再次访问页面的时候,可以看到页面是修改的内容
    

    1.4 数据卷容器

    针对上面的把目录挂载到目录,有时候我们容器需要挂载的目录很多,容器也很多,这样也很麻烦,所有就有了数据卷容器的概念
    解决思路:
    把所有的数据卷做成一个容器,别的容器要用的时候,直接挂载这个容器就可以了
    (1)宿主机模拟数据目录
    mkdir -p /opt/Volume/a
    mkdir -p /opt/Volume/b
    touch /opt/Volume/a/a.txt
    touch /opt/Volume/b/b.txt
    (2)启动数据卷容器
    docker run -it  --name "nginx_volumes" -v /opt/Volume/a:/opt/a  -v /opt/Volume/b:/opt/b centos:7 /bin/bash
    ctrl p q
    (3)使用数据卷容器
    docker run -d  -p 8085:80 --volumes-from  nginx_volumes --name "n8085"  nginx
    docker run -d  -p 8086:80 --volumes-from  nginx_volumes --name "n8086"  nginx
    作用:  在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数卷容器进行统一管理
    

    第6章 dcoker镜像

    1.1 docker镜像制作的方式有2种

    1. 基于正在运行的的容器制作镜像(此种方式运用的场景很少)
       缺点: 后期要修改镜像里面的东西,需要先把镜像跑起来,进入容器里面进行修改,改完以后再次提交为镜像
    2. 基于dockfile文件制作镜像(主推的方式)
    

    1.2 Centos7系统sshd功能制作流程(基于正在运行的容器制作镜像)

    1.1 说明

    centos7的基础镜像是没有ssh的,为了方便管理容器,我们要为镜像做一个ssh的
    

    1.2 第一个里程: 下载基础的镜像(centos7.5)

    docker pull centos:7.5.1804
    

    1.3 第二个里程: 启动基础镜像

    docker run -it --name="centos7_sshd" centos:7.5.1804
    

    1.4 第三个里程: 替换yum源并安装软件

    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    

    1.5 第五个里程: 下载软件

    yum makecache fast && yum install openssh-server -y
    

    1.6 第六个里程: 初始化sshd服务(这里就是跟centos6区别)

    mkdir /var/run/sshd
    echo 'UseDNS no' >> /etc/ssh/sshd_config
    sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
    echo 'root:123456' | chpasswd
    /usr/bin/ssh-keygen -A
    

    1.7 第七个里程: 基于此时的容器制作镜像

    docker commit centos7_sshd centos7_sshd:v1
    centos7_sshd:容器的名字
    centos7_sshd:v1 新的镜像
    

    1.8 第八个里程: 用新的镜像,启动容器

    docker container run -d  --name=sshd_222  -p 222:22 centos7_sshd:v1 /usr/sbin/sshd -D
    

    1.9 第九个里程: 用远程连接工具连接宿主机的222端口

    此时用远程连接工具连接宿主机的222端口,就可以连接到容器进行管理了
    

    1.3 dockfile简介

    dockfile可以说是可以被docker程序释放的脚本,dockfile是由一条条命令组成的,每条命令对应linux下的一条命令,docker程序将这些docker指令翻译成真正的linux命令,dockfile有自己的书写方式和支持的命令,dcoker程序读取dockerfile并根据指令生成docker镜像,相比手动制作镜像的方式,dockfile更能直接的展示镜像是怎么产生的,有了写好的dockfile文件,当后期有某个镜像有额外的要求是,只要在之前的dockfile文件添加或者修改dockfile文件即可重新生成新的dockfile文件就可以了!避免了重复手动制作镜像的麻烦!
    

    1.4 dockfile常用指令的说明

    1.4.1 dockfile的前提

    1. 要为dockfile文件单独创建一个目录
    例如: mkdir /data
         cd /data
         vim Dockfile
    2. 编写Dockfile目录时,所需要传送到新的镜像里面的文件或者压缩包都要放在和Dockfile同一个目录中即/data/下
    3. 编写Dockfile时,切记惜字如金,因为dockfile在运行时,和shell脚本一样都是从上而下执行,每执行一条dockfile指令就会生成一层临时镜像,如果层数过多,镜像会很大!
    

    1.4.2 FROM指令

    FROM是Dockfile文件中开篇第一个非注释行,用于为镜像文件构建过程指定进出镜像,后续的指令运行于此基准镜像所提供的运行环境
    实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需要的镜像文件,如果找不到就会返回一个错误
    FROM  基础镜像
    FROM  centos:6.9
    

    1.4.3 RUN指令

    RUN:构建镜像过程中运行的命令(这些命令都要是当前基础镜像支持的shell命令)
    第一种:对于bash能直接识别的命令
    RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]
    name=ftp
    baseurl=ftp://172.17.0.1/centos6.9
    gpgcheck=0">/etc/yum.repos.d/ftp.repo && yum makecache fast && yum install openssh-server -y
    第二种: 如果有参数,参考如下格式书写
    RUN   ["mysqld","--initialize-insecure","--user=mysql" ,"--basedir=/usr/local/mysql","--datadir=/data/mysql/data"] 
    

    1.4.3 COPY指令

    用于从docker主机复制文件到新的镜像文件里面去(这些文件都要放在同Dockerfile一个目录中)
    如果复制的是目录,则其内部的文件或者子目录会一并复制过去,但是不会复制目录本身
    如果复制的是多个目录,则目标位置必须是一个目录并且必须带上/结尾
    例如
    1. 复制文件到新的镜像文件中
    COPY index.html /data/web/html
    2. 复制目录到新的镜像文件中
    COPY yum.repos.d /etc/yum.repos.d/
    #复制宿主机的yum源的所有文件到容器的/etc/yum.repos.d/ 后面必须带上/
    

    1.4.4 ADD指令

    ADD指令类似于COPY指令,但是ADD可以自动解压Dockerfile所在目录中的*.tar.*的包,并且还支持URL
    1. 如果是通过URL获得到的tar包是不会自动解压的。为什么ADD会解压tar包实际上就是一般我们需要的基础镜像都集成了tar命令,如果基础镜像没有tar命令,ADD也不会解压tar包
    

    1.4.5 WORKDIR指令

    当前的工作目录
    例如
    WORKDIR /data/
    ADD nginx-1.5.16.tar.gz ./
    #定义的WORKDIR 接下来的指令都是在逆序找到最近的一个WORKDIE下工作的
    例如
    WORKDIR /data/
    ADD nginx-1.5.16.tar.gz ./ #这个就是在/data下解压的
    WORKDIR /web/
    ADD nginx-1.5.12.tar.gz ./ #这个就是在/web目录下解压的
    

    1.4.6 EXPOSE指令

    EXPOSE: 向外暴露的端口 
    例如
    1. 指定端口
      EXPOSE  22
    2. 指定多个端口
    EXPOSE  22 80 8080
    3. 指定端口和协议(默认就是tcp协议)
    EXPOSE  22/tcp 80/udp
    # EXPOSE只是指定了默认暴露的端口,并不是说容器一启动就是自动把端口暴露出来,我们可以启动容器时 -P(大写)会自动的把Dockfile文件中指定的端口,也可以用-p(小写)来指定端口暴露出来
    

    1.4.7 ENV指令

    设定变量
    例如
    ENV CODEDIR /var/www/html/
    ADD bbs.tar.gz ${CODEDIR}
    

    1.5 基于dockerfile制作nginx镜像

    1.1 第一个里程:下载基础镜像centos

    docker pull centos:7.7.1908
    

    1.2 第二个里程:准备好nginx配置文件和安装nginx需要的官方yum源

    这些文件放在/opt/dockfile/nginx目录下
    

    1.2 第二个里程:创建dockfile目录

    mkdir /opt/dockfile/nginx
    cd /opt/dockfile/nginx
    vim dockfile(此处的名字要么是dockfile或者Dockfile,只能有这2种写法)
    FROM centos:7.7.1908
    RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    RUN yum makecache fast && yum install -y  vim wget  net-tools unzip   openssl-devel pcre-devel gcc gcc+ 
    ADD nginx.repo /etc/yum.repos.d/ 
    RUN yum install -y nginx
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    

    1.3 第三个里程:基于dockfile创建nginx镜像

    cd /opt/dockfile/nginx
    docker  build -t nginx:v1 .
    

    1.4 第四个里程:基于新创建的镜像,启动容器

    docker container run -d -p 80:80 --name "nginx" nginx:v1
    

    第7章 Docker构建私有registry

    1.1 启动registry

    docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry  registry
    #说明
    --restart=always: 表示的是docker这个服务重启的时候,会跟随docker这个服务一起启动
    registry: 默认的端口就是5000
    

    1.2 修改配置文件

    vim /etc/docker/daemon.json 
    {
        "registry-mirrors": ["http://hub-mirror.c.163.com"],
        "insecure-registries": ["192.168.114.20:5000"]
    }
    

    1.3 重启docker

    systemctl  restart docker
    

    1.4 本地镜像push到registries仓库

    1. 修改标签
    #说明:推送的格式如下(必须这样写)
    docker tag nginx:latest 192.168.114.20:5000/yfc/nginx:v1
    nginx:latest:表示原来镜像的标签
    192.168.114.20:5000:表示仓库的IP地址+端口号
    yfc:项目名称
    nginx:v1:新的标签
    2. 推送新标签命令的镜像到仓库
    docker push 192.168.114.20:5000/yfc/nginx:v1
    3. 异地进行pull镜像
    [root@docker02 ~]# docker pull 192.168.114.20:5000/yfc/nginx:v1
    4. 浏览器输入如下地址,可以看到仓库里有了镜像
    http://192.168.114.20:5000/v2/_catalog
    

    1.5 本地仓库加安全认证

    1. 生成密码
    [root@docker01 ~]# yum install httpd-tools -y
    [root@docker01 ~]# mkdir /opt/registry-auth/ -p
    [root@docker01 ~]# htpasswd  -Bbn yfc 123 > /opt/registry-auth/htpasswd
    2. 重新启动带有秘钥功能的registry容器
    docker rm -f `docker ps -aq`
    docker run -d -p 5000:5000 -v /opt/registry-auth/:/auth/ -v /opt/registry:/var/lib/registry  --name register-auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry 
    3. push镜像,需要进行login
    [root@docker01 ~]# docker login 192.168.114.20:5000
    Username: yfc
    Password: 
    #异地拉取镜像的时候是不要用户和密码登录的,直接docker pull就可以了
    
    学习的进阶之路
  • 相关阅读:
    【RL-TCPnet网络教程】第41章 HTTP超文本传输协议基础知识
    【安富莱TCPnet网络教程】HTTP通信实例
    【原创开源】网络版二代双通道示波器开源发布,支持电脑,手机和Pad等各种OS平台访问
    【RL-TCPnet网络教程】第40章 RL-TCPnet之TFTP客户端(精简版)
    【RL-TCPnet网络教程】第38章 TFTP简单文件传输基础知识
    linux添加环境变量
    linux字体安装
    lsof常用命令
    systemctl
    简单磁盘操作
  • 原文地址:https://www.cnblogs.com/yufenchi/p/12932335.html
Copyright © 2011-2022 走看看