Docker 快速入门Ubuntu版(1h速通)
写在前面,本教程主要参考Docker get started,ChatGPT-4o的回答,以及网络上查找到的其他资料,这里主要是记录了笔者的学习过程,难免会有批漏,还烦请请各位指出。
另外,我使用的系统为ubuntu20.04,请大家注意区别。
如果您在查看的时候遇到了问题,请在其他问题进行查找。
文章目录
- Docker 快速入门Ubuntu版(1h速通)
- 1. 基本概念及安装
- 1.1 Docker镜像(Image)
- 1.2 Docker容器(Container)
- 1.3 打包、分发、部署
- 1.3 安装Docker
- 2. 制作自己的镜像和运行容器
- 3. 停止容器运行和移除容器
- 常用CLI
- 其他问题
- 1. Ubuntu运行docker 权限问题Got permission denied
- 2. 添加Docker Hub镜像加速
- 3. Docker的卸载
- Reference
1. 基本概念及安装
Docker是一种用于创建、部署和运行应用程序的开源平台。它使得开发者可以将应用程序及其依赖项打包到一个名为“容器”的轻量级、可移植单元中,从而保证应用程序在不同环境中的一致运行。容器包含了应用程序的代码、运行时、系统工具、库等,确保在任何支持Docker的系统上都能运行。
简单来说Docker就是一个能跨平台(比如,windows,linux,mac等)运行的虚拟机,它只虚拟软件运行的基本环境,多余的一点都不要,而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。
Docker和普通的虚拟机virutalbox或vmware的对比如下
1.1 Docker镜像(Image)
镜像是一个静态的、只读的模板,它包含了容器运行所需的所有内容。Docker镜像类似于虚拟机的快照,提供了一种便捷的方式来创建容器。镜像可以从公共或私有的Docker注册表(如Docker Hub)中拉取。
1.2 Docker容器(Container)
容器是镜像的运行实例。它包含了应用程序及其依赖项,可以独立运行。容器是轻量的、可移植的,并且可以在开发、测试和生产环境中一致地运行。
1.3 打包、分发、部署
打包(Packaging)
打包是指将应用程序及其所有依赖项打包成一个Docker镜像的过程。这个过程通常使用Dockerfile来定义。
分发(Distribution)
分发是指将Docker镜像上传到一个镜像注册表(如Docker Hub),以便其他人可以下载和使用。
部署(Deployment)
部署是指在目标环境中运行Docker容器的过程。Docker容器可以在任何安装了Docker的机器上运行,这使得部署变得非常简单和高效。
1.3 安装Docker
如果你是初学者,建议安装带UI的桌面版本,如果你是高手,可以直接使用命令行来进行安装。因为笔者使用的是ubuntu20.04服务器版,所以我将ubuntu的服务器版的链接也放在下面,方便笔者以后查找
- 桌面版:https://www.docker.com/products/docker-desktop/
- 各种服务器版:https://docs.docker.com/engine/install/
- ubuntu服务器版:https://docs.docker.com/engine/install/ubuntu/
需要注意的是在Linux上Docker Desktop的工作方式有所不同:
- Docker Desktop在Linux上会启动一个虚拟机(VM)。
- 这个虚拟机中运行一个自定义的Docker上下文,称为
desktop-linux
因此这个虚拟机中的Docker引擎不会自动访问到本地系统中之前创建的镜像和容器。这就意味着本地系统上的Docker引擎(安装Docker Desktop之前运行的引擎)与虚拟机中的Docker引擎(Docker Desktop启动后运行的引擎)是分离的。
这里我们讲解一下在ubuntu中是如何安装docker服务器版本的,其实很简单,只要按照官网上的要求进行即可
根据之前的解释,首先我们需要先安装docker engine,网址如下:Install Docker Engine on Ubuntu
设置仓库
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc# Add the repository to Apt sources:
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装docker engine
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
测试
sudo docker run hello-world
如果出现打印的文字则表示安装成功
如果你想使用桌面版,那么在安装完docker engine之后,我们可以开始安装docker desktop,网址如下:Install Docker Desktop on Ubuntu
开启cpu虚拟化
modprobe kvm
根据你的cpu属于intel还是amd来选择语句
modprobe kvm_intel # Intel processorsmodprobe kvm_amd # AMD processors
kvm-ok
ls -al /dev/kvm
sudo usermod -aG kvm $USER
然后下载ubuntu下的.deb安装文件,下载地址:docker for ubuntu.deb
然后安装
sudo apt-get install ./docker-desktop-<version>-<arch>.deb
安装完毕后,可以在搜索框中搜到,如下所示
注:你安装了桌面版和服务器版之后你可能需要
- 将docker的上下文设置为服务器版
docker context use default
- 将docker的上下文设置为桌面版
docker context use desktop-linux
2. 制作自己的镜像和运行容器
下载docker官网上提供的示例:https://github.com/docker/getting-started-app,这个示例是基于Javascript开发的一个web项目,如果你不熟悉Javascript的话也没有关系,我们只是用这个项目来熟悉Docker的制作镜像的流程。
git clone https://github.com/docker/getting-started-app.git
我们可以自己制作一个docker镜像并运行,进入这个文件,它应该具有如下的结构
├── getting-started-app/
│ ├── package.json
│ ├── README.md
│ ├── spec/
│ ├── src/
│ └── yarn.lock
这些内容是什么我们并不关系,我们只关心如何将其打包成一个image
我们进入这个文件的存放路径
cd /path/to/getting-started-app
然后创建一个Dockerfile,docker会查找这个文件,这个文件用于定义如何构建一个Docker镜像。它包含了一系列指令,每一条指令都描述了如何构建镜像的一个步骤。我们的构建规则都写在Dockerfile中,我们可以这样创建一个Dockerfile
touch Dockerfile
gedit Dockerfile
然后向其中写入以下的内容,保存
# syntax=docker/dockerfile:1FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
接着,我们就可以构建镜像了
docker build -t getting-started .
-t是--tag的缩写,用于给新构建的镜像打标签。标签为镜像提供了一个可读的名称和版本号.表示当前目录是构建上下文。Docker会查找当前目录中的Dockerfile,并根据其中的指令构建镜像。
构建过程如下所示
构建完毕后,我们可以启动构建的image看看效果
docker run -dp 127.0.0.1:3000:3000 getting-started
-d这个选项表示“分离模式”(detached mode)。它告诉Docker在后台运行容器,这样你可以继续使用你的终端而不被容器的输出阻塞。p选项用于端口映射,它将主机的端口与容器的端口绑定在一起。具体来说:127.0.0.1:这是主机的回环地址(localhost),表示端口只在本地主机上可用,不会暴露在外部网络中。- 第一个
3000:这是主机上的端口号,你可以通过访问127.0.0.1:3000来访问容器服务。 - 第二个
3000:这是容器内部的端口号,应用程序在容器内监听的端口。
getting-started,这是你要运行的Docker镜像的名称。在这个例子中,getting-started是一个已经构建好的Docker镜像的名称。
我们访问端口http://localhost:3000/,即可看到
3. 停止容器运行和移除容器
查看当前正在运行的容器的信息
docker ps
-a或--all:显示所有容器(包括停止的容器)。-q或--quiet:只显示容器ID。--format:自定义输出格式。--filter:根据条件过滤显示的容器。
通过查找显示的ID,我们可以停止该容器的运行
docker stop <the-container-id> # 停止容器运行
对已经停止了的容器,我们可以对其进行重启
docker start <container_id_or_name>
一旦容器重启了,容器内部的状态会恢复到上次停止时的状态。运行在容器内的应用程序也会从头开始运行。
一旦容器停止了,我们就可以对其进行删除
docker rm <the-container-id> # 删除容器
比如,我这里就删除了之前已经结束运行的一个容器
…后面还有内容待补充,暂时写到这里…
常用CLI
更多相关命令请参考CLI Reference
docker ps查看当前运行中的容器docker images查看镜像列表docker rm container-id删除指定 id 的容器docker stop/start container-id停止/启动指定 id 的容器docker rmi image-id删除指定 id 的镜像docker volume ls查看 volume 列表docker network ls查看网络列表
其他问题
1. Ubuntu运行docker 权限问题Got permission denied
如果使用docker命令行的时候遇到了问题
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json": dial unix /var/run/docker.sock: connect: permission denied
See 'docker run --help'.
这是因为docker进程使用的是Unix socket而不是tcp端口,而默认情况下Unix socket需要root用户权限使用。
所以我们有两种解决方式,第一种是每次使用docker命令的时候都手动添加sudo赋给root权限,第二种把用户加入到docker用户组,这里推荐使用第二种方式
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用
还有一些别的解决方式
- 更改Docker守护进程的组所有权
sudo chown root:docker /var/run/docker.sock
- 更改Docker守护进程的访问权限
sudo chmod 666 /var/run/docker.sock
2. 添加Docker Hub镜像加速
| 镜像加速器 | 镜像加速器地址 |
|---|---|
| Docker 中国官方镜像 | https://registry.docker-cn.com |
| DaoCloud 镜像站 | http://f1361db2.m.daocloud.io |
| Azure 中国镜像 | https://dockerhub.azk8s.cn |
| 科大镜像站 | https://docker.mirrors.ustc.edu.cn |
| 阿里云 | https://ud6340vz.mirror.aliyuncs.com |
| 七牛云 | https://reg-mirror.qiniu.com |
| 网易云 | https://hub-mirror.c.163.com |
| 腾讯云 | https://mirror.ccs.tencentyun.com |
创建或者修改/etc/docker/daemon.json
sudo gedit /etc/docker/daemon.json
选择你想使用的镜像源
{"registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com",]
}
然后重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
查看配置是否正确
docker info
3. Docker的卸载
# 卸载 Docker Engine、CLI、Containerd 和 Docker Compose 软件包
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 删除所有镜像、容器和卷
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# 删除docker配置文件
sudo rm -rf ~/.docker
Reference
[1]Docker get started
[2]Docker 快速入门
[3]Install Docker Engine on Ubuntu
[4]Install Docker Desktop on Ubuntu
[5]Ubuntu运行docker 权限问题Got permission denied
