从零开始的Docker [ 4 ] --- Docker 应用:应用MySQL、 PHP

容器技术 Docker 应用

1 数据卷

  • 希望保留容器中产生的数据(mysql 数据库的数据)

    • volume
      –mount src=vol-name,dst=/path/to/
      vol-name 来源:
      • Docker 守护进程会自动创建
      • docker 命令实现:
        docker volume create vol-name
  • 希望容器中使用宿主机已有的配置文件,应用代码

    • bind mount

      –mount type=bind,src=/abspath/to/some.conf,dst=/path/to/file.conf

–mount 使用 -v 替代

–mount src=vol-name,dst=/path/to/
–》 -v vol-name:/path/to/

–mount type=bind,src=/abspath/to/some.conf,dst=/path/to/file.conf
–> -v /abspath/to/some.conf:/path/to/file.conf

docker volume ls

docker volume rm

docker volume prune

docker volume inspect

2 网络

  • bridge 网桥(默认的网络) 172.18.0.0/16
  • host 主机网络(使用宿主机的网络)
  • none 没有网络

在同一个网络上的容器可以互相通信

  • 如果是默认的网络 bridge,只可以使用对方的 IP 进行通信

  • 如果是自定义的网络, 也可以使用 容器名称互相通信

  • 自定义网络

  • 创建
    docker network create net-name

  • 将已经运行中的容器加入到已有的网络
    docker network connect net-name container-name/container-id

  • 创建容器的时候,给其指定一个自定义的网络
    docker run --network=net-name

  • 关于自定义网络操作
    docker network create net-name
    ls
    connect
    disconnect # 移除连接

一、Docker 容器的端口发布

1.容器之间彼此自动发布端口

运行一个 nginx 的容器

docker run -itd --rm --name=nginx1 nginx:alpine

查看 nginx 的地址

