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://06dfba897f800f160fb1c016162c4bc0.mirror.swr.myhuaweicloud.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、测试结果

 

posted @ 2021-01-24 22:37  何方妖孽  阅读(157)  评论(0编辑  收藏  举报