一、三大概念
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、测试结果