简介
Docker是操作系统层面的虚拟化技术,可以对文件系统、网络和进程进行隔离。与常见的虚拟化方式——虚拟机(Virtual Machine)不同,Docker不包含系统,只包含应用程序及其依赖,与原系统共享内核,因此更为轻量级,部署更轻便快捷。下图展示了Docker与虚拟机的对比。
下载和卸载(Ubuntu)
下载
- 下载依赖和必要工具
1
2
3sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release - 添加下载密钥
1
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 阿里云密钥
- 添加下载源
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 # 阿里云源
- 下载Docker软件包
1
2sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
卸载
1 | sudo apt-get remove docker docker-engine docker.io |
Docker启动
1 | sudo systemctl enable docker |
设置Docker用户组
下载之后的Dcoker每次使用时需要添加 sudo 权限,这一方面带来指令上的麻烦,另一方面,在使用Docker相关插件时,如VSCode Docker插件可能会遇到权限问题。为了避免这个问题,可以在ubuntu中设置docker用户组,将需要使用docker的用户加入该用户组。
1 | sudo groupadd docker # 新建 docker用户组 |
使用Docker
镜像 (Image)
Docker 镜像是一种打包好的运行环境,包含除内核外的操作系统内容。镜像的命名规则为usrname/name:tag。镜像的常见指令如下:
1 | docker image ls # 列出当前系统上的镜像文件 |
容器 (Container)
Docker 容器是镜像的示例化。镜像的常见指令如下:
- 启动容器
1
2
3docker 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
3docker container stop container_id # 停止特定ID的正在运行的容器
docker container start container_id # 启动特定ID的已终止容器
docker container restart container_id # 重启特定ID的已终止容器 - 查看容器
1
2docker container ls # 列出正在运行的容器
docker container ls -a # 列出所有容器,包含已终止容器 - 进入容器
1
2docker attach container_id # 进入特定ID的容器,此方式进入,退出会终止容器
docker exec -it container_id bash # 进入特定ID的容器,此方式进入,退出不会终止容器 - 删除容器
1
2docker container rm container_id # 删除特定ID的已终止容器
docker container prune # 删除所有已终止的容器 - 导入导出容器
1
2
3docker 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包含三个默认网络: host,none,bridge。其中bridge是默认模式,给容器分配独立的网络;host代表与主机贡献网络;none代表关闭网络功能,容器内部和外部机器/容器不能互相访问;
- 查看当前网络
1
docker network ls # 列出当前主机上的docker网络
- 启动时的网络参数
1
2docker 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
4docker 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
2docker login # 交互式登录
docker logout # 退出登录 - Docker 拉取镜像
1
2docker 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 | sudo mkdir -p /etc/systemd/system/docker.service.d # 创建配置文件夹 |
在打开的文件proxy.conf中写入
1 | [Service] |
其中127.0.0.1:7890字段需要根据自己的代理地址和端口调整。这里的127.0.0.1:7890表示代理中专的的地址是本地地址,端口是7890。在Clash中,代理默认是通过本地地址的7890端口中转的,代理端口的查看及Clash的其他相关信息可参考下载和配置Clash。
设置完成后,需要重载systemd并重启dockerd才能让配置生效:
1 | sudo systemctl daemon-reload |
Docker Build
在执行Docker Build需要下载一些外网的安装包时,可在命令里加上如下参数
1 | docker build . \ |
Docker Build指令是在一个临时容器里运行的,容器的网络默认是与本机隔绝的。这里因为需要访问本机本地地址127.0.0.1,故需要假如参数--network host,如果代理地址是非本机的本地地址,则可不用加。
在使用Dockerfile构建镜像阶段,如果不使用代理,可以将官方源头替换成国内镜像来加速apt的更新和下载。
1 | # 镜像源配置 |
Container 内部代理
在用户目录文件~/.docker/config.json中配置:
1 | { |