测试开发进阶(四十四)
运行一个页面
index.html
1 | <html lang="en"> |
运行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 |
network
docker0
默认容器与宿主机之间沟通的桥梁
网络类型
- bridge(默认)
nat网络模型,虚拟路由器
- host
与宿主机共享网络--net=host
- none
不配置网络--net=none
- overlay
不同网络进行通信
与一同容器共享网络--net=container:容器名
查看docker网络列表
1 | docker network ls |
创建一个网络
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 |
查看当前创建的网络
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 |
使用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 |
使用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 |
批量删除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 |
使用管理员账号进入/var/lib/docker/volumes/myvol/_data
可以查看存储的数据
删除数据卷
1 | docker volume rm myvol |
Dockerfile
fun.py
1 | from cowpy import cow |
requirements.txt
1 | cowpy==1.1.0 |
Dockerfile
1 | FROM python:alpine |
创建
1 | docker build ./ -t animal |
使用
1 | 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
在容器内创建环境变量
1 | ENV username=zhongxin \ |
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+参数