本篇是實際項目中,使用到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