本篇是实际项目中,使用到docker-compose这个东西,又补习了卷的概念。于是重新学了一下。记载下来。
卷
首先说一下这个卷是干啥用的。
主机中的文件映射到容器里。达到主机改动文件,容器也能得到改动。还能达到持久化的作用。
拿nginx来举例。nginx配置了一个server,这个server指定的了一个文件的目录。然后把nginx起起来了。我们访问nginx配置的server域名做web开发。而此时我们想改代码是需要在nginx这个docker起的容器里面修改代码的。docker exec -it nginx bash 进去nginx,然后改改改。然后我们想移植到其他服务器上时,就只能把这个容器commit成一个镜像,然后push到私服,然后其他服务器再拉下来,然后改改改。
上述这个过程缺点太多了,比如数据没有持久化,比如commit造成镜像的一步步臃肿等等。
代替的,我们可以使用卷。将上述server配置的root文件夹由宿主机映射进去,宿主机是从git拉的代码(如果你想说,刚刚也可以Git啊,我觉得需要注意docker的使用建议。尽量保持镜像提供单一服务),然后直接映射进容器的对应目录了。不需要exec操作。还能保证数据在服务器持久化了。
真实操作一下
1.下面这行命令会将容器中的 /etc/nginx 目录映射到 /var/lib/docker/volumes/volumeTest/_data 中
docker run -p 81:80 -d --name nginx81 -v volumeTest:/etc/nginx nginx:80
volumeTest是随便起的名,如果不写绝对路径会映射本地的docker设置的默认位置
查看 volumeTest 这个卷
docker volume inspect volumeTest
[
{
"CreatedAt": "2019-12-16T15:23:30+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/volumeTest/_data",
"Name": "volumeTest",
"Options": null,
"Scope": "local"
}
]
卷像是一个链接。 文件权限是与docker container 共享的。
2.在卷host映射的目录改 chmod 777 nginx.conf docker exec 看 /etc/nginx 也是发生改变了的。
3.下面这个命令是将宿主机的 /home/zy/docker/nginx81_test 目录映射到容器中的 /etc/nginx
重点: 这么写会覆盖掉容器中 /etc/nginx 下的数据为nginx81_test目录中的数据。
docker run -p 82:80 -d --name nginx82 -v /home/zy/docker/nginx81_test:/etc/nginx nginx:80
所以如上这个这么写 nginx是跑不起来的。
docker run -p 82:80 -d --name nginx82 -v /home/zy/docker/nginx81_test:/etc/nginx/test nginx:80
这个命令就可以测试宿主机真的和容器中的/etc/nginx/test目录映射上了。
我们可以在宿主机直接操作 /home/zy/docker/nginx81_test 就可以将改动映射进容器nginx82 而不用exec进入容器
4.以上宿主机和容器中的目录都会被创建。 而且容器中的目录会被宿主机中的目录覆盖掉。 即宿主机中的文件夹永远会覆盖掉容器中的文件夹。
对于文件挂载
(1)禁止将不存在的文件挂载进container中已经存在的文件上
(2)存在的文件挂载进container中将会覆盖container中对应的文件, 若文件不存在则新建
对于文件挂载的应用场景,可以修改配置文件。然后restart docker container
对于文件夹挂载一般挂载的是日志文件。
5.改user/group 这个与UID有关 /etc/passwd /etc/group中的那个数字
容器指定的UID映射成宿主机对应的UID 这样对应的用户很有可能是不一样的。
6.宿主机的挂载目录,即使docker container 删除了也是存在的。 删之前啥样,删之后啥样。
7.注意容器的目录不能是相对目录
8.dockerfile的方式挂载数据卷的时候使用volume 关键字 但是只能生成随机的目录,不能生成指定的目录。
Docker-compose
简单介绍一下项目中会使用到的属性。
1.安装
sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2.给compose权限
sudo chmod +x /usr/local/bin/docker-compose
3.卸载 docker-compose
sudo rm /usr/local/bin/docker-compose
4.看docker的版本
docker-compose version
/etc/docker/daemon.json 是docker的配置文件
5.docker-compose 写完docker-compose.yml文件后,只需执行 docker-compose up -d 命令会进行构建镜像,创建服务,启动服务等等一系列操作。
https://yeasy.gitbooks.io/docker_practice/appendix/command/docker.html 里面有图不错的。
6.docker-compose.yml文件的一些参数。 docker-compose.yml文件会动态读取系统环境变量和当前目录下的.env文件中的变量 ${var_name}使用、
7.下面是yml常使用的属性。
version: "2" #指定使用docker-compose的版本
services: #固定
web: #子集
image: nginx:latest #要拉的镜像。本地不存在,compose会拉取。
# build: #build 可以指定所需构建镜像的dockerfile目录 如果仅指定dockerfile的位置可以直接 build . 这样,还有其他操作就细分context等。
# context: ./docker/ #context 指定所需构建镜像的dockerfile目录
ports: #配置端口
- "80:80" # - 在yml中是list
restart: always #down 掉重启 指定容器退出后的重启策略为始终重启
volumes: #映射的数据卷
- ./app:/www/web
- ./nginx/conf:/etc/nginx
- ./nginx/logs:/www/web_logs
container_name: web-nginx #启动的container名称
networks: #配置容器连接的网络
- code-network
depends_on: #当前子集web 所依赖的服务 需要注意不会等到依赖服务完全启动才启动当前服务。
- php
env_file:
- ./comm.env #env_file文件可以使用docker-compose -f xx.yml指定的配置文件的目录。这个可以使用environment设置变量。
mysql:
# build:
# context: ./docker_file/mysql
image: mysql:5.7.23
container_name: mysql
ports:
- "3306:3306"
volumes:
- /data/mysql/data:/var/lib/mysql
- /data/mysql/conf.d:/etc/mysql/conf.d
restart: always
environment:
- MYSQL_ROOT_PASSWORD=test #设置变量
networks:
- code-network
networks: #设置当前的这个compose的网络名称及使用的网络连接方式是bridge
code-network:
driver: bridge
Docker 命令图
图片来源:https://yeasy.gitbooks.io/docker_practice/appendix/command/docker.html