zoukankan      html  css  js  c++  java
  • docker(1)

    一、三大概念

    1、docker镜像:通过docker file文件组织起来,将程序和运行环境打包成一个文件,镜像包括镜像名、版本(标签)、镜像ID、镜像大小等。

    2、docker仓库:存放docker镜像的服务器,供其他用户下载。可以使用公共仓库,也可以自己搭建私有仓库

    3、docker容器:docker镜像启动之后成为容器,镜像和容器相当于系统里的软件和进程的关系

    二、安装docker(centos7.x)

    1、检查当前系统版本,linux内核要求3.10以上

    [root@localhost ~]# cat /etc/centos-release
    CentOS Linux release 7.9.2009 (Core)
    [root@localhost ~]# uname -r
    3.10.0-1160.11.1.el7.x86_64
    [root@localhost ~]# 

    2.添加yum仓库

    curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
    #docer官方yum源下载docker软件特别慢,使用下面的命令修改docker-ce.repo文件,将docker官方源更换为阿里云提供的yum源,其他docker-ce的yum源可以查看mirror源网站的文档
    sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

    3、安装docker

    
    

      yum remove docker docker-common docker-selinux docker-engine #卸载之前的版本
      yum install -y yum-utils device-mapper-persistent-data lvm2 #安装依赖
      yum install docker-ce docker-ce-cli containerd.io -y

     4、管理docker运行状态

    systemctl start/stop/restart/status docker //管理docker服务状态
    systemctl enable docker //设置跟随系统自动运行docker
    docker info //docker版本、镜像、容器、存储等信息

    三、加速器

    科大镜像:https://docker.mirrors.ustc.edu.cn
    网易:https://hub-mirror.c.163.com
    阿里云:https://<你的ID>.mirror.aliyuncs.com
    七牛云加速器:https://reg-mirror.qiniu.com

    阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors ,登陆后获取到加速器地址

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://j149fqqo.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker

    添加之后使用docker info  可以看到Registry Mirrors中列出加速器地址,可以使用docker pull mariadb 拉取镜像的过程中,使用ss | grep https 看到远程地址有公网ip地址连接信息,就是对应的加速器地址

    四、镜像、容器

    1、搜索镜像

    [root@localhost ~]# docker search mysql
    NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    mysql                             MySQL is a widely used, open-source relation…   10411     [OK]       
    mariadb                           MariaDB is a community-developed fork of MyS…   3864      [OK]       
    。。。。

    2、拉取镜像

    docker pull mysql:5.7 // 拉取MySQL 5.7的镜像。完整镜像名包括镜像软件名、冒号、版本号,只给出镜像软件名则表示拉取最新版镜像

    3、查看本地镜像

    [root@localhost ~]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    mysql         5.7       a70d36bc331a   4 days ago      449MB
    mariadb       latest    3a348a04a815   8 weeks ago     407MB
    hello-world   latest    bf756fb1ae65   12 months ago   13.3kB

    4、容器

    容器运行起来后,docker会给每个容器分配一个唯一的标识(ID),我们也可以给容器定义名称,比如有多个MySQL容器,可以命名为mysql01、mysql02等。有id和名称后,我们可以调用id或者名称来操作容器,id为xx位的字符串,命令中一般使用前几位字符能定位到唯一的容器即可完成操作。

    运行MySQL容器需要按照以下步骤准备运行环境:

    a、创建MySQL的配置文件目录

    mkdir -p /opt/mysql/conf

    b、创建日志文件目录

    mkdir -p /opt/mysql/logs

    c、创建数据文件目录

    mkdir -p /opt/mysql/data

    d、运行MySQL容器,首先进入MySQL目录文件夹

    cd /opt/mysql/

    e、启动容器

    docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
     //run 运行命令
     //-p 3306:3306 容器内的3306端口映射到主机3306端口
     //--name mysql 容器运行名称
     //-v $PWD/conf:/etc/mysql/conf.d 容器内MySQL配置文件目录映射到$PWD/conf目录下  
     //-v $PWD/logs:/logs             容器内日志目录映射到$PWD/logs目录下
     //-v $PWD/data:/var/liv/mysql    容器内MySQ数据文件目录映射到$PWD/data目录下
     //-e MYSQL_ROOT_PASSWORD=123456 mysql的root密码为123456
     //-d mysql:5.7 守护进程方式运行mysql:5.7镜像

    f、查看容器

    [root@localhost mysql]# docker ps
    CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                               NAMES
    9945f2aaadc9   mysql:5.7   "docker-entrypoint.s…"   7 minutes ago   Up 7 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
    
    [root@localhost mysql]# docker ps -a  //已经停止的容器使用docker ps -a 可以查看到是exited状态
    CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                     PORTS     NAMES
    9945f2aaadc9   mysql:5.7     "docker-entrypoint.s…"   14 minutes ago   Exited (0) 4 seconds ago             mysql
    e9b95d4e1a97   hello-world   "/hello"                 2 hours ago      Exited (0) 2 hours ago               focused_neumann

    g、停止容器

    两种方式
    docker stop mysql//定位容器名称停止容器
    dorker stop 9945 //定位容器ID停止容器

    h、重新运行容器

    //已经停止的容器使用docker ps -a 可以查看到是exited状态,使用start或者restart重新运行容器
    docker start mysql
    docker restart mysql
    docker start 9945
    docker restart 9945

    i、

    [root@localhost mysql]# docker exec -it mysql bash
    //exec 在容器中运行命令
    //-i 标准输入方式打开控制台,-t 分配tty终端
    //mysql 运行的容器名称
    //bash 指定运行bash
    root@9945f2aaadc9:/# mysql -p123456 //使用密码123456登陆mysql的root账户
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 5
    Server version: 5.7.33 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> 

    j、开自动启动容器

    1、docker run命令中加入--restart=always
    docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=key -d mysql:5.7
    
    2、更新指定容器的启动方式
    docker update --restart=always mysql

    k、删除容器

    docker rm mysql

    l、删除镜像

    [root@localhost mysql]# docker ps -a  //查看所有容器,包括已经结束的
    CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                   PORTS                               NAMES
    9945f2aaadc9   mysql:5.7     "docker-entrypoint.s…"   39 minutes ago   Up 24 minutes            0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
    e9b95d4e1a97   hello-world   "/hello"                 3 hours ago      Exited (0) 3 hours ago                                       focused_neumann
    [root@localhost mysql]# docker rm e9 //删除hello-world容器
    e9
    [root@localhost mysql]# docker ps -a  //再次查看容器
    CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                               NAMES
    9945f2aaadc9   mysql:5.7   "docker-entrypoint.s…"   39 minutes ago   Up 24 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
    [root@localhost mysql]# docker images //查看镜像
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    mysql         5.7       a70d36bc331a   4 days ago      449MB
    mariadb       latest    3a348a04a815   8 weeks ago     407MB
    hello-world   latest    bf756fb1ae65   12 months ago   13.3kB
    [root@localhost mysql]# docker rmi bf //删除hello-world镜像
    Untagged: hello-world:latest
    Untagged: hello-world@sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
    Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
    Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63
    [root@localhost mysql]# docker images //再次查看镜像
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    mysql        5.7       a70d36bc331a   4 days ago    449MB
    mariadb      latest    3a348a04a815   8 weeks ago   407MB
    [root@localhost mysql]# 

    五、docker搭建lnmp

    lnmp指基于linux系统的nginx、mysql、php这三种经典的web解决方案

    容器网络:容器的ip地址为容器的路由器自动分配,不是固定的,所以容器之间的访问通过link命令,让容器之间通过名字来完成访问。语法:--link name:alias,name是源容器的名称,alias是连接的这个容器的名称

    1、docker运行mysql容器,按照第四步的方式运行,之后进入mysql容器修改数据库访问权限

    root@9945f2aaadc9:/# mysql -u root -p123456
    
    mysql> grant all privileges on *.* to root@'%' identified by "123456";
    Query OK, 0 rows affected, 1 warning (0.00 sec)

    2、docker运行php-fpm

    a、建立phpfpm对于的目录

    mkdir -p /opt/www/html

    b、拉取php-fpm和启动php-fpm在9000端口

    docker pull php:7.0-fpm
    cd /opt/www
    docker run -d -p 9000:9000 --name phpfpm --restart=always -v $PWD/html:/var/www/html --link mysql:mysql php:7.0-fpm

    c、准备测试用的php文件

    cd /opt/www/html
    echo "<?php phpinfo(); ?>" >index.php

    d、安装MySQL模块

    docker exec -it phpfph /bin/bash
    root@533c3d5def8e:/var/www/html# docker-php-ext-install pdo_mysql

    3、docker运行nginx

    1、拉取nginx镜像并运行

    docker pull nginx
    cd /opt/www
    docker run -d -p 80:80 --name nginx -v $PWD/html:/var/www/html --link phpfpm:phpfpm nginx

    2、修改nginx配置文件

    nginx容器中有两个配置文件,分别为/etc/nginx/nginx.conf 、/etc/nginx/conf.d/default.conf,容器中没有文本编辑器,需要将容器中的/etc/nginx/conf.d/default.conf拷贝到主机系统内,修改之后再拷贝回容器/etc/nginx/conf.d/default.conf覆盖源文件

    a、拷贝操作:

    docker cp nginx:/etc/nginx/conf.d/default.conf /opt/nginx/

    b、修改default.conf,以下加粗字体为修改的部分

    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
    
        charset utf-8;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            root   /var/www/html;
            index  index.html index.htm index.php;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ .php$ {
            root           /var/www/html;
            fastcgi_pass   phpfpm:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /.ht {
        #    deny  all;
        #}
    }

    c、将修改后的default.conf覆盖回容器中的源文件

    docker cp /opt/nginx/default.conf nginx:/etc/nginx/conf.d/default.conf

    d、重启nginx容器

    docker restart nginx

    e、测试php连接mysql

    [root@localhost html]# cat /opt/www/html/db.php 
    <?php
    try{
        $con = new PDO('mysql:host=mysql;dbname=sys','root','key');
        $con->query('SET NAMES UTF8');
        $res = $con->query('select * from version');
        while ($row = $res->fetch(PDO::FETCH_ASSOC)){
            echo "sys_version:{$row['sys_version']}mysql_version:{$row['mysql_version']}";
        }
    } catch (PDOException $e){
        echo '错误原因:'.$e->getMessage();
    }
    ?>

    f、测试结果

  • 相关阅读:
    耐心
    百度年会
    聊聊今年的春节联欢晚会
    网速调查
    热烈欢迎两位园友加盟
    遥远的路
    博客园博客程序架构设计图初稿
    [公告]社区与博客实现了登录整合
    博客园上海俱乐部第二次活动继续报道
    [收藏]《观察与思考》:相信中国,寻找下一个比尔·盖茨
  • 原文地址:https://www.cnblogs.com/hfyn/p/14319982.html
Copyright © 2011-2022 走看看