Docker初识及使用研究

公司使用docker,小组成员人人都是默默使用,也没讲解培训,真是搞笑。
记录自己独自研究及使用:
1)自己安装->失败-系统弄崩->安装成功

1. Docker安装-初次安装失败

需要使用梯子访问docker官网:Install Docker Engine on Ubuntu

此处有个疑惑:Docker Engine 与Docker、DockerDesktop关系?

该页面“Install Docker Engine on Ubuntu”下,“Installation methods”描述道:
You can install Docker Engine in different ways, depending on your needs(可以根据需要以不同的方式安装Docker Engine)
1)Docker Engine comes bundled with Docker Desktop for Linux. This is the easiest and quickest way to get started.
Docker引擎捆绑了 Linux的Docker桌面。这是 最简单快捷的入门方式
2)Set up and install Docker Engine from Docker’s apt repository.
设置和安装Docker引擎 Docker的apt存储库。
3)Install it manually and manage upgrades manually.
手动安装它并手动管理升级。
4)Use a convenience script. Only recommended for testing and development environments.
使用一个 方便脚本。只有 推荐用于测试和开发环境。

按照上述说明,安装Docker Desktop是最简洁的方式,但是下载Docker Desktop.deb后安装失败,提示如下:
sudo apt-get update
sudo apt-get install ./docker-desktop-amd64.deb

The following packages have unmet dependencies:
docker-desktop : Depends: docker-ce-cli but it is not installable
E: Unable to correct problems, you have held broken packages.

官网文档,
在这里插入图片描述
我本来以为是ubuntu20的版本不对,但是也没找到适配ubuntu20的版本,此处有些疑惑?

搜索问题Unable to install Docker Desktop on Ubuntu 22.04

