Docker 快速入门Ubuntu版(1h速通)
写在前面,本教程主要参考Docker get started,ChatGPT-4o
的回答,以及网络上查找到的其他资料,这里主要是记录了笔者的学习过程,难免会有批漏,还烦请请各位指出。
另外,我使用的系统为ubuntu20.04
,请大家注意区别。
如果您在查看的时候遇到了问题,请在其他问题进行查找。
文章目录
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 processors
modprobe 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:1
FROM 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