深入浅出docker应用-Docker容器入门

深入浅出docker应用-Docker容器入门

写在前面

本系列教程由阿里云提供。首先感谢阿里云提供的实验资源。之前空闲时间做过一遍,收获颇丰,可以配得上标称的"深入浅出docker应用"。虽然只是对于基本概念和命令的讲解,现在在图形化界面上也有Docker Desktop方便的管理容器,但是在服务器上进行运维工作,还是需要对命令行的使用方式较为熟悉。由于最近也在深入使用docker,学习其原理,故快速重温一遍,并做转载供平时查阅和分享,以便能通过这些内容对docker有感性的认识。若有侵权,联系2013599@mail.nankai.edu.cn,收到将立即删除。

Docker安装和配置

安装

Docker是基于Linux内核服务的轻量级开源容器产品,本系列实验我们将为大家介绍docker产品的安装,使用和案例。在本实验中,我们先来介绍docker 的安装。在centos系统中,我们一般通过yum进行软件包的安装。因此本次实验我们也通过yum来安装docker运行环境。

下面是基于实验环境的centos安装过程。其他系统可参见官方指导

  1. 安装docker的依赖组件

在安装docker之前,我们需要先通过yum来安装docker的必要的依赖组件。同时为了编译后面的配置信息格式化输出,我们同时需要安装jq工具。

kotlin 复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2
复制代码
yum install -y jq
  1. 添加Docker的安装来源

因为docker安装包不在yum的默认源列表中,因此在安装之前我们需要通过yum-config-manager --add-repo命令向yum默认源列表中添加docker源的地址。

arduino 复制代码
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 

源添加成功后,我们可以使用yum list命令查看当前的docker源中支持的安装包版本列表。

bash 复制代码
yum list docker-ce --showduplicates | sort -r
  1. 安装Docker应用

docker依赖和docker源安装完成之后,我们就可以使用yum install docker-ce.x86_64命令来安装docker 应用,在使用yum install安装时,默认会选择最新的版本进行安装。如果需要指定安装版本也可以在命令后面加入具体的版本号,接下来我们来安装docker的最新版本。

复制代码
yum install -y docker-ce.x86_64 

安装成功之后,我们还需要通过systemctl start命令来启动docker服务

sql 复制代码
systemctl start docker.service

配置

1.镜像源配置

通过docker拉取镜像时,默认会通过国外的镜像源进行下载,因此可以配置国内的镜像源以加快下载速度。修改docker的镜像源时,我们使用vi编辑文件 /etc/docker/daemon.json 。注意使用vi编辑器时:

  1. 需要先按i键进入编辑模式。
  2. 编辑完成之后按esc退出编辑模式。
  3. 然后按大写的ZZ保存并退出vi。
bash 复制代码
vi /etc/docker/daemon.json 
json 复制代码
{
   "registry-mirrors":["https://registry.docker-cn.com"]
}

在编辑成功后,按ECS推出编辑模式,然后按ZZ退出vi。

  1. 镜像源修改后,需要重新启动docker服务。

    systemctl restart docker.service

服务重启成功后,我们可以通过docker version查看docker版本信息。如果出现客户端版本信息和服务版本信息,则说明dcoker已经安装成功且服务已经启动

复制代码
docker version
  1. 服务启动之后,为了防止计算机重启之后docker服务被关闭,我们还可以通过systemctl enable命令将docker服务配置为开机自启动。(此步骤为可选操作)
bash 复制代码
systemctl enable docker.service

快速上手

在前面的小节中我们介绍了Docker 的安装的配置,接下来为大家介绍一些Docker的快速上手命令和用法。

  1. 启动hello-world

Docker安装配置成功之后,我们就可以通过docker run命令启动轻量级的容器虚拟机。我们执行如下命令

arduino 复制代码
docker run hello-world

会发现屏幕上输出了Hello from Docker!信息。这个信息输出表示hello-world容器虚拟机启动成功。

  1. 启动长期运行的bash容器

