docker使用筆記


本文為作者原創,轉載請注明出處: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 節


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM