• Docker--01


    Docker容器介绍

    1.1 docker是什么

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

    namespace命名空间

    Mount Namespace - 用于隔离文件系统的挂载点
    UTS Namespace - 用于隔离 HostName 和 DomianName
    IPC Namespace - 用于隔离进程间通信
    PID Namespace - 用于隔离进程 
    

    cgroups资源限制

    控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有

    能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。

    控制组技术最早是由 Google 的程序员在 2006 年提出,Linux 内核自 2.6.24 开始支持。

    控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。

    1.2 容器与虚拟机对比

    img

    img

    1.3 docker的三个重要概念

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

    img

    1.4 docker的组成部分

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

    img

    组件:镜像,容器,仓库,网路,存储

    镜像:把系统文件打包

    虚拟化的几种架构图

    img

    Docker安装部署

    2.1 国内源安装docker-ce

    这里我们使用清华源:
    https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
    操作步骤:

    yum remove docker docker-common docker-selinux docker-engine
    yum install -y yum-utils device-mapper-persistent-data lvm2
    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
    yum install docker-ce -y
    docker version
    systemctl start docker 
    
    上传安装包,
    yum localinstall '*.rpm'
    

    2.2 国内远镜像加速配置

    官网地址
    https://www.daocloud.io/mirror
    加速命令
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
    需要重启docker
    阿里镜像加速地址
    https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
    加速命令
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker
    

    2.3 快速安装

    思路:
    1.开启yum缓存
    2.全新环境安装docker
    3.将缓存的包全部打包出来
    4.安装的时候使用rpm -ivh *.rpm方式安装

    2.4 运行第一个容器

    运行一个Hello world

    docker run alpine /bin/echo "Hello world"
    

    Docker镜像和容器管理

    3.1 镜像相关命令

    3.1.1 搜索镜像

    选择镜像建议:
    1.优先选择官方的
    2.选择星星多的

    docker search centos
    
    #搜索镜像所有的版本号.jq是一个json格式化工具
    yum install jq
    curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq
    

    3.1.2 获取镜像(没有指定版本,默认最新)

    docker pull centos
    docker pull busybox
    docker pull busybox:1.29
    

    3.1.3 查看镜像

    docker images
    

    3.1.4 删除镜像(首先删除容器,再删除镜像)

    docker rmi centos:7
    docker images|awk 'NR>1{print "docker rmi "$3}'|bash
    docker rmi $(docker images|awk 'NR>1{print $3}')
    docker rmi $(docker images -q)
    

    3.1.5 导出镜像

    docker save -o centos.tar centos:latest
    
    

    3.1.6 导入镜像

    docker load  < centos.tar
    
    

    3.2 容器相关命令

    3.2.1 启动容器

    docker run -d -p 80:80 nginx 
    #启动一个容器并保持不退出 并自定义命名
    docker run --name mydocker -t -i centos /bin/bash
    #启动一个容器并保持不退出
    docker run -it -d centos:7 /bin/bash 
    #启动并进入容器,启动一个终端,pid为1
    docker run -it  centos:7 /bin/bash 
    #启动一个已经停止的容器
    docker start  容器ID
    -d放后台
    -p端口映射
    #system管理启动
    docker run -d -it --privileged nginx-1 /usr/sbin/init
    
    

    3.2.2 停止容器

    docker stop 容器的ID
    #批量停止所有运行的容器
    docker stop $(docker ps -q)
    
    

    3.2.3 查看容器

    #查看当前正在运行的容器
    docker ps 
    #查看正在运行以及停止运行的容器
    docker ps -a 
    
    docker ps -q
    docker ps -aq
    
    #查看容器的详细信息
    docker inspect 容器ID
    
    

    3.2.4 进入容器

    docker exec会分配一个新的终端tty
    #进入已经运行的容器
    docker exec -it 容器ID  /bin/bash 
    #启动并进入容器,启动一个终端,pid为1
    docker run -it  centos:7 /bin/bash 
    
    docker attach会使用同一个终端
    docker attach 容器ID
    
    

    3.2.5 删除容器

    删除单个容器

    docker rm 容器ID
    
    

    批量删除容器

    docker rm $(docker ps -aq)
    
    

    Docker网络管理

    4.1 随机映射端口

    docker run -P :80 -d nginx:latest
    
    

    4.2 指定映射端口

    -p 宿主机端口:容器端口

    docker run -p 8080:80 -d nginx:latest
    
    -p 80:80 -p 443:443
    -p 宿主机IP:宿主机端口:容器端口
    
    

    如果想多个容器使用8080端口,可以通过添加多个IP地址实现

    ifconfig eth0:1 10.0.1.13 up
    docker run -d -p 10.0.1.11:8080:80 nginx:latest
    docker run -d -p 10.0.1.13:8080:80 nginx:latest
    
    

    进入容器里修改站点目录,然后访问测试

    docker exec -it bdb2a4e7e24d /bin/bash
    echo "web01" > /usr/share/nginx/html/index.html
    docker exec -it 31c1de138dda /bin/bash
    echo "web02" > /usr/share/nginx/html/index.html
    
    

    访问测试:

    [root@docker01 ~]# curl 10.0.1.11:8080
    web02
    [root@docker01 ~]# curl 10.0.1.13:8080
    web01
    
    

    img

    Docker数据卷管理

    5.1 持久化数据卷

    -v 宿主机目录:容器内目录
    下面我们来创建一个html5小游戏

    5.1.1 创建游戏代码目录

    mkdir /data/xiaoniao -p
    cd /data/
    unzip xiaoniaofeifei.zip  -d xiaoniao /
    
    

    5.1.2 创建容器并映射数据卷

    docker run -d  -p 80:80 -v /data/xiaoniao:/usr/share/nginx/html nginx:latest
    docker ps
    
    

    5.1.3 访问游戏页面

    10.0.1.11

    5.2 持久化数据卷容器

    --volumes-from (跟某一个已经存在的容器挂载相同的卷)
    
    

    查看当前容器有哪些卷

    docker volume ls
    
    

    下面我们利用容器卷创建一个小游戏

    5.2.1 创建一个容器卷

    docker run -d  -p 8080:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest
    docker volume ls
    
    

    5.2.2 查看卷的目录

    docker volume inspect xiaoniao
    
    

    5.2.3 复制代码目录到容器卷目录

    cp -a /data/xiaoniao/* /var/lib/docker/volumes/xiaoniao/_data/
    
    

    5.2.4 使用容器卷创建新容器

    docker run -d  -p 8090:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest
    
    

    5.3 项目实战-访问不同端口展示不同页面

    前提:基于自定义镜像c7_nginx:v1

    基于Centos7创建自定义nginx镜像
    
    1.拉取一个基础镜像
    docker run --name myc7 -it centos:7 /bin/bash 
    
    2.安装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
    module_hotfixes=true
    
    [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
    module_hotfixes=true
    EOF
    yum install nginx 
    
    3.基于自定义的容器生成新的镜像
    docker commit myc7 c7_nginx:v1
    
    4.查看是否生成新镜像
    docker images 
    
    5.基于自定义的nginx镜像创建新的容器并指定映射端口
    docker run --name mynginx -itd -p 80:80 c7_nginx:v1 nginx -g "daemon off;"
    
    6.查看容器是否运行并在windows访问测试
    docker ps 
    10.0.0.51
    
    7.进入容器查看进程
    docker exec -it mynginx /bin/bash 
    ps aux 
    nginx -s stop 
    
    8.重启启动容器测试是否可以访问
    docker start mynginx
    10.0.0.51
    
    有报错,可以换国内源安装
    docker cp /etc/yum.repos.d/CentOS-Base.repo  b1965575341b:/etc/yum.repos.d/
    docker cp /etc/yum.repos.d/CentOS-epel.repo  b1965575341b:/etc/yum.repos.d/
    
    

    项目要求:

    一个容器实现:
    访问8080端口跳转到xiaoniao
    访问8090跳转到game
    数据目录,配置文件,日志文件都以映射挂载的方式实现

    1.创建数据目录
    mkdir /code 
    cd /code 
    
    2.编写Nginx配置文件
    cat >game.conf<<EOF 
    server {
        listen       8080;
        server_name  localhost;
        location / {
            root   /opt/xiaoniao/;
            index  index.html index.htm;
        }
    }
    
    server {
        listen       8090;
        server_name  localhost;
        location / {
            root   /opt/game/;
            index  index.html index.htm;
        }
    }
    EOF
    
    3.上传代码目录并解压
    tar zxf xiaoniao.tar.gz
    tar zxf game.tar.gz
    
    4.关键容器并挂载
    docker run -d 
        -p 8080:8080 
        -p 8090:8090 
        -v /code/game/:/opt/game/ 
        -v /code/xiaoniao/:/opt/xiaoniao/ 
        -v /code/game.conf:/etc/nginx/conf.d/game.conf 
        -v /var/log/nginx/:/var/log/nginx/ 
        c7_nginx:v1 
        nginx -g "daemon off;"
    
    5.访问测试
    10.0.0.51:8080
    10.0.0.52:8090
    
    

    Docker镜像手动构建

    6.1 手动制作游戏镜像(没测试)

    下面我们基于centos容器制作一个新镜像,并安装nginx服务

    6.1.1 启动一个容器并安装nginx

    docker run -it centos:7 /bin/bash
    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
    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
    yum install nginx -y
    

    6.1.2 上传代码目录并配置nginx配置文件

    scp -r 10.0.1.51:/data/* /opt/
    mv /opt/game.conf /etc/nginx/conf.d/
    

    6.1.3 将容器提交为新的镜像

    docker ps
    docker commit 容器ID game:v1
    docker images
    docker save game:v1 > game-v1.tar
    docker load < game-v1.tar
    

    6.1.4测试镜像功能是否可用

    docker run -p 8080:8080 -p 8090:8090 -d game:v1 nginx -g 'daemon off;'
    
    

    6.1.5 将新镜像导出

    docker save -o game_v1.tar game:v1
    

    6.2 手动制作云盘镜像

    制作成容器:

    docker run -it -d -p 80:80 centos:7 /bin/bash
    docker exec -it ed90a5662ac4 /bin/bash
    
    

    容器内正常安装

    0.初始化
    使用阿里源
    groupadd www -g 1000
    useradd www -u 1000 -g 1000 -M -s /sbin/nologin
    rm -rf /etc/yum.repos.d/*
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    
    
    1.安装依赖环境 nginx+php
    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
    module_hotfixes=true
    
    [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
    module_hotfixes=true
    EOF
    
    yum makecache fast
    yum install nginx php-fpm php-mbstring php-gd unzip -y
    
    
    2.配置Nginx和php
    rm -rf /etc/nginx/conf.d/default.conf
    sed -i '/^user/c user www;' /etc/nginx/nginx.conf
    sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
    sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
    sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf     
    cat >/etc/nginx/conf.d/kod.conf<<EOF
    server {
        server_name localhost;
        listen 80;
        root /code;
        index index.php index.html;
    
        location ~ .php$ {
            root /code;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
    EOF
    
    3.配置代码
    mkdir /code 
    cd /code 
    curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
    unzip kodexplorer4.40.zip
    chown -R www:www /code 
    
    
    4.启动脚本
    cd /root
    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
    5.测试
    方法一:
    #若前面没有映射端口,执行脚本用curl测试
    sh init.sh
    重开端口测试
    [root@d0c987bcefa2 code]# curl -I 127.0.0.1
    方法二:
    登录web 10.0.0.51测试
    
    6.宿主机操作
    #生成镜像
    docker commit ed90a5662ac4 my_kod:v1
    #基于新生成的镜像.启动容器
    docker run -p 80:80 -d my_kod:v1 /bin/bash /root/init.sh
    
    
  • 相关阅读:
    【css】垂直居中的几种写法
    【gulp】gulp-file-include 合并 html 文件
    【gulp】gulp + browsersync 构建前端项目自动化工作流
    【nodejs】exports 和 module.exports 的区别
    【nodejs】初识 NodeJS(四)
    【nodejs】初识 NodeJS(三)
    【nodejs】初识 NodeJS(二)
    【nodejs】初识 NodeJS(一)
    【规范】前端编码规范——注释规范
    【规范】前端编码规范——jquery 规范
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/12353338.html
Copyright © 2020-2023  润新知