docker privileged作用_docker总结
docker基本命令
是一個開源的應用容器引擎;是一個輕量級容器技術;
docker主機(Host):安裝了Docker程序的機器(Docker直接安裝在操作系統(tǒng)之上);
docker客戶端(Client):連接docker主機進行操作;
docker倉庫(Registry):用來保存各種打包好的軟件鏡像;
docker鏡像(Images):軟件打包好的鏡像;放在docker倉庫中;
docker容器(Container):鏡像啟動后的實例稱為一個容器;容器是獨立運行的一個或一組應用
docker引擎
鏡像操作
知乎不支持表格所以只能這樣
容器操作
運行容器
docker run [選項] 鏡像名 選項 -d 后臺運行 -it 提供容器交互 --name 設置容器名 --cpus 設置cpu個數(shù) --env 設置環(huán)境變量 --mount type=bind,source=/root/target,target=/app或者--mount type=tmpfs,destination=/app --volume <host>:<container>:[rw|ro]掛載一個磁盤卷 例如 --volume /home/hyzhou/docker:/data:rw --restart 設置重啟策略on-failure,no,always --privileged 使用該參數(shù),container內的root擁有真正的root權限。否則,container內的root只是外部的一個普通用戶權限。privileged啟動的容器,可以看到很多host上的設備,并且可以執(zhí)行mount。甚至允許你在docker容器中啟動docker容器。volume bind-mount tmpfs-mount
Volumes和Bind mounts模式使我們能夠在宿主機和容器間共享文件從而我們能夠將數(shù)據(jù)持久化到宿主機上,以避免寫入容器存儲層帶來的容器停止后數(shù)據(jù)的丟失的問題。
tmpfs mounts,顧名思義,是一種非持久化的數(shù)據(jù)存儲。它僅僅將數(shù)據(jù)保存在宿主機的內存中,一旦容器停止運行,tmpfs mounts會被移除,從而造成數(shù)據(jù)丟失。
一個簡單區(qū)分volumes,bind mounts和tmpfs mounts不同點的方法是:思考數(shù)據(jù)在宿主機上是如何存在的。
- Volumes由Docker管理,存儲在宿主機的某個地方(在linux上是/var/lib/docker/volumes/)。非Docker應用程序不能改動這一位置的數(shù)據(jù)。Volumes是Docker最好的數(shù)據(jù)持久化方法。
- Bind mounts的數(shù)據(jù)可以存放在宿主機的任何地方。數(shù)據(jù)甚至可以是重要的系統(tǒng)文件或目錄。非Docker應用程序可以改變這些數(shù)據(jù)。
- tmpfs mounts的數(shù)據(jù)只存儲在宿主機的內存中,不會寫入到宿主機的文件系統(tǒng)。
詳細區(qū)別https://michaelyou.github.io/2017/09/17/Docker%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86-Volume%EF%BC%8C-bind-mount%E5%92%8Ctmpfs-mount/
Dockerfile
DockerFile
# 使用官方提供的 Python 開發(fā)鏡像作為基礎鏡像 FROM python:2.7-slim # 將工作目錄切換為 /app WORKDIR /app # 將當前目錄下的所有內容復制到 /app 下 ADD . /app # 使用 pip 命令安裝這個應用所需要的依賴 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 允許外界訪問容器的 80 端口 EXPOSE 80 # 設置環(huán)境變量 ENV NAME World # 設置容器進程為:python app.py,即:這個 Python 應用的啟動命令 CMD ["python", "app.py"]其中,RUN 原語就是在容器里執(zhí)行 shell 命令的意思。
而 WORKDIR,意思是在這一句之后,Dockerfile 后面的操作都以這一句指定的 /app 目錄作為當前目錄。
Dockerfile中的ENTRYPOINT指令和CMD指令都可以設置容器啟動時要執(zhí)行的命令,但用途是有略微不同的。
cmd : cmd給出的是一個容器的默認的可執(zhí)行體。也就是容器啟動以后,默認的執(zhí)行的命令。重點就是這個“默認”。意味著,如果docker run沒有指定任何的執(zhí)行命令或者dockerfile里面也沒有entrypoint,那么,就會使用cmd指定的默認的執(zhí)行命令執(zhí)行。可以被docker run 語句覆蓋。
entrypoint : 是真正的容器啟動以后要執(zhí)行命令。不會被docker run 語句覆蓋。
所以,到了最后的 CMD,意思是 Dockerfile 指定 python app.py 為這個容器的進程。這里,app.py 的實際路徑是 /app/app.py。所以,CMD [“python”, “app.py”] 等價于 "docker run python app.py"。另外,在使用 Dockerfile 時,你可能還會看到一個叫作 ENTRYPOINT 的原語。實際上,它和CMD 都是 Docker 容器進程啟動所必需的參數(shù),完整執(zhí)行格式是:“ENTRYPOINT CMD”。
但是,默認情況下,Docker 會為你提供一個隱含的 ENTRYPOINT,即:/bin/sh -c。所以,在不指定 ENTRYPOINT 時,比如在我們這個例子里,實際上運行在容器里的完整進程是:/bin/sh -c “python app.py”,即 CMD 的內容就是 ENTRYPOINT 的參數(shù)。
備注:基于以上原因,我們后面會統(tǒng)一稱 Docker 容器的啟動進程為ENTRYPOINT,而不是 CMD。
需要注意的是,Dockerfile 里的原語并不都是指對容器內部的操作。就比如ADD,它指的是把當前目錄(即 Dockerfile 所在的目錄)里的文件,復制到指定容器內的目錄當中。
讀懂這個 Dockerfile 之后,我再把上述內容,保存到當前目錄里一個叫“Dockerfile”的文件中:
$ ls Dockerfile app.py requirements.txt接下來,我就可以讓 Docker 制作這個鏡像了,在當前目錄執(zhí)行:
docker build -t helloworld .其中,-t 的作用是給這個鏡像加一個 Tag,即:起一個好聽的名字。docker build 會自動加載
當前目錄下的 Dockerfile 文件,然后按照順序,執(zhí)行文件中的原語。而這個過程,實際上可以
等同于 Docker 使用基礎鏡像啟動了一個容器,然后在容器中依次執(zhí)行 Dockerfile 中的原語。
需要注意的是,Dockerfile 中的每個原語執(zhí)行后,都會生成一個對應的鏡像層。即使原語本身
并沒有明顯地修改文件的操作(比如,ENV 原語),它對應的層也會存在。只不過在外界看來,這個層是空的。
其他字段
ARG 參數(shù)名 = 參數(shù)值
構建參數(shù)和 ENV 的效果一樣,都是設置環(huán)境變量。所不同的是,ARG 所設置的構建環(huán)境的環(huán)境變量,在將來容器運行時是不會存在這些環(huán)境變量的。
docker compose
用于定義和運行多個Docker應用程序的工具
#啟動相關服務 docker-compose up -d #編譯服務 docker-compose build . #停止相關服務 docker-compose down #刪除服務 docker-compose rm 服務名 #運行單個服務(容器) docker-compose run 服務名Compose 使用的三個步驟:
- 使用 Dockerfile 定義應用程序的環(huán)境。
- 使用 docker-compose.yml 定義構成應用程序的服務,這樣它們可以在隔離環(huán)境中一起運行。
- 最后,執(zhí)行 docker-compose up 命令來啟動并運行整個應用程序。
quick start
1、準備
創(chuàng)建一個測試目錄:
$ mkdir composetest $ cd composetest在測試目錄中創(chuàng)建一個名為 app.py 的文件,并復制粘貼以下內容:
import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/') def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.n'.format(count)在此示例中,redis 是應用程序網絡上的 redis 容器的主機名,該主機使用的端口為 6379。
在 composetest 目錄中創(chuàng)建另一個名為 requirements.txt 的文件,內容如下:
flask redis2、創(chuàng)建 Dockerfile 文件
在 composetest 目錄中,創(chuàng)建一個名為的文件 Dockerfile,內容如下:
FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["flask", "run"]3、創(chuàng)建 docker-compose.yml
在測試目錄中創(chuàng)建一個名為 docker-compose.yml 的文件,然后粘貼以下內容:
# yaml 配置 version: '3' services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"4、使用 Compose 命令構建和運行您的應用
在測試目錄中,執(zhí)行以下命令來啟動應用程序:
docker-compose up如果你想在后臺執(zhí)行該服務可以加上 -d 參數(shù):
docker-compose up -d(目錄下要有Dockerfile,docker-compose.yml,其他需要用到的文件)
nvidia-docker
運行容器
# --shm-size 16G將tmpfs的大小改為16G(內存空間) docker run --runtime=nvidia --gpus all --shm-size 16G -it -d --name 容器名 鏡像名/dev/shm/介紹:
/dev/shm/是linux下一個非常有用的目錄,因為這個目錄不在硬盤上,而是在內存里。默認系統(tǒng)就會加載/dev/shm ,它就是所謂的tmpfs
總結
以上是生活随笔為你收集整理的docker privileged作用_docker总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: build 之前执行task_浅谈VS编
- 下一篇: 判读一个对象不为空_“人不为己,天诛地灭