Dcoker用法及指令

简介

Docker是操作系统层面的虚拟化技术,可以对文件系统、网络和进程进行隔离。与常见的虚拟化方式——虚拟机(Virtual Machine)不同,Docker不包含系统,只包含应用程序及其依赖,与原系统共享内核,因此更为轻量级,部署更轻便快捷。下图展示了Docker与虚拟机的对比。

-->

下载和卸载(Ubuntu)

下载

  1. 下载依赖和必要工具
    1
    2
    3
    sudo apt update

    sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
  2. 添加下载密钥
    1
    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  # 阿里云密钥
  3. 添加下载源
    1
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  # 阿里云源
  4. 下载Docker软件包
    1
    2
    sudo apt update 
    sudo apt install docker-ce docker-ce-cli containerd.io

卸载

1
sudo apt-get remove docker docker-engine docker.io

Docker启动

1
2
sudo systemctl enable docker
sudo systemctl start docker

设置Docker用户组

下载之后的Dcoker每次使用时需要添加 sudo 权限,这一方面带来指令上的麻烦,另一方面,在使用Docker相关插件时,如VSCode Docker插件可能会遇到权限问题。为了避免这个问题,可以在ubuntu中设置docker用户组,将需要使用docker的用户加入该用户组。

1
2
sudo groupadd docker # 新建 docker用户组
sudo usermod -aG docker $USER # 将当前用户加入 docker 用户组

使用Docker

镜像 (Image)

Docker 镜像是一种打包好的运行环境,包含除内核外的操作系统内容。镜像的命名规则为usrname/name:tag。镜像的常见指令如下:

1
2
3
4
5
6
7
docker image ls # 列出当前系统上的镜像文件
docker system df # 查看镜像容器存储大小
docker image ls -q # 列出所有镜像的ID
docker image ls -a # 列出所有镜像文件,包含中间层镜像
docker image ls name # 列出特定名字的镜像
docker image rm name # 删除特定名字的镜像
docker image rm $(docker image ls -q name) # 批量删除特定名字的镜像

容器 (Container)

Docker 容器是镜像的示例化。镜像的常见指令如下:

  • 启动容器
    1
    2
    3
    docker run username/name:tag command # 基于镜像 username/name:tag 启动容器,执行command后退出
    docker run -it username/name:tag command # 以 i(容器标准输入打开), t(分配伪终端<pseudo-tty>给容器)参数启动容器
    docker run -t username/name:tag command # 以守护态运行容器,Docker会在后台运行而不是直接把命令打印在当前主机下
  • 终止和重启容器
    1
    2
    3
    docker container stop container_id # 停止特定ID的正在运行的容器
    docker container start container_id # 启动特定ID的已终止容器
    docker container restart container_id # 重启特定ID的已终止容器
  • 查看容器
    1
    2
    docker container ls # 列出正在运行的容器
    docker container ls -a # 列出所有容器,包含已终止容器
  • 进入容器
    1
    2
    docker attach container_id # 进入特定ID的容器,此方式进入,退出会终止容器
    docker exec -it container_id bash # 进入特定ID的容器,此方式进入,退出不会终止容器
  • 删除容器
    1
    2
    docker container rm container_id # 删除特定ID的已终止容器
    docker container prune # 删除所有已终止的容器
  • 导入导出容器
    1
    2
    3
    docker export 7691a814370e > docker_image.tar # 导出特定ID的容器到docker_image.tar文件
    cat docker_image.tar | docker import - username/name:tag # 从docker_image.tar文件导入为镜像username/name:tag
    docker import http://example.com/exampleimage.tgz username/name:tag # 从某链接导入为镜像username/name:tag

网络 (Network)

Docker包含三个默认网络: hostnonebridge。其中bridge是默认模式,给容器分配独立的网络;host代表与主机贡献网络;none代表关闭网络功能,容器内部和外部机器/容器不能互相访问;

  • 查看当前网络
    1
    docker network ls # 列出当前主机上的docker网络
  • 启动时的网络参数
    1
    2
    docker run --net=host -d username/name:tag # 基于镜像 username/name:tag 启动容器,设定与主机共享网络
    docker run --net=container:container_id/name -d username/name:tag # 基于镜像 username/name:tag 启动容器,设定与特定ID或者名字的容器共享网络
  • 端口设置
    1
    2
    3
    4
    docker run -d -P username/name:tag # 随机分配一个主机的端口映射到容器的80端口
    docker run -d -p ip:host_port:container_port username/name:tag # 自定义端口映射
    docker logs container_id # 查看某容器网络访问记录
    docker logs container_id host_port # 查看某容器某端口配置

仓库 (Hub)

Docker 仓库存储了大量公开的镜像。自己也可以注册,创建公开或者私有的镜像。

  • Docker Hub登录和登出
    1
    2
    docker login # 交互式登录
    docker logout # 退出登录
  • Docker 拉取镜像
    1
    2
    docker pull username/name:tag # 拉取特定镜像到本地
    docker search key # 在Docker仓库里以特定关键词搜素镜像
  • Docker 推送镜像
    1
    docker push username/name:tag #  推送镜像username/name:tag到自己仓库

网络代理 (Proxy)

网络代理可以让docker的相关指令快速便捷地访问外网资源。

Docker Pull

在执行Docker Pull时,系统会将指令发送给守护进程dockerd执行,dockerd是独立于该指令的一个进程,因此需要将代理配置在dockered环境中,进行重启,代理才能生效。这个环境由systemd管控,可修改systemd配置来设置代理。

1
2
sudo mkdir -p /etc/systemd/system/docker.service.d # 创建配置文件夹
sudo vim /etc/systemd/system/docker.service.d/proxy.conf # 打开配置文件

在打开的文件proxy.conf中写入

1
2
3
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890/"
Environment="HTTPS_PROXY=http://127.0.0.1:7890/"

其中127.0.0.1:7890字段需要根据自己的代理地址和端口调整。这里的127.0.0.1:7890表示代理中专的的地址是本地地址,端口是7890。在Clash中,代理默认是通过本地地址的7890端口中转的,代理端口的查看及Clash的其他相关信息可参考下载和配置Clash

设置完成后,需要重载systemd并重启dockerd才能让配置生效:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker Build

在执行Docker Build需要下载一些外网的安装包时,可在命令里加上如下参数

1
2
3
4
5
docker build . \
--build-arg "HTTP_PROXY=http://127.0.0.1:7890/" \
--build-arg "HTTPS_PROXY=http://127.0.0.1:7890/" \
--network host \
-t username/name:tag

Docker Build指令是在一个临时容器里运行的,容器的网络默认是与本机隔绝的。这里因为需要访问本机本地地址127.0.0.1,故需要假如参数--network host,如果代理地址是非本机的本地地址,则可不用加。

在使用Dockerfile构建镜像阶段,如果不使用代理,可以将官方源头替换成国内镜像来加速apt的更新和下载。

1
2
3
# 镜像源配置
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

Container 内部代理

在用户目录文件~/.docker/config.json中配置:

1
2
3
4
5
6
7
8
9
10
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:7890/",
"httpsProxy": "http://127.0.0.1:7890/"
}
}
}

更多参考

  1. Docker — 从入门到实践
  2. Docker Hub
  3. Jetson Container
  4. ROS Docker