[root@Docker ~]# docker network  inspect bridge 
        "Name": "bridge",
        "Id": "366bac200166897c1ea0488ad8c4ea3b464dbbee1c7dadb52396c519b028c97d",
        "Containers": {
            "d5aa7c60189f065df11bb5daecf630e939b5b09e5c5462177d48962b9f9c55a5": {
                "Name": "nginx1",
                "EndpointID": "f332b6c35f94dc511d289869c65ccdd481d56e2bc96fac26def5d9be459e063f",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },

运行另一个容器,并安装 curl 软件包,访问 nginx 提供的 web 服务

docker run  -it --name=myurl alpine /bin/sh
#换国内源
/ # sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories # 清华源
/ # apk add curl
/ # curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

由于两个容器是连接到默认网络,所以需要使用容器 IP 进行通信。
假如是使用的自定义网络,就可以直接使用容器名进行通信了。

清华源 点我去官网

在一个自定义的网络nginx-to-redis中运行一个 nginx 和 一个 redis

[root@Docker ~]# docker network create alpine-to-redis
3d42f10263e4f80e61e361a466e7baf88d018484035dc4e9256c34f30bf4e490
[root@Docker ~]# docker run -itd --name=alpine-host --network=alpine-to-redis alpine
16c29abf49fc0d181b8babcb4cc1667ef12d1d88cec2c3b88bb2d44251b1d957
[root@Docker ~]# docker run -d --rm --name=redis --network=alpine-to-redis redis
5a2252509d69be74677deb5d30b3b1616af6fdc168fb57dc27f4840335cf3820

进入容器安装 python3

[root@Docker ~]# docker exec -it alpine-host /bin/sh
/ # sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
/ # apk add python3 py3-pip

连接 redis

/ # pip3 install redis
/ # python3
Python 3.8.5 (default, Jul 20 2020, 23:11:29) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import redis
>>> rs = redis.Redis(host='redis',port=6379)
>>> rs.set("name",'neko')
>>> True
>>> rs.get("name")
>>> b'neko'
>>> exit()
>>> / # exit

2.端口映射

a. 映射指定的本地 IP 和端口到容器端口

所填ip为本机ip

docker run -d --rm -p 192.168.31.248:8080:80 --name mynginx2 nginx:alpine

b.映射本地指定 IP 的任意端口到容器的一个端口,本地主机会自动分配一个端口

docker run -d -p 192.168.31.248::80 --name mynginx3 nginx:latest

c. 映射本机的所有的地址的指定端口到容器的指定端口

docker run -d -p 8000:80  nginx:latest

-P 还可以多次使用来绑定多个端口

[root@Docker ~]# docker run -d \
> --name nginx110 \
> -p 192.168.31.248:4430:443 \
> -p 192.168.31.248:8000:80 \
> nginx:alpine

查看端口映射配置信息

docker port 容器名/容器 ID 容器的端口号

[root@Docker ~]# docker run -d --rm --name nginx110 -p 192.168.31.248:4430:443 -p 192.168.31.248:8000:80 nginx:alpine
d6f819c20706e139d6c56c35df5f64a01e4729f76301911bd9e1f63d48e8e7e9
[root@Docker ~]# docker port nginx110
443/tcp -> 192.168.31.248:4430
80/tcp -> 192.168.31.248:8000
[root@Docker ~]# docker port nginx110 80
192.168.31.248:8000
[root@Docker ~]# docker port nginx110 443
192.168.31.248:4430

二、Docker 应用 Mysql

官方Dockerfile 点我去官方

1.下载 Docker Mysql映像

docker pull mysql/mysql-server:5.7

2.启动MySQL服务器实例

1.运行容器
docker run -d --name=mysql5.7 mysql/mysql-server:5.7
2.获取初始化后的 root 密码
[root@Docker ~]# docker logs mysql5.7 2>&1 | grep GENERATED
[Entrypoint] GENERATED ROOT PASSWORD: VUsTicOGaNcyDf3BupIn3z;0mex
3.连接容器中的 MySQL终端
docker exec  -it mysql5.7 mysql -uroot -p'VUsTicOGaNcyDf3BupIn3z;0mex'

或者可以在启动容器前就让密码为指定密码

docker run -d --name mysql2 -e MYSQL_ROOT_PASSWORD=neko@123 mysql/mysql-server:5.7
docker exec -it mysql2 mysql -uroot -p'neko@123'
4.重置密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '自己设置的密码';
5.正常关闭打开及重启
docker stop mysql5.7
docker start mysql5.7
docker restart mysql5.7
6.启动容器时,给 Mysql 添加配置参数

设置字符集和排序规则

docker run --name mysql5.7 -d mysql/mysql-server:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
7.持久化 Mysql 的数据
docker run --name=mysql5.7 \
--mount type=bind,src=/docker/mysql57/conf/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/docker/mysql57/data,dst=/var/lib/mysql \
-d mysql/mysql-server:5.7

3.从其他容器连接到这个 Mysql 容器中

1.创建一个 Docker 网络
docker network create mysql57-net
2.启动一个 Mysql 容器时指定这个网络
docker run --name=mysql2 --network=mysql57-net -d mysql/mysql-server
3.启动一个自己的应用容器时,也指定这个网络
docker run --name=名称 --network=mysql2 -d 名称
4.进入服务器
docker logs mysql571 2>&1 | grep GENERATED
docker exec -it mysql571 mysql -uroot -p')@vePOB3H4D-ELn@LMoDEn^ad@n'

执行授权命令

mysql> grant all on *.* to 'root'@'172.%' identified by '我的密码';

4.下面创建一个 Mysql 客户端

1.编写客户端 Dockerfile
FROM alpine
RUN apk add --no-cache mysql-client
ENTRYPOINT ["mysql"]
2.构建
docker build -t mysqlclient:v1.1 .
3.使用
docker run -it --name=mysqlclient --networl=mysql57-net -h mysql571 -uroot -p'我的密码'
4.创建一个mysql容器 设置默认密码 并创建数据库
docker volume create mysql-data 

docker run -d --name mysql3 --mount src=mysql-data,dst=/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=neko@123 mysql/mysql-server:5.7

docker exec -it mysql3 mysql -uroot -p'neko@123'

create database test;
use test;
exit
5.然后删除这个容器
docker stop mysql3
docker rm mysql3
6.重新创建一个新的mysql数据库 不定义密码
docker run -d -v mysql-data:/var/lib/mysql/ mysql/mysql-server:5.7

以之前设置的密码登录,发现登录成功
表格也还在

docker exec -it d7bd mysql -uroot -p'neko@123'

show databases;

三、PHP 容器化

参考网站 docker-php官网

1.获取镜像

docker pull php:7.4-fpm

2.运行容器

1 创建
mkdir php
cd php/

编写index.php

<!DOCTYPE html>
<html>
<head>
        <title>PHP 动态网站</title>
</head>
<body>
  <?php
        $user_name = 'neko';
        echo "<h1>".$user_name."</h1>";
  ?>
</body>
</html>
2 运行容器

首先创建一个自定义网络

运行 php 容器并连接到指定的自定义网络 nginx-php
并使用 -v把事先准备好的测试用例挂载到容器内

docker run -d --name php -v /root/php/index.php:/var/www/html/index.php --network=nginx-php php:7.4-fpm
3 测试 php

进入容器,测试

[root@Docker ~]# docker exec -it php bash
root@95d5fedafea8:/var/www/html# php index.php 
<!DOCTYPE html>
<html>
<head>
        <title>PHP 动态网站</title>
</head>
<body>
  <h1>neko</h1></body>
</html>

上面的输入中 <h1>neko</h1></body> 表示成功

3.运行 nginx 容器

docker  run -d --name nginx1 -p 8090:80   --network=nginx-php  nginx:alpine

查看端口

[root@Docker ~]# docker  container  ls
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                  NAMES
e6225a0c1f8e   nginx:alpine   "/docker-entrypoint.…"   17 minutes ago   Up 17 minutes   0.0.0.0:8090->80/tcp   nginx1
95d5fedafea8   php:7.4-fpm    "docker-php-entrypoi…"   21 minutes ago   Up 20 minutes   9000/tcp               php

4.配置 nginx

进入容器内修改配置文件

[root@Docker ~]# docker exec -it nginx1 sh
/ # vi /etc/nginx/conf.d/default.conf
location ~ \.php$ {                                                 
    root           /var/www/html; # php server dir                  
    fastcgi_pass   php:9000;                                        
    fastcgi_index  index.php;                                       
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;   
    include        fastcgi_params;                                  
} 

注意: /var/www/html 是 php 容器内的路径。

在容器内执行如下命令,重新加载配置文件

nginx -s reload

然后访问

curl 127.0.0.1/index.php
<!DOCTYPE html>
<html>
<head>
        <title>PHP 动态网站</title>
</head>
<body>
  <h1>neko</h1></body>
</html>

最后在宿主机终端上访问

curl 127.0.0.1:8090/index.php
<!DOCTYPE html>
<html>
<head>
        <title>PHP 动态网站</title>
</head>
<body>
  <h1>neko</h1></body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值