在上一个步骤中,我们演示了docker最基本的用法,这种方式启动的hello-world容器,在启动之后会输出文字,在输出之后容器就会结束。

接下来我们来启动一个可以长期运行的bash容器。我们在命令行中输入如下命令,运行成功后会看到命令提示行变为bash,这表示容器虚拟机已经持续运行。

arduino 复制代码
docker run -it bash
  1. bash容器的退出

在运行的bash容器中我们可以使用一些基本的linux命令,如pwd,ls等

bash 复制代码
pwd
ls

如果希望退出bash容器,回到宿主机,我们在控制台中输入exit命令即可。

bash 复制代码
exit

在使用docker run命令运行容器时,我们会看到在容器运行之前,出现了Status: Downloaded newer image状态。这表示在容器虚拟机第一次运行时,会首先从远程容器源服务器中下载镜像到本地,然后才能在本地运行。

在本小节中,我们来学习如何分步骤从镜像源查找所需要的容器镜像,然后再来了解如何下载容器镜像,并且查看本地已经下载好的容器镜像列表。

  1. 远程查找容器

当我们需要查找容器时,可以通过docker search命令在的镜像源中查找所需要的容器镜像。接下来我们来查找ubuntu容器。

sql 复制代码
docker search ubuntu
  1. 查找容器的版本信息

在找到所需要的容器镜像的名称之后,通常需要进一步在docker的镜像源中查找该镜像的版本列表。由于docker本身没有直接提供查看版本的功能,因此在这里我们为大家提供了一个可以查看镜像版本的简单脚本docker-tags。我们生成docker-tags脚本并加入以下内容 ,

注意使用vi编辑器时:

  1. 需要先按i键进入编辑模式。

  2. 编辑完成之后按esc退出编辑模式。

  3. 然后按大写的ZZ保存并退出vi。

    vi docker-tags

perl 复制代码
curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$1/tags/?page=$2" |
sed -e 's/,/\n/g' -e 's/[/\[\n/g' |
grep -E '"name":|"count":' |
sed -e 's/"//g' -e "s/name:/$1:/g" -e "s/{count:/$1总版本数-/"

docker-tags脚本编辑好之后,需要通过chmod修改文件权限才可以执行。在权限修改完成之后,就可以使用docker-tags脚本来查询相关镜像的最近版本信息了。

bash 复制代码
chmod 777 docker-tags 
./docker-tags ubuntu
  1. 拉取容器镜像

当我们查找到镜像的版本信息之后,就可以拉取镜像到本地了。在拉取镜像时我们可指定拉取镜像的版本,也可不指定版本默认拉取最新版本。首先我们使用docker pull命令来拉取ubuntu容器的jammy版本。

复制代码
docker pull ubuntu:jammy

接下来我们来拉取ubuntu的最新版本。

复制代码
docker pull ubuntu

当镜像源已经拉取到本地之后,我们可以通过docker images命令来查看已经拉取到的本地镜像。

复制代码
docker images

容器启动和操作

镜像拉取到本地之后并不能直接运行,如果要启动容器,我们需要首先根据镜像创建容器。接下来我们将学习如何创建容器并启动ubuntu容器。

容器的分步骤启动流程

  1. 创建ubuntu容器

我们可以使用docker create命令,利用下载好的ubuntu镜像创建容器。注意:因为我们要创建一个可以持久运行的ubuntu容器,因此需要添加-it参数。

-i:这个参数代表"交互式(Interactive)"。它使容器的标准输入(stdin)保持打开状态,允许你与容器的命令行交互。这意味着你可以在容器内部执行命令,并从键盘输入内容,就像在本地计算机上的终端一样。

-t:这个参数代表"终端(TTY)"。它为容器分配了一个伪终端(pseudo-TTY),这使得容器内的命令行界面可以正常工作,包括支持终端窗口大小的调整和ANSI转义序列的处理。这通常与-i一起使用,以确保交互式终端在容器内部能够正常运行。

lua 复制代码
docker create -it ubuntu

