Docker容器与主机映射相关&docker-compose

本篇是实际项目中,使用到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 命令图

docker-command

 

 

图片来源:https://yeasy.gitbooks.io/docker_practice/appendix/command/docker.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章