Docker Desktop has a dependency on the docker CLI, which requires the download.docker.com package repository to be set up before installing the docker-desktop package; from the error message, I suspect you didn’t set up that repository (see “step 1” in the instructions; https://docs.docker.com/desktop/install/ubuntu/#install-docker-desktop
(Docker Desktop依赖于docker CLI,这需要在安装docker-桌面包之前设置download.docker.com包存储库;从错误消息来看,我怀疑您没有设置该存储库(请参阅说明中的“步骤1”;https://docs.docker.com/desktop/install/ubuntu/#install-docker-desktop)

结合文档:在 Ubuntu 上安装 Docker 桌面

遂在Docker文档Desktop下载页面中Install Docker Desktop on Ubuntu

Install Docker Desktop
Recommended approach to install Docker Desktop on Ubuntu:
1.Set up Docker’s package repository. See step one of Install using the apt repository.
2.Download latest DEB package.
3.Install the package with apt as follows:
sudo apt-get update
sudo apt-get install ./docker-desktop-<arch>.deb

要首先安装Docker’s package repository,不知道与Docker什么关系,有什么用。

Install using the apt repository
Before you install Docker Engine for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.
1.Set up Docker’s apt repository.

# 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

2.Install the Docker packages.
Latest:

To install the latest version, run:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Specific version:

To install a specific version of Docker Engine, start by listing the available versions in the repository:
# List the available versions:
apt-cache madison docker-ce | awk '{ print $3 }'

5:27.0.3-1~ubuntu.24.04~noble
5:27.0.2-1~ubuntu.24.04~noble
...
Select the desired version and install:
VERSION_STRING=5:27.0.3-1~ubuntu.24.04~noble
sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin

3.Verify that the Docker Engine installation is successful by running the hello-world image.

sudo docker run hello-world

This command downloads a test image and runs it in a container. When the container runs, it prints a confirmation message and exits.

需要 使用sudo运行Docker命令

问题:
命令sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc 卡住?!!
解决办法:在Ubuntu中安装Docker,添加Docker官方GPG key失败,解决方案
(1)先把官方GPG key下载到本地,下载下来是一个gpg文件
(2)下载到本地后,采用如下命令,安装官方GPG key:

sudo apt-key add ./gpg

Linux apt-key机制后续需要研究

使用了本地sudo apt-key add ./gpg gpg命令后Add the repository to Apt sources添加docker库命令觉得应该修改,但我不知道怎么修改

我是用的下载下来的Desktop.deb文件

20240710使用中科大源能用官方命令gpg运行成功

=======================================
更新于20240715

2. Docker安装-初次安装成功

经过上述失败尝试,在网友指点下,安装成功,遂总结归纳记录。

step1:Docker官方网站找到安装步骤

# 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

此处建议:别用deb安装,使用上述apt安装,需挂梯子

step2:解决网络问题,具体如下:
运行clash,终端export Https=127.0.0.1:7890

在“sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc”这一步骤:
此处注意:export不会对sudo生效,
先sudo -i 进入root环境再export

apt安装中需要走docker源,安装过程中代理不能断,除非手动换源

“echo
“deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu
KaTeX parse error: Expected 'EOF', got '&' at position 20: …etc/os-release &̲& echo "VERSION_CODENAME”) stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null”

这个命令之后update会在/etc/apt/sources.list.d/docker.list更换里面的源

#deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu   focal stable
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu   focal stable

curl吃环境变量,apt不吃环境变量,有的软件不吃环境变量,最简单的方法是用proxychains
可使用apt安装一下。

到此update即成功完成!

Verify that the Docker Engine installation is successful by running the hello-world image.
sudo docker run hello-world
This command downloads a test image and runs it in a container. When the container runs, it prints a confirmation message and exits.

helloword验证环境失败:
主要原因是dockerhub被墙,需科学上网。

proxychains配置:sudo vi /etc/proxychains.conf
64行,4改5,端口7891或7890

#socks4 	127.0.0.1 9050
socks5 	127.0.0.1 7890

proxychains docker pull helloword 但是失败

在这里插入图片描述
参考连接:奇技淫巧系列 配置代理解决docker pull命令无法拉取镜像的问题

暂时还未研究,待续。

垃圾docker,作为一个软件,新手安装门槛这么高,还把系统弄崩溃了~~

=============================
更新于20240715:

3. Docker代理设置

docker代理要设置到守护进程中,系统级

同事告诉我设置代码,省了我不少时间:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

验证

sudo docker run hello-world

root@zh:~# docker run hello-world
Unable to find image 'hello-world:latest' locally

latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete 
Digest: sha256:1408fec50309afee38f3535383f5b09419e6dc0925bc69891e79d84cc4cdcec6
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

为了生成此消息,Docker采取了以下步骤:
1.Docker客户端联系了Docker守护进程。
2.Docker守护进程从Docker Hub中提取了“hello world”镜像。
(amd64)
3.Docker守护进程从该映像创建了一个新的容器,该容器运行
可执行文件,生成您当前正在读取的输出。
4.Docker守护进程将该输出流式传输到Docker客户端,后者将其发送
到你的终端。
要尝试更雄心勃勃的东西,您可以使用以下命令运行Ubuntu容器:
$docker run-it ubuntu bash
使用免费的Docker ID共享图像、自动化工作流程等:
https://hub.docker.com/
有关更多示例和想法,请访问:
https://docs.docker.com/get-started/

4 Docker基础

4.1 Docker镜像存储的位置

Linux:
cd /var/lib/docker - 容器与镜像存放在此目录下
镜像位置: /var/lib/docker/image
容器位置: /var/lib/docker/containers

注意:必须在 root 用户权限下进行

step1:进入docker 目录
文件结构如下:在这里插入图片描述
step2:进入containers 目录
这个目录中保存是已拉取的容器ID,即一个序列号,对应一个容器。
在这里插入图片描述
随便进入选择一个序列号,进入后发现容器的具体结构如下:
在这里插入图片描述
step3:进入image 目录
这个目录中保存的是已拉取的镜像的信息。在下图中可以看到images目录下有个overlay2目录,该目录下中repositories.json 文件详细记录了拉取的镜像的详细信息:有 镜像名、镜像ID等。(注: 比较老的docker版本下可能没有 overlay2 目录,而是 aufs 目录,在 aufs 目录中同样有形同的目录及文件)
在这里插入图片描述
作为对比,下面直接使用 docker命令展示镜像信息:

docker image ls
在这里插入图片描述

4.2 镜像与容器的理解

镜像你可以把它看成Java中的类,而容器可以看做是类的实例化对象。
一个类可以有多个对象,同理,一个镜像可以有多个容器。??

docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)。
docker 容器=镜像+可读层

容器是由镜像实例化而来。
简单来说,镜像是文件,容器是进程。
容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。

docker 的镜像概念类似虚拟机的镜像。是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
docker利用容器来运行应用:docker容器是由docker镜像创建的运行实例。
docker容器类似虚拟机,可以执行包含启动,停止,删除等。每个容器间是相互隔离的。容器中会运行特定的运用,包含特定应用的代码及所需的依赖文件。可以把容器看作一个简易版的linux环境(包含root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
在这里插入图片描述
在Docker的生命周期中,最核心的两个部分,一个是镜像 Images,一个是容器 Containers。
镜像运行起来就是容器。容器是镜像的一个运行实例,不同的是它带有额外的可写层。
容器服务运行的过程中,基于原始镜像做了改变,比如安装了程序,添加了文件,也可以提交回去 (commit)成为镜像。

docker仓库概念和git类似

在这里插入图片描述

5 Docker操作归纳

5.1 对Docker操作

# 启动docker
sudo service docker start
# 重启docker
sudo service docker restart
# 停止docker
sudo service docker stop

5.2 对镜像的操作

获取当时所有镜像(docker images)

docker image ls
# 或者
docker images
标签含义
REPOSITORY镜像所在的仓库名称
TAG镜像标签
IMAGEID镜像ID
CREATED镜像的创建日期(不是获取该镜像的日期)
SIZE镜像大小

5.3 拉去镜像(docker pull)

除了使用官方的镜像外,我们还可以在仓库中申请一个自己的账号,保存自己制作的进行,或者拉去使用他人的镜像。

# 官方镜像
docker image pull 镜像名称 
# 或简写为 
docker pull 镜像名称
# 比如
docker pull ubuntu
docker pull ubuntu:16.04

# 个人镜像
docker pull 仓库名称/镜像名称
docker pull xunmi/django

# 第三方仓库拉去
docker pull 第三方仓库地址/仓库名称/镜像名称
docker pull hub.c.163.com/library/mysql:latest
(默认仓库名为library,所有从官方获取镜像相当于`sudo docker image pull library/镜像名称`)

5.4 删除镜像(docker rmi)

docker image rm 镜像名或镜像ID 或 docker rmi 镜像名或镜像ID
docker image rm hello-world
docker rmi 9e64176cd8a2

删除镜像的前提是没有使用这个镜像的容器,如果有需要先删除容器(报错:Error response from daemon: conflict: unable to delete 镜像ID (must be forced) - image is being used by stopped container 容器ID则代表有容器使用了此镜像。)可以尝试先执行docker rm 容器ID删除容器,如果还报错,可以看我下方删除容器的具体方法。
几条删除命令的区别

docker rm: 删除一个或多个 容器
docker rmi: 删除一个或多个 镜像
docker prune: 用来删除不再使用的 docker 对象

5.5 加载镜像(docker run)

镜像只是一个只读类型的文件,而我们的环境不可能只是一个这样的文件,所以我们需要把这个镜像加载成我们的环境,也就是让他变成容器。

docker run [可选参数] 镜像名 [向启动容器中传入的命令]

常用可选参数作用
-i表示以《交互模式》运行容器
-d会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)
-t表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端
–name创建的容器命名(默认会随机给名字,不支持中文字符!!!)
-v表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
-p表示端口映射,即宿主机端口:容器中端口。 比如:-p 8080:80 就是将容器中的80端口,映射到主机中的8080端口
–network=host表示将主机的网络环境映射到容器中,使容器的网络与主机相同。每个 Docker 容器都有自己的网络连接空间连接到虚拟 LAN。使用此命令则会让容器和主机共享一个网络空间。

5.6 查看容器(docker ps)

查看容器主要会用到ps命令

# 查看当前所有正在运行的容器
docker ps
# 查看当前所有的容器
docker ps -a
# 使用过滤器(除了name外,常用的还可以指定id:id= 、所有停止的容器:status=exited,正在运行的容器:status=running 等)
docker ps -f name=指定的名字
# 显示2个上次创建的容器(2可以改变)
docker ps -n 2
# 显示最新创建的容器(包括所有状态)
docker ps -l
# 仅显示ip
docker ps -q
 # 显示容器大小
docker ps -s

5.7 启动和关闭容器

# 停止容器
docker container stop 容器名或容器id
# 或可简写为
docker stop 容器名或容器id

# 强制关闭容器
docker container kill 容器名或容器id
# 或可简写为
docker kill 容器名或容器id

# 启动容器
docker container start 容器名或容器id
# 或可简写为
docker start 容器名或容器id

如果我们成功启动或者关闭一个容器的话,会返回容器名或者容器id

stop和kill的区别: stop是比较优雅的关掉一个容器,类似我们正常退出一个软件,而kill是当一个进程出现意外无法正常关闭的时候,我们强行进行关闭,有点像我们使用任务管理器进行结束进程操作

5.8 删除容器(docker rm)

# 使用rm删除容器
docker rm 容器名或容器id
# 列如
docker rm docker-test

6 制作镜像

6.1 容器制作成镜像

我们为什么要把容器制作成镜像?
镜像可以看作为是一种备份,如果我们后期环境出现了问题,可以还原到早期镜像。
镜像便于传播,可以让自己的其他设备或他人的重复利用变得更加简单容易。

# 将容器制作成镜像
docker commit 容器名 镜像名
# 镜像打包备份(打包备份的文件会自动存放在当前命令行的路径下,如果想让保存的文件可以打开,可以加.tar后缀)
docker save -o 保存的文件名 镜像名
# 镜像解压
docker load -i 文件路径/备份文件
Docker 是一种容器化技术,可以帮助开发者快速构建、打包、发布和运行应用程序的环境。在安装和使用 Docker 之前,需要先了解 Docker 的基本概念。 Docker 的基本概念 1. 镜像(Image):Docker 镜像是一个只读的模板,包含了运行应用程序所需要的所有文件、配置和依赖项。 2. 容器(Container):Docker 容器Docker 镜像的运行实例,可以被创建、启动、停止、删除、暂停等操作。 3. 仓库(Repository):Docker 仓库是用于存储和分享 Docker 镜像的地方,可以是公共的(如 Docker Hub)或私有的(如自己的服务器)。 Docker 的安装步骤 1. 安装 Docker 在 Ubuntu 系统上,可以使用以下命令安装 Docker: ``` $ sudo apt-get update $ sudo apt-get install docker.io ``` 安装完成后,可以使用以下命令检查 Docker 是否正确安装: ``` $ docker --version ``` 2. 配置 Docker 在安装 Docker 后,需要将当前用户添加到 Docker 用户组中,以便无需使用 sudo 命令也可以运行 Docker 命令: ``` $ sudo usermod -aG docker your_username ``` 需要重新登录才能使修改生效。 3. 运行 Docker 可以使用以下命令启动 Docker: ``` $ sudo systemctl start docker ``` 可以使用以下命令检查 Docker 是否正在运行: ``` $ sudo systemctl status docker ``` Docker 的基本使用 1. 拉取镜像 可以使用以下命令从 Docker 仓库中拉取镜像: ``` $ docker pull image_name ``` 例如,拉取 Ubuntu 镜像: ``` $ docker pull ubuntu ``` 2. 运行容器 可以使用以下命令运行容器: ``` $ docker run image_name ``` 例如,运行 Ubuntu 容器: ``` $ docker run ubuntu ``` 默认情况下,容器会在后台运行,并显示容器 ID。 可以使用以下命令运行交互式容器: ``` $ docker run -it image_name ``` 例如,运行交互式 Ubuntu 容器: ``` $ docker run -it ubuntu ``` 3. 列出容器 可以使用以下命令列出所有正在运行的容器: ``` $ docker ps ``` 可以使用以下命令列出所有容器: ``` $ docker ps -a ``` 4. 停止容器 可以使用以下命令停止容器: ``` $ docker stop container_id ``` 例如,停止容器 ID 为 123 的容器: ``` $ docker stop 123 ``` 可以使用以下命令停止所有正在运行的容器: ``` $ docker stop $(docker ps -q) ``` 5. 删除容器 可以使用以下命令删除容器: ``` $ docker rm container_id ``` 例如,删除容器 ID 为 123 的容器: ``` $ docker rm 123 ``` 可以使用以下命令删除所有容器: ``` $ docker rm $(docker ps -aq) ``` 6. 删除镜像 可以使用以下命令删除镜像: ``` $ docker rmi image_name ``` 例如,删除 Ubuntu 镜像: ``` $ docker rmi ubuntu ``` 可以使用以下命令删除所有镜像: ``` $ docker rmi $(docker images -q) ``` 以上是 Docker 的基本安装和使用方法,更多高级用法可以参考 Docker 官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周陽讀書

周陽也想繼往聖之絕學呀~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值