容器创建成功之后,可以使用docker ps命令查看现有的容器,注意:如果docker ps默认只会显示正在运行的容器。如果想查看所有状态的容器,需要添加-a参数。

css 复制代码
docker ps -a

注:换了一个服务器,因此只显示了一个

  1. 创建指定名称的容器

在上一步的执行docker ps -a的返回结果中。CONTAINER ID表示系统为容器创建的ID,IMAGE为容器的镜像名称。STATUS表示容器当前的状态。NAMES为容器的名称。

使用默认的docker create命令所创建的容器并没有指定名称,因此docker会为容器生成一个随机的名字。如果用户想创建指定名称的容器,则可以使用--name参数。注意如果用户制定了容器名,则要注意容器不要重名,否则会创建失败。

css 复制代码
docker create -it --name ubuntu-1 ubuntu
docker ps -a
  1. 启动ubuntu容器

当容器创建好之后,我们就可以通过docker start命令来启动容器,容器启动成功后通过docker ps命令可以查看到容器状态的变化。在这里我们要注意:同一个镜像创建的多个容器之间是不相关的。

css 复制代码
docker start ubuntu-1
docker ps -a 

容器的快速启动方式

在上一个小节中我们介绍了docker容器创建的标准流程。而在实际操作过程中,使用标准步骤创建启动容器会比较繁琐,因此docker提供了更加简便的命令docker run。使用该命令时,docker会自动完成下载镜像,创建容器,启动容器的工作。

  1. 创建容器指定名称的容器

通过以下的一条命令,我们就可以完成下载busybox的容器镜像,创建名为busybox-1的容器,为了让容器可以在创建之后长期运行我们要使用-it参数,为了让容器在启动之后再后台运行,我们需要使用-d参数。在容器启动之后我们使用docker ps命令查询正在运行的容器。

css 复制代码
docker run -itd --name ubuntu-2 ubuntu
docker ps -a 
  1. 操作已经创建的容器

使用-d参数创建容器之后,容器在后台运行,前台的命令行仍然指向宿主机。为了能狗通过命令行操作容器,我们可以使用docker exec命令在ubuntu-2容器上启动bash控制台程序,从而对容器进行操作。

bash 复制代码
docker exec -it ubuntu-2 bin/bash

命令执行之后提示行提示符发生了改变。这说明当前用户所操作的已经是容器中的操作系统。

  1. 创建一次性容器

上面我们为大家介绍的常见的容器创建方法,如果用户在使用docker run创建容器的时候,如果不使用-d参数。则启动容器成功之后,会自动进入容器操作系统控制台。但是此种方法进入容器操作系统之后,如果使用exit退出,容器会被关闭。因此此种方法只适用通过容器中执行一些临时性的操作时使用。

接下来我们创建一次性容器,并且在一次性容器退出之后使用docker ps -a查看容器,当我们使用docker ps时,只会列出正在运行的容器,而使用了-a参数之后,会列出包括了正在运行的和已经退出了的各种状态的容器。

lua 复制代码
docker run -it --name temp ubuntu
exit
css 复制代码
docker ps -a 

为容器安装命令行工具

  1. 启动容器并测试常用命令

首先用docker run创建一个新的ubuntu容器并启动

arduino 复制代码
docker run -it --name ubuntu-3 ubuntu

接下来再通过lsb_release查看操作系统的状态。会显示命令无法找到,原因是通过容器安装的ubuntu属于极简版本,没有安装非必要的命令。为了能在容器虚拟机中执行常用的操作

复制代码
lsb_release
  1. 在容器中安装命令

对于ubuntu镜像的容器,我们可以使用apt-get命令来安装常用命令。接下来我们使用apt-get install来安装lsb_release, ifconfig,vim三个工具。需要注意的在使用apt-get install之前,需要首先使用apt-get udpate来更新本地资源库。另外就是此步骤受网络速度影响可能会有比大的延迟。

sql 复制代码
apt-get update
apt-get install -y lsb-core net-tools vim --fix-missing

在容器中体验安装命令后,使用exit退出容器继续下面操作。

  1. busybox镜像的使用

