测试开发进阶(四十四)
运行一个页面
index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>「测试游记」</title>
</head>
<body>
<h1>「测试游记」</h1>
</body>
</html>
运行nginx
$ docker run --name my_web -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6688:80 nginx:alpine
查看Docker网络信息
$ docker inspect my_web
-
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "df9d31e0e839edd40d10b32b0459fc178efc4a7d22ee9d06090e7c47dd135bfc",
"EndpointID": "c905dc6442971d9e6a2b36581f7081b0bf976aec477fe01dd0596cbed7647de0",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
-
$ docker exec -it my_web ip a
-
inet 127.0.0.1/8 scope host lo
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网络列表
$ docker network ls
-
NETWORK ID NAME DRIVER SCOPE
df9d31e0e839 bridge bridge local
b58ef02d2c13 host host local
544544bfb357 none null local
创建一个网络
$ docker network create my_net
在该网络下创建两个容器
$ docker run --name my_web1 --network my_net -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine
$ docker run --name my_web2 --network my_net -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6690:80 nginx:alpine
查看当前创建的网络
$ docker network inspect my_net
可以发现
my_web1
的网络地址为172.18.0.2/16
my_web2
的网络地址为172.18.0.3/16
测试一下两者是否相通
$ docker exec -it my_web1 ping -c2 172.18.0.3
$ docker exec -it my_web2 ping -c2 172.18.0.2
# 还可以通过容器名访问
$ docker exec -it my_web2 ping -c2 my_web1
$ docker exec -it my_web1 ping -c2 my_web2
使用host
与宿主机网络完全一致
$ docker run --name my_web3 --network host -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine
$ docker exec -it my_web3 ip a
使用none
$ docker run --name my_web4 --network none -d -v $PWD/index.html:/usr/share/nginx/html/index.html -p 6689:80 nginx:alpine
$ docker exec -it my_web4 ip a
批量删除my_web
$ docker rm -f $(docker ps|awk '/my_web/ {print $1}')
批量删除Exited的内容
$ docker rm -f $(docker ps -a|awk '/Exited/ {print $1}')
volume
使用数据卷实现数据持久化
数据备份/数据共享
搭建一个个人博客
运行mysql
-e
环境变量
-d
后台执行
$ docker run --name mydb --network my_net -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
运行wordpress
$ docker run --name myblog --network my_net -d -e WORDPRESS_DB_HOST=mydb -e WORDPRESS_DB_PASSWORD=123456 -p 6688:80 wordpress
创建数据卷
$ docker volume create myvol
与数据库映射
$ docker run --name mydb --network my_net -e MYSQL_ROOT_PASSWORD=123456 -d -v myvol:/var/lib/mysql mysql:5.7
mysql产生的数据会自动同步到数据卷
这样删除 mydb
也可以恢复数据
查看数据卷
$ docker volume inspect myvol
-
[
{
"CreatedAt": "2019-12-05T16:24:37Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvol/_data",
"Name": "myvol",
"Options": {},
"Scope": "local"
}
]
使用管理员账号进入 /var/lib/docker/volumes/myvol/_data
可以查看存储的数据
删除数据卷
$ docker volume rm myvol
Dockerfile
fun.py
from cowpy import cow
-
print(cow.milk_random_cow("Hello,Everyone"))
requirements.txt
cowpy==1.1.0
Dockerfile
FROM python:alpine
LABEL maintainer="zhongxin <aaa@qq.com>"
LABEL description="This is simple example."
-
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
-
CMD ["python","fun.py"]
创建
$ docker build ./ -t animal
使用
$ docker run --name animal --rm animal
关键字
使用
FROM
来指定base image镜像(在base image的基础上来操作),放在首行LABEL
指明作者,不执行的指令WORKDIR
相当于cd
命令,如果进入的目录不存在,会创建COPY
相当于cp
命令,宿主机中的内容「前」 复制到 容器中「后」./
为当前目录WORKDIR
ADD
和COPY
命令类似,他会将一个压缩文件解压后,复制到容器中RUN
在容器中执行linux命令需要使用RUN可以执行多个
RUN
COPY..
把相对于Dockerfile文件所在路径的所有文件拷贝到容器的当前目录CMD
当镜像运行的时候会默认执行的命令
RUN
在已存在的image顶层执行命令,创建一个新的layer层
往往将需要安装的依赖,使用一个RUN来创建。多个命令可以用 &&
来拼接
ENV
在容器内创建环境变量
ENV username=zhongxin \
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+参数
下一篇: 自定义mybatis