欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

测试开发进阶(四十四)

程序员文章站 2022-04-10 20:59:04
...

运行一个页面

index.html

  1. <html lang="en">

  2. <head>

  3. <meta charset="UTF-8">

  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  5. <meta http-equiv="X-UA-Compatible" content="ie=edge">

  6. <title>「测试游记」</title>

  7. </head>

  8. <body>

  9. <h1>「测试游记」</h1>

  10. </body>

  11. </html>

运行nginx

  1. $ docker run --name my_web -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6688:80 nginx:alpine

测试开发进阶(四十四)

查看Docker网络信息

  1. $ docker inspect my_web

  2. "Networks": {

  3. "bridge": {

  4. "IPAMConfig": null,

  5. "Links": null,

  6. "Aliases": null,

  7. "NetworkID": "df9d31e0e839edd40d10b32b0459fc178efc4a7d22ee9d06090e7c47dd135bfc",

  8. "EndpointID": "c905dc6442971d9e6a2b36581f7081b0bf976aec477fe01dd0596cbed7647de0",

  9. "Gateway": "172.17.0.1",

  10. "IPAddress": "172.17.0.2",

  11. "IPPrefixLen": 16,

  12. "IPv6Gateway": "",

  13. "GlobalIPv6Address": "",

  14. "GlobalIPv6PrefixLen": 0,

  15. "MacAddress": "02:42:ac:11:00:02",

  16. "DriverOpts": null

  17. }

  18. }

  19. $ docker exec -it my_web ip a

  20. inet 127.0.0.1/8 scope host lo

  21. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

测试开发进阶(四十四)

network

docker0

默认容器与宿主机之间沟通的桥梁

网络类型

  • bridge(默认)

nat网络模型,虚拟路由器

  • host

与宿主机共享网络 --net=host

  • none

不配置网络 --net=none

  • overlay

不同网络进行通信

与一同容器共享网络 --net=container:容器名

查看docker网络列表

  1. $ docker network ls

  2. NETWORK ID NAME DRIVER SCOPE

  3. df9d31e0e839 bridge bridge local

  4. b58ef02d2c13 host host local

  5. 544544bfb357 none null local

测试开发进阶(四十四)

创建一个网络

  1. $ docker network create my_net

测试开发进阶(四十四)

在该网络下创建两个容器

  1. $ docker run --name my_web1 --network my_net -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine

  2. $ docker run --name my_web2 --network my_net -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6690:80 nginx:alpine

查看当前创建的网络

  1. $ docker network inspect my_net

测试开发进阶(四十四)

可以发现

  • my_web1的网络地址为 172.18.0.2/16

  • my_web2的网络地址为 172.18.0.3/16

测试一下两者是否相通

  1. $ docker exec -it my_web1 ping -c2 172.18.0.3

  2. $ docker exec -it my_web2 ping -c2 172.18.0.2

  3. # 还可以通过容器名访问

  4. $ docker exec -it my_web2 ping -c2 my_web1

  5. $ docker exec -it my_web1 ping -c2 my_web2

测试开发进阶(四十四)

使用host

与宿主机网络完全一致

  1. $ docker run --name my_web3 --network host -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine

  2. $ docker exec -it my_web3 ip a

测试开发进阶(四十四)

使用none

  1. $ docker run --name my_web4 --network none -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine

  2. $ docker exec -it my_web4 ip a

测试开发进阶(四十四)

批量删除my_web

  1. $ docker rm -f $(docker ps|awk '/my_web/ {print $1}')

批量删除Exited的内容

  1. $ docker rm -f $(docker ps -a|awk '/Exited/ {print $1}')

volume

  • 使用数据卷实现数据持久化

  • 数据备份/数据共享

搭建一个个人博客

运行mysql

-e环境变量

-d后台执行

  1. $ docker run --name mydb --network my_net -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

运行wordpress

  1. $ docker run --name myblog --network my_net -d -e WORDPRESS_DB_HOST=mydb -e WORDPRESS_DB_PASSWORD=123456 -p 6688:80 wordpress

测试开发进阶(四十四)

测试开发进阶(四十四)

测试开发进阶(四十四)

创建数据卷

  1. $ docker volume create myvol

与数据库映射

  1. $ docker run --name mydb --network my_net -e MYSQL_ROOT_PASSWORD=123456 -d -v myvol:/var/lib/mysql mysql:5.7

mysql产生的数据会自动同步到数据卷

这样删除 mydb也可以恢复数据

查看数据卷

  1. $ docker volume inspect myvol

  2. [

  3. {

  4. "CreatedAt": "2019-12-05T16:24:37Z",

  5. "Driver": "local",

  6. "Labels": {},

  7. "Mountpoint": "/var/lib/docker/volumes/myvol/_data",

  8. "Name": "myvol",

  9. "Options": {},

  10. "Scope": "local"

  11. }

  12. ]

测试开发进阶(四十四)

使用管理员账号进入 /var/lib/docker/volumes/myvol/_data可以查看存储的数据

删除数据卷

  1. $ docker volume rm myvol

Dockerfile

fun.py

  1. from cowpy import cow

  2. print(cow.milk_random_cow("Hello,Everyone"))

requirements.txt

  1. cowpy==1.1.0

Dockerfile

  1. FROM python:alpine

  2. LABEL maintainer="zhongxin <aaa@qq.com>"

  3. LABEL description="This is simple example."

  4. WORKDIR /app

  5. COPY requirements.txt ./

  6. RUN pip install --no-cache-dir -r requirements.txt

  7. COPY . .

  8. CMD ["python","fun.py"]

创建

  1. $ docker build ./ -t animal

使用

  1. $ docker run --name animal --rm animal

测试开发进阶(四十四)

关键字

  • 使用 FROM来指定base image镜像(在base image的基础上来操作),放在首行

  • LABEL指明作者,不执行的指令

  • WORKDIR相当于 cd命令,如果进入的目录不存在,会创建

  • COPY相当于 cp命令,宿主机中的内容「前」 复制到 容器中「后」

  • ./为当前目录 WORKDIR

  • ADDCOPY命令类似,他会将一个压缩文件解压后,复制到容器中

  • RUN在容器中执行linux命令需要使用RUN

  • 可以执行多个 RUN

  • COPY..把相对于Dockerfile文件所在路径的所有文件拷贝到容器的当前目录

  • CMD当镜像运行的时候会默认执行的命令

RUN

在已存在的image顶层执行命令,创建一个新的layer层

往往将需要安装的依赖,使用一个RUN来创建。多个命令可以用 &&来拼接

ENV

在容器内创建环境变量

  1. ENV username=zhongxin \

  2. password=123456

VOLUME

VOLUME命令指定的目录「容器中」才能被映射

EXPOSE

将容器中的端口暴露出来

ENTRYPOINT 和 CMD

不同点

CMD

  • 运行容器时,不加任何参数,会自动执行CMD,如果添加参数会忽略CMD

  • 有多个CMD,则只有最后一个会执行,其他都被忽略

  • 可以给ENTRYPOINT传参

CMD["p1","p2"]

如果ENTRYPOINT使用shell格式,CMO会被忽略

如果ENTRYPOINT使用exec格式,CMO会和它进行组合

ENTRYPOINT

  • 运行容器时,如果添加参数不会忽略ENTRYPOINT

相同点

  • 只有1个CMD或者ENTRYPOINT时,没有区别

  • shell格式和exec格式

shell格式:ls /

exec格式:["ls","/"]

一定要「双引号」

CMD和ENTRYPOINT一起使用的时候,

  • 不入参为ENTRYPOINT+CMD

  • 入参为为ENTRYPOINT+参数