在docker中,传统的ubuntu或者centos镜像所包含的命令数量都非常少,每次使用时都需要手动安装相关命令非常不方便,因此在实际使用docker时,我们经常使用busybox镜像来作为基础镜像。

接下来我们尝试创建busybox镜像,要注意的时,为了保证镜像体积,busybox镜像中并不包括bash命令,而是使用了替代的sh命令。因此我们创建busybox镜像的命令也需要做调整。

sql 复制代码
docker run -itd --name busybox-1 busybox
docker exec -it busybox-1 sh

容器创建成功之后,我们尝试ifconfig和vi命令发现已经内置在容器之中,不过需要注意的时busybox镜像并没有包含apt-get或者yum等自动包安装工具。因此和ubuntu或者centos镜像相比,安装新工具会比较繁琐。

注意使用vi编辑器时:

  1. 需要先按i键进入编辑模式。
  2. 编辑完成之后按esc退出编辑模式。
  3. 然后按大写的ZZ保存并退出vi。
css 复制代码
ifconfig
vi a.txt

体验完busybox镜像的使用后,我们执行exit退出继续下面操作。

查看容器系统信息

上一小节我们带大家学习了如何启动一个容器,当容器启动之后会作为轻量级的虚拟机在本地进行运行。本小节我们将学习如何在控制台操作作为虚拟机的容器。

  1. 查看宿主机信息

为了对比容器和宿主机,我们先用lsb_release -a命令查看宿主操作系统

css 复制代码
lsb_release -a

接下来我们再用ifconfig命令查看宿主机网络信息。

复制代码
ifconfig
  1. 查看容器信息

当上述命令(在ubuntu-3中)安装好之后,我们就可以查看容器操作系统的状态和网络状态了。查询后发现和宿主机的信息已经不同。说明我们的控制台已经在容器操作系统中了。

bash 复制代码
docker start ubuntu-3
docker exec -it ubuntu-2 bin/bash
css 复制代码
lsb_release -a

我们接下来在查看容器的IP地址,(注意和宿主机网络信息的对比)

复制代码
ifconfig

可以感受到容器对环境的隔离效果。

容器管理命令

构建实验环境

在前面的实验中,我们介绍了容器的启动和操作。在本实验中,我们继续介绍Docker中针对容器的操作命令。首先我们会在容器中用python启动一个简单的http服务,以便为后续的实验做准备。

  1. 创建容器

首先我们来创建一个新的ubuntu容器。在创建成功后使用docker exec进入容器控制台。

bash 复制代码
docker run -itd --name ubuntu-3 ubuntu
docker exec -it ubuntu-3 /bin/bash
  1. 安装工具

为了演示后面的实验,我们在容器中安装python3,ifconfig,curl三个命令行工具。其中ifconfig命令工具需要安装net-tools工具包。

sql 复制代码
apt-get update
apt-get install -y python3 net-tools curl
  1. 运行服务

接下来我们启动一个默认的python3 http服务,服务启动在8000端口,并使用nohup命令将服务设置为在后台运行(nohup:ignoring input and appending output to 'nphup.out'按回车)。在服务启动之后,我们再容器中使用curl测试一下服务的运行状态。会看到http服务返回了网页。

bash 复制代码
nohup python3 -m http.server 8000 &
curl 127.0.0.1:8000 

访问容器中的应用

在上一个小节中,我们通过docker启动了一个容器,同时在这个容器中启动了一个http服务。本小节中我们来学习如何访问这个容器中的服务。以及如何查看容器中服务的进程状态查询命令。

  1. 查看容器的网络地址

在容器内部测试http服务成功后,接下来我们需要在宿主机中测试http服务。当容器创建之后,会自动创建属于容器自己的网卡和网络地址,并且保证容器的网卡可以和宿主机互相访问,因此我们先通过ifconfig命令来显示并记录容器的ip地址。然后退出容器的控制台。

  1. 测试访问容器服务

