本文為作者原創,轉載請註明出處:https://www.cnblogs.com/leisure_chn/p/14349287.html
本文用到的符號說明:
<container> 容器名,形如 tiangolo/nginx-rtmp 或 nginx 等
<img> 映象名,形如 ubuntu:16.04 或 ubuntu 等
<container_id> 容器 id,形如 8648e373168c
<img_id> 映象 id,形如 52b18ed2d4bf
<tag> 映象標籤,形如 0.2, 0.3
1. 容器
1.1 檢視容器
檢視當前處於執行狀態的容器:
docker ps
檢視所有容器:
docker ps -a
1.2 啟動/停止容器
docker start <container>
docker stop <container>
docker start ffmpeg-centos-0.2
docker stop ffmpeg-centos-0.2
1.3 建立容器
語法:
docker run [OPTIONS] <img> [COMMAND] [ARG...]
-a stdin: 指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
-d: 後臺執行容器,並返回容器ID;
-i: 以互動模式執行容器,通常與 -t 同時使用;
-p: 埠對映,格式為:主機(宿主)埠:容器埠
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
-h: 容器裡的主機名(hostname)
--name="<container>": 為容器指定一個名稱;
例項:
基於映象建立容器,容器在前臺執行,在容器中執行 exit 後容器將變為停止狀態:
docker run -it --name <container> <img> bash
docker run -it --name <container> <img>:<tag> bash
docker run -it --name ffmpeg-centos-0.2 ffmpeg-centos:0.2 bash
基於映象建立容器,容器在後臺執行,在容器中執行 exit 後容器仍處於執行狀態:
docker run -itd --name ffmpeg-centos-0.2 ffmpeg-centos:0.2 bash
基於映象建立容器,容器在前臺執行,將宿主機上 /home/think/work 目錄對映為容器中的 /work 目錄:
docker run -it -v /home/frank/work:/work --name ffmpeg-centos-0.2 ffmpeg-centos:0.2 bash
基於映象建立容器,容器在前臺執行,將宿主機上 60084 埠對映為容器中的 80 埠:
docker run -it -p 60084:80 --name ffmpeg-centos-0.2 ffmpeg-centos:0.2 bash
1.4 進入容器
語法:
docker exec [OPTIONS] <container> COMMAND [ARG...]
-d: 分離模式: 在後臺執行
-i: 即使沒有附加也保持 STDIN 開啟
-t: 分配一個偽終端
例項:
進入容器並開啟容器中的 bash:
docker exec -it <container> bash
docker exec -it ffmpeg-centos-0.2 bash
進入容器後,在容器中執行 exit 將退出容器進入主機環境,但容器並不會停止。
如果加 -d 引數,無法進入容器中操作 bash,此命令執行完,仍在宿主機 bash 中。
docker exec -itd <container> bash
所以 -d 引數目前看來沒什麼用,待研究。
1.5 檢視容器資訊
檢視容器資訊,諸如 IP、對映目錄等
docker inspect <container>
docker inspect ffmpeg-centos-0.2
1.6 重新命名容器
docker rename <container1> <container2>
docker rename ffmpeg-centos-debug ffmpeg-centos-0.2
1.7 刪除容器
刪除處於停止狀態的容器
docker rm <container>
docker rm ffmpeg-centos-0.2
2. 映象
2.1 檢視映象
docker images
2.2 拉取映象
從 docker 的網路映象倉庫拉取映象到本地:
docker pull <img>
docker pull <img>:<tag>
docker pull centos:7.2.1511
2.3 刪除映象
docker rmi <img>
docker rmi ffmpeg-centos:0.2
2.4 重新命名映象
docker tag <img_id> <img>:<tag>
docker tag 8648e373168c ffmpeg-centos:0.2
2.4 基於容器製作映象
docker commit -m "comment" -a "author" <container> <img>:<tab>
docker commit -m "comment" -a "author" <container_id> <img>:<tab>
docker commit -m "2nd version" -a "frank" ffmpeg-centos-0.2 ffmpeg-centos:0.2
2.5 匯出映象
docker save <img>:<tag> | gzip > <xxx>.tar.gz
docker save ffmpeg-centos:0.2 | gzip > docker-img-ffmpeg-centos-0.2.tar.gz
2.6 匯入映象
gunzip -c <xxx>.tar.gz | docker load
gunzip -c docker-img-ffmpeg-centos-0.2.tar.gz | docker load
3. 設定
3.1 普通使用者免 sudo 使用 docker
輸入以下命令,將當前使用者新增到 docker 組,即可免 sudo 使用 docker:
sudo gpasswd -a ${USER} docker
注意:上述命令列中的 ${USER} 將獲取到當前使用者名稱,當前使用者是 frank,就是將 frank 新增到 docker 組,當前使用者是 root,就是將 root 使用者新增到 docker 組。當然也可手動指定使用者名稱將其新增其到 docker 組,如當前使用者是 root,執行 gpasswd -a frank docker
即可。
3.2 設定映象加速
docker映象源位於美國,拉取映象非常緩慢。可配置國內映象源,加快映象拉取速度。
修改 /etc/docker/daemon.json 檔案並新增上 registry-mirrors 鍵值:
{
"registry-mirrors":
[
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]
}
上述配置檔案新增了四個國內映象源:docker 中國、清華、163 和騰訊。
修改上述配置檔案後重啟docker服務:
systemctl restart docker
4. 進階用法
4.1 將主機上普通使用者對映進容器
預設情況下,使用 docker run --privileged=true
命令以特權方式建立的容器,容器裡的使用者名稱是 root,具有完整的 root 許可權;使用 docker run
命令以非特權方式建立的容器,容器裡的使用者名稱也是 root,但此 root 使用者實際相當於主機上執行 docker run
命令的使用者(例如普通使用者 frank),容器中名為 root 的使用者並不具備 root 許可權,但是容器中新建立的檔案屬主卻為 root,這樣主機中的非 root 使用者訪問這些檔案時常常許可權不足,造成不便。
為解決此問題,需要將主機上的當前普通使用者對映進容器中,且使容器中的普通使用者同樣具有執行 sudo 的許可權,建立容器的命令如下:
docker run --user $(id -u ${USER}):$(id -g ${USER}) \
-v /etc/sudoers.centos8.2:/etc/sudoers:ro \
-v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro \
-v /etc/shadow:/etc/shadow:ro \
-v ${HOME}:${HOME} -w ${HOME} \
-it --name=ffmpeg-centos8.2-0.2-frank -h DK-FFMPEG-02-FRANK ffmpeg-centos8.2:0.2 bash
不同作業系統 sudoers 檔案內容會有差別,例如主機系統為 openSUSE Leap 15.2,容器系統為 CentOS 8.2,那麼是不能將主機系統中的 sudoers 檔案對映進容器裡的,起碼會有警告,所以從 CentOS 8.2 系統裡拷貝預設的 sudoers 檔案放到主機中,重新命名為 /etc/sudoers.centos8.2,此檔案對映進 ffmpeg-centos8.2-0.2-frank 容器,即用此檔案來設定此容器中使用者的 sudo 許可權。
4.2 清理磁碟空間
docker system prune
待補充
4.3 多階段構建
利用 BuildKit 元件使用 docker 多階段構建特性,要求 docker 版本不低於 v18.06
DOCKER_BUILDKIT=1 docker build --no-cache -f dockerfiles/dockerfile-ffmpeg-centos-multi -t ffmpeg:0.4 .
待補充
5. 修改記錄
2020-07-09 初稿
2020-11-05 增加 4.1 節