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

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