docker

作者: linux_豪哥 | 来源:发表于2020-10-31 16:37 被阅读0次

    docker介绍

    Docker 是 Docker.Inc 公司开源的一个基于 LXC 技术之上构建的 Container 容器引擎, 源代码托管
    在 GitHub 上, 基于 Go 语言并遵从 Apache2.0 协议开源。
    Docker 是通过内核虚拟化技术(namespaces 及 cgroups 等)来提供容器的资源隔离与安全保障等。由
    于 Docker 通过操作系统层的虚拟化实现隔离,所以 Docker 容器在运行时,不需要类似虚拟机(VM)
    额外的操作系统开销,提高资源利用率。
    
    namespaces命令空间
    Mount Namespace - 用于隔离文件系统的挂载点
    UTS Namespace - 用于隔离 HostName 和 DomianName
    IPC Namespace - 用于隔离进程间通信
    PID Namespace - 用于隔离进程 ID
    Network Namespace - 用于隔离网络
    User Namespace - 用于隔离用户和用户组 UID/GID
    
    cgroups 资源限制
    控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有
    能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。
    控制组技术最早是由 Google 的程序员在 2006 年提出,Linux 内核自 2.6.24 开始支持。
    控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。
    

    容器和虚拟的对比

    image.png

    docker有3大核心:镜像、容器、仓库

    Image(镜像):
    那么镜像到底是什么呢?Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的
    程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、
    用户等)。
    Container(容器)
    容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最
    上面那一层是可读可写的。
    Repository(仓库)
    镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
    通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
    我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将
    以 Latest 作为默认标签。
    
    用docker运行一个程序的过程:
    去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器。
    
    image.png

    docker 安装

    清华源帮助文档

    https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
    
    移除系统自带docker
    yum remove docker docker-common docker-selinux docker-engine
    下载依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2
    下载docker的repo源
    wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
    下载地址改为国内清华源
    sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
    生成yum缓存
    yum makecache fast
    下载docker-ce
    yum install docker-ce -y
    查看docker版本
    docker version
    19.03
    运行docker
    systemctl start docker 
    

    国内远镜像加速配置

    国内镜像加速可以使用的地址很多,163、阿里云、华为云、腾讯云等等。
    我使用的华为云加速地址,然后加载配置文件重启容器引擎。
    [root@docker-01 ~]# cat /etc/docker/deamon.json
    {
        "registry-mirrors": ["https://08ce8043c80010600f40c017d5915f2.mirror.swr.myhuaweicloud.com"]
    }
    [root@docker-01 ~]# systemctl daemon-reload
    [root@docker-01 ~]# systemctl restart docker
    

    运行第一个容器

    docker run alpine /bin/echo "Hello world"
    
    Alpine小型linux操作系统,在alpine系统中用echo运行"hello world"
    

    镜像相关命令

    搜索镜像(选择官方,start分高的)
    docker search centos
    NAME: 镜像仓库源的名称
    DESCRIPTION: 镜像的描述
    OFFICIAL: 是否docker官方发布
    STARS: 类似Github里面的star,表示点赞、喜欢的意思
    AUTOMATED: 自动构建
    
    image.png
    -----search无法查看镜像版本,用浏览器打开docker官网查看比较慢,推荐使用jq命令
    yum install jq
    下面命令可以查看到centos镜像可用的版本
    curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq
    
    获取镜像
    docker pull centos  不加版本号默认下载最新版本
    docker pull centos:7    
    
    导出镜像
    docker save centos:7 -o centos-v7.tar
    docker save centos:7 > centos-v7.tar
    
    导入镜像
    docker load -i centos-v7.tar
    docker load < centos-v7.tar
    
    删除镜像
    docker rmi centos:7
    

    容器相关命令

    启动容器
    
    docker run centos:7 /bin/bash   (但是这个会退出,并且进入容器一退出容器也关闭)
    那为什么启动后就结束了并且夯住???
    1. 需要加-d的参数放到后台执行
    2. 对于容器来说,如果容器里的pid为1的进程退出了,则容器就退出了
    
    写一个不退出并放到后台运行的docker运行的命令:
    docker run -d centos:7 tail -f
    docker 命令
    run                           运行一个容器
    -d                             放到后台运行
    centos:7                   镜像版本
    tail -f                         容器执行的第一个命令(pid为1的进程),如果这个命令退出,容器就退出
    
    
    上面用tail -f当第一个进程比较的low,因为我们可能不需要tail -f这个命令,用的只是因为它不退出保持我们容器不也不退出。
    正常的写法:
    docker run -i -t -d centos:7 /bin/bash
    -t   分配一个虚拟的终端
    -i   保持交互的终端是打开的状态
    以上两个参数都是放在一起使用表示打开一个伪终端 docker run -it -d centos:7 
    
    命名容器名字
    如不自己自定义容器命令 会随机生成,方便查看就自定义;名字不能重复。
    [root@docker-01 ~]# docker run -it -d --name abc centos:7
    命令容器名字叫abc,参数--name
    
    查看正在运行的容器
    docker ps
    
    查看运行和停止的容器
    docker ps -a
    
    查看正在运行的容器的ID
    docker ps -q
    
    进入容器
    docker exec -it 容器ID /bin/bash
    
    停止容器
    docker stop 容器ID
    
    启动停止的容器
    docker start 容器ID
    
    删除容器
    docker rm 容器ID
    只能删除停止的容器
    
    批量停止所有运行的容器
    docker stop $(docker ps -q)
    
    批量删除所有停止的容器
    docker rm $(docker ps -a -q)
    
    查看容器/镜像详细信息
    docker inspect 容器ID
    

    容器的端口映射

    设置一下nginx的环境

    首先我们设置一个环境,在容器里运行一个nginx然后将宿主机的端口映射到nginx的端口
    docker pull nginx
    docker inspect nginx
    ...
    ...
    "Cmd": [
                    "nginx",
                    "-g",
                    "daemon off;"
                ],
    ...
    ...
    nginx -g "daemon off"
    运行nginx镜像时nginx默认使用的是前台运行命令这样命令不退出容器也不会退出  所以不用运行时不用-it的参数
    
    
    运行nginx
    docker run -d nginx
    但是没有办法访问容器里面的nginx,需要端口映射。
    先关闭nginx容器,然后用端口映射的方式启动
    
    指定端口映射
        docker run -p 8080:80 -d nginx:latest 
    随机端口映射
        docker run -P -d nginx:latest 
    
    访问宿主机的映射端口就可以访问到容器里的nginx了
    

    可以映射多个端口
    [root@docker-01 ~]# docker run -d -p 80:80 -p 8080:8080 -p 8090:8090 nginx:latest


    image.png

    容器的目录映射

    宿主机的目录映射到容器的目录
    此时的容器的nginx的html目录是首页文件,我可以映射宿主机的目录到容器的目录,这样我就不需要进入进行操作了,直接在宿主机的目录就可以操作了。


    image.png

    举例:宿主机的/data目录映射到/usr/share/nginx/html目录(可以理解成挂载)
    mkdir /data/ -p
    docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
    docker ps


    image.png

    那我们对宿主机的/data目录进行操作,相当于在操作容器的/usr/share/nginx/html目录
    [root@docker-01 ~]# echo 'hello docker' >/data/index.html
    然后访问容器的nginx,这样我们就不用进容器里面操作了


    image.png

    映射多个目录和文件

    [root@docker-01 ~]# docker run -d -p 80:80 -p 8080:8080 -v /data/www:/opt/www -v /data/abc:/opt/abc  -v /etc/abc.txt:/etc/abc.txt nginx:latest
    
    可以映射文件到容器nginx的配置文件,然后映射目录到容器nginx的html目录
    

    比如 创建nginx的配置文件进行映射 然后再映射站点目录。(举例说明不用纠结配置文件和game和xiaoniao这两个游戏)

    创建nginx配置文件
    
    cat >/data/game.conf<<EOF
    server {
        listen       8080;
        server_name  localhost;
        location / {
            root   /opt/game/;
            index  index.html index.htm;
        }
    }
    
    server {
        listen       8090;
        server_name  localhost;
        location / {
            root   /opt/xiaoniao/;
            index  index.html index.htm;
        }
    }
    EOF
    
    运行容器
    docker run -d -p 8080:8080 -p 8090:8090 -v /data/xiaoniao:/opt/xiaoniao -v /data/game:/opt/game -v /data/game.conf:/etc/nginx/conf.d/game.conf nginx:latest
    
    

    基于centos自定义镜像

    1.首先pull官方的centos镜像
    2.运行centos镜像并进入容器
    3.进入镜像进行我们需要的操作(搭建环境、安装软件、修改配置、上传文件数据等)
    4.基于容器生成镜像 (docker commit 容器ID 镜像名:版本号)
    5.导出镜像(docker save)
    5.其他环境使用镜像直接导入镜像(docker load),然后运行,方便操作。

    比如在centos镜像安装nginx,然后进行了系统的常见命令安装nginx,然后根据容器生成镜像。(为了理解容器做的简单只安装了nginx,感兴趣可以对nginx进行优化或者下载其他软件,原理是一样的)

    运行一个centos容器,进入容器
    docker run -it centos:7 /bin/bash
    下载常用命令和配置yum源
    yum install wget install openssh-clients -y
    rm -rf /etc/yum.repos.d/*
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
    配置nginx的yum源
    cat >/etc/yum.repos.d/nginx.repo<<EOF  
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    EOF
    生成缓存
    yum makecache fast
    下载nginx
    yum install nginx -y
    查看运行容器
    docker ps
    生成自定义镜像,命令为game版本是V1
    docker commit 容器ID nginx:v1
    查看镜像
    docker images
    导出镜像
    docker save nginx:v1 > nginx-v1.tar
    
    如果使用自定义的镜像按以下操作就可以
    导入镜像
    docker load < nginx-v1.tar
    运行镜像(nginx -g 'daemon off;'前台执行 )
    docker run -p 80:80 -d nginx:v1 nginx -g 'daemon off;'
    

    手动自定义云盘镜像

    在容器中搭建php+nginx的架构运行云盘软件的代码

    运行一个centos7镜像的容器
    docker run -it centos:7 /bin/bash
    在容器中下载常用功能
    yum install wget install openssh-clients unzip -y
    配置yum源
    rm -rf /etc/yum.repos.d/*
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
    配置nginx源
    cat >/etc/yum.repos.d/nginx.repo<<EOF  
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    EOF
    生成缓存
    yum makecache fast
    下载php和php插件还有nginx
    yum install nginx php-fpm php-mbstring php-gd -y
    替换php用户为nginx
    sed -i '/^user/c user = nginx' /etc/php-fpm.d/www.conf
    sed -i '/^group/c group = nginx' /etc/php-fpm.d/www.conf
    sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf     
    php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
    ps -ef|grep php
    
    生成nginx配置文件
    cat> /etc/nginx/conf.d/cloud.conf <<EOF  
    server {
        listen 80;
        server_name localhost;
        root /code/kod;
        index index.php index.html;
    
        location ~ \.php\$ {
            root /code/kod;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
            include fastcgi_params;
        }
    }
    EOF
    删除nginx默认配置文件
    rm -rf /etc/nginx/conf.d/default.conf
    nginx语法检查 
    nginx -t
    启动nginx
    nginx 
    创建站点目录
    mkdir /code/kod
    拉取云盘软件
    scp 10.0.1.201:/data/kodexplorer4.40.zip 
    解压
    unzip kodexplorer4.40.zip -d /code/kod
    站点目录授权
    chown -R nginx:nginx /code/
    写启动的脚本(启动php、前台运行nginx)
    cat >init.sh<<EOF
    #!/bin/bash
    php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
    nginx -g 'daemon off;'
    EOF 
    给脚本执行权限
    chmod +x init.sh
    到宿主机创建镜像
    docker commit 9e691858a4bd kod:v1
    
    运行镜像
    docker run -p 80:80 -d kod:v1 /bin/bash /root/init.sh
    
    需要将站点目录做映射也可以
    docker run -p 80:80 -v /data/kod/data:/code/kod/data/ -d kod:v1 /bin/bash /root/init.sh
    

    dockerfile

    使用dockerfile制作云盘镜像

    Docker 通过对于在 Dockerfile 中的一系列指令的顺序解析实现自动的 image 的构建
    通过使用 build 命令,根据 Dockerfile 的描述来构建镜像
    

    相关文章

      网友评论

          本文标题:docker

          本文链接:https://www.haomeiwen.com/subject/tfrsvktx.html