在宿主机控制台中,我们同样使用curl命令来访问容器中的http服务,需要注意的是:在宿主机中我们需要通过上一步容器IP地址才能访问到容器中的服务。通过测试我们发现在宿主机中通过IP访问容器服务活得内容和在容器中获得的内容一致。

css 复制代码
curl [容器IP]:8000 

再上一个步骤中我们通过宿主机访问了容器内的服务。除此之外我们还可以在宿主机中通过docker top命令来查看容器中正在运行的具体进程。其命令的语法为docker top 容器名。我们输入如下命令,可以看到ubuntu-3容器运行着2个进程,分别是bash控制台进程和python3http服务器进程。

css 复制代码
docker top ubuntu-3

容器的暂停和恢复

对于已经启动的容器。我们可以使用docker pause/unpause命令对容器进行暂停/恢复。当容器被暂停之后,容器内的服务将会暂停,当容器恢复之后服务恢复。在上一小节中我们在容器中用python启动了一个简单的http服务,这一小节我们来测试容器的暂停和恢复对http服务的影响。

  1. 通过docker pause命令暂停容器运行,容器暂停后通过docker top命令来查看容器中进程。发现进程依然存在,再通过curl测试http服务,发现已经无响应,证明服务已经停止。
css 复制代码
docker pause ubuntu-3
docker ps -a
curL[容器IP]:8000 
Ctrl+C
  1. 通过docker unpause命令恢复容器运行,测试http服务,发现已经恢复访问。

容器的停止,重启和删除

上一小节我们学习的容器的暂停和恢复。除了暂停/恢复之外,我们还可以对容器进行启动和停止操作。和暂停恢复不同的是,容器重启之后,容器内部运行的应用会被停止。比较类似于物理机的重新启动。

  1. 容器的停止

首先我们利用docker top命令显示容器中正在运行的应用。接下来我们使用docker stop命令停止容器,停止之后用docker ps -a命令查看容器状态,会发现容器变成了Exited状态

看容器状态,会发现容器变成了Exited状态

css 复制代码
docker top ubuntu-3
docker stop ubuntu-3
docker ps -a 
  1. 容器的重启

对于已经进入Exited状态的容器,我们可以利用docker restart命令重新启动容器,当容器重新启动之后,我们再利用docker topcurl测试容器中的http服务,已经不可使用。

css 复制代码
docker restart ubuntu-3
docker top ubuntu-3
css 复制代码
curl [容器IP]:8000
  1. 容器的删除

对于已经不再需要的容器,我们可以使用docker rm命令进行删除,docker rm 命令可以使用CONTAINER ID或者NAME作为参数。在默认情况下,我们只能删除Exited状态下的容器,如果容器的状态不是停止。则需要为docker rm添加--force或者-f参数才可以删除。

css 复制代码
docker ps -a
docker rm --force [CONTAINER ID]
docker ps -a

css 复制代码
docker rm --force ubuntu-3
docker ps -a

我们会发现容器已经被删除了。

复制代码
rm-bp1n5f8yed463o5d0.mysql.rds.aliyuncs.com
相关推荐
weixin_462446231 小时前
【原创实践】Docker 镜像批量导出镜像与导入镜像
运维·docker·容器
qq7590353661 小时前
Docker快速部署一款堡垒机系统
运维·docker·容器
天下不喵3 小时前
python项目部署之pytandic与.env的使用教程
python·docker
芥子沫4 小时前
Docker安装Blossom笔记
笔记·docker·容器
qq7590353665 小时前
docker一键部署网页版Win11系统
运维·docker·容器
Joren的学习记录5 小时前
【Linux运维大神系列】docker详解(三)
linux·运维·docker
用什么都重名6 小时前
Dify 源码升级指南
docker·容器·dify
java_logo6 小时前
Supabase Postgres Docker 容器化部署指南
运维·docker·postgresql·容器·postgres部署教程·postgres部署文档·docker postgres
l1t7 小时前
利用docker在windows 11 wsl中安装oracle 12cR2
运维·windows·docker·oracle·容器
孤岛悬城7 小时前
44 Docker:安装与容器管理
docker·容器·云计算