前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker使用笔记

docker使用笔记

作者头像
叶余
发布2021-02-04 11:23:37
6480
发布2021-02-04 11:23:37
举报
文章被收录于专栏:音视频开发技术

本文用到的符号说明:

代码语言:javascript
复制
<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 查看容器

查看当前处于运行状态的容器:

代码语言:javascript
复制
docker ps

查看所有容器:

代码语言:javascript
复制
docker ps -a

1.2 启动/停止容器

代码语言:javascript
复制
docker start <container>
docker stop <container>
docker start ffmpeg-centos-0.2
docker stop ffmpeg-centos-0.2

1.3 创建容器

语法:

代码语言:javascript
复制
docker run [OPTIONS] <img> [COMMAND] [ARG...]
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    -d: 后台运行容器,并返回容器ID;
    -i: 以交互模式运行容器,通常与 -t 同时使用;
    -p: 端口映射,格式为:主机(宿主)端口:容器端口
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    -h: 容器里的主机名(hostname)
    --name="<container>": 为容器指定一个名称;

实例:

基于镜像创建容器,容器在前台运行,在容器中执行 exit 后容器将变为停止状态:

代码语言:javascript
复制
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 后容器仍处于运行状态:

代码语言:javascript
复制
docker run -itd --name ffmpeg-centos-0.2 ffmpeg-centos:0.2 bash

基于镜像创建容器,容器在前台运行,将宿主机上 /home/think/work 目录映射为容器中的 /work 目录:

代码语言:javascript
复制
docker run -it -v /home/frank/work:/work --name ffmpeg-centos-0.2 ffmpeg-centos:0.2 bash

基于镜像创建容器,容器在前台运行,将宿主机上 60084 端口映射为容器中的 80 端口:

代码语言:javascript
复制
docker run -it -p 60084:80 --name ffmpeg-centos-0.2 ffmpeg-centos:0.2 bash

1.4 进入容器

语法:

代码语言:javascript
复制
docker exec [OPTIONS] <container> COMMAND [ARG...]
    -d: 分离模式: 在后台运行
    -i: 即使没有附加也保持 STDIN 打开
    -t: 分配一个伪终端

实例:

进入容器并打开容器中的 bash:

代码语言:javascript
复制
docker exec -it <container> bash
docker exec -it ffmpeg-centos-0.2 bash

进入容器后,在容器中执行 exit 将退出容器进入主机环境,但容器并不会停止。

如果加 -d 参数,无法进入容器中操作 bash,此命令执行完,仍在宿主机 bash 中。

代码语言:javascript
复制
docker exec -itd <container> bash

所以 -d 参数目前看来没什么用,待研究。

1.5 查看容器信息

查看容器信息,诸如 IP、映射目录等

代码语言:javascript
复制
docker inspect <container>
docker inspect ffmpeg-centos-0.2

1.6 重命名容器

代码语言:javascript
复制
docker rename <container1> <container2>
docker rename ffmpeg-centos-debug ffmpeg-centos-0.2

1.7 删除容器

删除处于停止状态的容器

代码语言:javascript
复制
docker rm <container>
docker rm ffmpeg-centos-0.2

2. 镜像

2.1 查看镜像

代码语言:javascript
复制
docker images

2.2 拉取镜像

从 docker 的网络镜像仓库拉取镜像到本地:

代码语言:javascript
复制
docker pull <img>
docker pull <img>:<tag>
docker pull centos:7.2.1511

2.3 删除镜像

代码语言:javascript
复制
docker rmi <img>
docker rmi ffmpeg-centos:0.2

2.4 重命名镜像

代码语言:javascript
复制
docker tag <img_id> <img>:<tag>
docker tag 8648e373168c ffmpeg-centos:0.2

2.4 基于容器制作镜像

代码语言:javascript
复制
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 导出镜像

代码语言:javascript
复制
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 导入镜像

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 键值:

代码语言:javascript
复制
{
    "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服务:

代码语言:javascript
复制
systemctl restart docker

4. 进阶用法

4.1 将主机上普通用户映射进容器

默认情况下,使用 docker run --privileged=true 命令以特权方式创建的容器,容器里的用户名是 root,具有完整的 root 权限;使用 docker run 命令以非特权方式创建的容器,容器里的用户名也是 root,但此 root 用户实际相当于主机上执行 docker run 命令的用户(例如普通用户 frank),容器中名为 root 的用户并不具备 root 权限,但是容器中新创建的文件属主却为 root,这样主机中的非 root 用户访问这些文件时常常权限不足,造成不便。

为解决此问题,需要将主机上的当前普通用户映射进容器中,且使容器中的普通用户同样具有执行 sudo 的权限,创建容器的命令如下:

代码语言:javascript
复制
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 清理磁盘空间

代码语言:javascript
复制
docker system prune

待补充

4.3 多阶段构建

利用 BuildKit 组件使用 docker 多阶段构建特性,要求 docker 版本不低于 v18.06

代码语言:javascript
复制
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 节

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 容器
    • 1.1 查看容器
      • 1.2 启动/停止容器
        • 1.3 创建容器
          • 1.4 进入容器
            • 1.5 查看容器信息
              • 1.6 重命名容器
                • 1.7 删除容器
                • 2. 镜像
                  • 2.1 查看镜像
                    • 2.2 拉取镜像
                      • 2.3 删除镜像
                        • 2.4 重命名镜像
                          • 2.4 基于容器制作镜像
                            • 2.5 导出镜像
                              • 2.6 导入镜像
                              • 3. 设置
                                • 3.1 普通用户免 sudo 使用 docker
                                  • 3.2 设置镜像加速
                                  • 4. 进阶用法
                                    • 4.1 将主机上普通用户映射进容器
                                      • 4.2 清理磁盘空间
                                        • 4.3 多阶段构建
                                        • 5. 修改记录
                                        相关产品与服务
                                        容器服务
                                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                        领券
                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档