文章目录
容器技术 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.confdocker 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>