docker第二篇 docker操作:docker安装 | docker常用指令 | docker镜像 | 本地镜像发布到阿里云

第二篇 docker操作:docker安装 | docker常用指令 | docker镜像 | 本地镜像发布到阿里云

第二章 docker安装

2.1 安装条件

  • Docker并非是一个通用的容器工具,它依赖于已存在并运行的 Linux内核环境。
  • Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux主机,因此,Docker必须部署在Linux内核的系统上。
  • 如果其他系统想部署Docker 就必须安装一个虚拟Linux环境。

image-20230817195312043

前提条件

  • 目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x
  • 查看自己的内核(用下面两个指令都可以)
uname -r
cat /etc/redhat-release

image-20230817211842587

命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。

2.2 安装

可以查看这个文档

  1. 查看linux版本
uname -r
cat /etc/redhat-release
  1. 卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  1. 安装gcc相关
yum -y install gcc
yum -y install gcc-c++
  1. 安装需要的软件包
sudo yum install -y yum-utils
  1. 设置stable镜像仓库
# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 官网要求
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  # 安装阿里云镜像
  1. 更新yum软件包索引
yum makecache fast
  1. 安装docker CE
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 启动docker
systemctl start docker # systemctl是管理服务(守护进程)的命令
  1. 测试
docker version
docker run hello-world
  1. 卸载
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

2.3 阿里云镜像加速

登录阿里云→控制台→左上角的产品与服务

image-20230817213819358

选择镜像加速器

image-20230817213941668

  • 执行下面的脚本即可

2.4 run干了什么

image-20230817214157157

第三章 docker常用指令

3.1 docker服务控制

指令 指令说明
systemctl start docker 启动
system stop docker 停止
systemctl restart docker 重启
systemctl status docker 查看docker状态
systemctl enable docker 开机启动
systemctl disable docker 开机不启动
systemctl is-enabled docker 查看开机启动的情况
docker info 查看docker概要信息

3.2 帮助类指令

指令 说明
docker --help 查看docker总体帮助文档
docker 具体指令 --help

3.3 镜像命令

3.3.1 查看镜像

指令 说明 选项
docker images 列出本地上的所有镜像 -a (all) 列出本地所有的镜像(含历史映像层)
-q 只显示镜像ID
docker -aq image 查看所有的镜像的id
docker images ubuntu 查看ubuntu的信息

3.3.2 从仓库中查找镜像

指令 说明 选项
docker search [OPTIONS] 镜像名字 从仓库中查找某个镜像
docker search --limit 5 redis 只列出N个镜像,默认是25个

举个例子

image-20230817220155277

下面是每一项的说明

说明
NAME 镜像名称
DESCRIPTION 镜像说明
STARS 点赞数量
OFFICIAL 是否是官方的
AUTOMATED 是否是自动构建的

3.3.3 拉取镜像

指令 说明 选项
docker pull 镜像名字[:TAG] 从仓库中拉取某个镜像,TAG表示版本
docker pull ubuntu 没有tag等同于 ubuntu:latest 最新版

3.3.4 查看镜像/容器/数据卷所占的空间

指令 说明 选项
docker system df 查看镜像/容器/数据卷所占的空间

image-20230817221055112

3.3.5 删除镜像

指令 说明 选项
docker rmi 镜像ID 删除某个镜像,rmi:rm image -f,强制删除,不管是否当前有运行的容器
docker rmi 镜像名 根据镜像名删除
docker rmi -f 镜像id 强制删除镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG 删除多个镜像
docker rmi -f $(docker images -qa) 删除所有镜像

image-20230817221410888

docker虚悬镜像

仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image

image-20230817221455259

3.3.6 提交镜像commit

3.4 容器命令

使用ubuntu容器来演示

首先拉取镜像

3.4.1 新建 + 启动容器

(1) 常规指令

指令 说明 选项
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 新建并启动容器 --name="容器新名字" 为容器指定一个名称
-d (deamon) 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i (interaction) 以交互模式运行容器,通常与 -t 同时使用;
-t (tty) 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p(常用)
docker run -it ubuntu bash 放在镜像名后面的bash是命令,这里我们希望有个交互式的shell,因此使用的是bash
docker run -it ubuntu /bin/bash 使用/bin/bash也是一样的
docker run -d 容器名 指定容器的后台运行模式

image-20230817222158871

(2) 指定端口

参数 说明
-p hostPort:containerPort 端口映射-p 8080:80
-p ip:hostPort:containerPort 配置监听地址-p 10.0.0.100:8080:80
-p ip::containerPort 随机分配端口-p 10.0.0.100::80
-p hostPort:containerPort:udp 指定协议-p 8080:80:tcp
-p 81:80 -p 443:443 指定多个
  • docker里面是含有一个简易版的操作系统的,可以对外开放端口,但是这个端口是容器的不是主机的
  • 如果外接要访问容器,只能访问主机而不是容器的端口
  • 因此可以设置映射,将主机的端口映射到容器的端口

-p 8080:80 一般使用这一种选项

(3) 后台启动程序

在大部分的场景下,我们希望 docker 的服务是在后台运行的, 我们可以过 -d 指定容器的后台运行模式。

docker run -d centos

使用镜像centos:latest以后台模式启动一个容器

问题:然后docker ps -a 进行查看, 会发现容器已经退出

很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.

  • 容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,

我们配置启动服务只需要启动响应的service即可。例如service nginx start

但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,

这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.

所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断

比如对于ubuntu,最好加上 -it的选项

3.4.2 列出容器列表

参数 说明 说明
docker ps [OPTIONS] 列出当前所有正在运行的容器 -a :列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器。
-n:显示最近n个创建的容器。
-q:静默模式,只显示容器编号。

一般docker run之后,需要运行ps指令,来确保run成功了

3.4.3 退出容器

两种退出方式

指令 说明
exit run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止

3.4.4 启动容器

指令 说明
docker start 容器ID或者容器名 启动容器

这里注意容器创建和容器启动的区别,run创建并启动了容器,容器可以关闭,还可以重启,但是并没有删除

3.4.5 重启容器

指令 说明
docker restart 容器ID或者容器名 重启容器

3.4.6 停止容器

指令 说明
docker stop 容器ID或者容器名 停止容器
docker kill 容器ID或者容器名 强制停止

3.4.7 删除容器

指令 说明
docker rm 容器ID 删除已经停止的容器
docker rm -f $(docker ps -a -q) 一次删除多个容器
docker ps -a -q | xargs docker rm 一次删除多个容器

image-20230817223149200

3.4.8 查看容器日志/进程/细节

指令 说明
docker logs 容器ID 查看容器的日志
docker top 容器ID 查看容器内运行的进程
docker inspect 容器ID 查看容器内部细节

前面说过,可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序

  • 容器也算是一个linux环境,自然有linux中的进程体系

3.4.9 进入容器 exec & attach

指令 说明
docker exec -it 容器ID/NAME bash 进入容器以命令行的形式,exec也和run类似吧,含义不一样
docker attach 容器ID 重新进入docker

区别:

  • attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
  • exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。

前面说过了,容器中含有一个linux环境,终端相当于linux的一个进程,所以attach是不开启新的进程,关闭直接会将容器关闭;但是exec是重新开了一个终端,不会关闭的

exec attach
image-20230818110920540 image-20230818110917961
  • 推荐使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

3.4.10 拷贝容器文件到主机

指令 说明
docker cp 容器ID:容器内路径 目的主机路径 将容器中的文件复制到主机上

前面说过了,容器中含有一个linux环境,当然也有自己的文件系统,现在希望能够将容器中的文件拷贝到主机

image-20230818111308437

3.4.11 导入导出容器

指令 说明
docker export 容器ID > 文件名.tar 导出容器的内容留作为一个tar归档文件[对应import命令]
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

如下演示

docker export e52223673c76 > container.tar.gz
cat container.tar.gz | docker import - test/myubuntu:1.3

image-20230818112337786

  • 导出就是将容器导出为tar文件
  • 导入就是将tar文件导入成为镜像

所有指令总结

image-20230818112558402

指令 英文 作用
attach Attach to a running container 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile 通过 Dockerfile 定制镜像
commit Create a new image from a container changes 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path 从容器中拷贝指定文件或者目录到宿主机中
create Create a new container 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem 查看 docker 容器变化
events Get real time events from the server 从 docker 服务获取容器实时事件
exec Run a command in an existing container 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive 导出容器的内容流作为一个 tar 归档文件
history Show the history of an image 展示一个镜像形成历史
images List images 列出系统当前镜像
import Create a new filesystem image from the contents of a tarbal 从tar包中的内容创建一个新的文件系统映像
info Display system-wide information 显示系统相关信息
inspect Return low-level information on a container 查看容器详细信息
kill Kill a running container kill 指定 docker 容器
load Load an image from a tar archive 从一个 tar 包中加载一个镜像
login Register or Login to the docker registry server 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server 从当前 Docker registry 退出
logs Fetch the logs of a container 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT 查看映射端口对应的容器内部源端口
pause Pause all processes within a container 暂停容器
ps List containers 列出容器列表
pull Pull an image or a repository from the docker registry server 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container 重启运行的容器
rm Remove one or more containers 移除一个或者多个容器
rmi Remove one or more images 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container 创建一个新的容器并运行一个命令
save Save an image to a tar archive 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub 在 docker hub 中搜索镜像
star Start a stopped containers 启动容器
stop Stop a running containers 停止容器
tag Tag an image into a repository 给源中镜像打标签
top Lookup the running processes of a container 查看容器中运行的进程信息
unpause Unpause a paused container 取消暂停容器
version Show the docker version information 查看 docker 版本号
wait Block until a container stops, then print its exit code 截取容器停止时的退出状态值

第四章 docker镜像

4.1 镜像是什么

  • 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
  • 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

4.2 镜像的分层结构

分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载image-20230818114239588

4.3 联合文件系统UnionFSM

  • Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
  • Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

4.4 Docker镜像加载原理

  • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs

  • bootfs(boot file system)主要包含bootloaderkernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统
  • 在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。
  • 当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

rootfs

  • rootfs (root file system) ,在bootfs之上。
  • 包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。
  • rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

image-20230818140121096

平时我们安装进虚拟机的CentOS和Ubuntu都是好几个G,为什么docker这里很小??

image-20230818140239034

  • 对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。
  • 由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs

4.5 为什么要采用分层结构

为什么 Docker 镜像要采用这种分层结构呢

  • 镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
  • 比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像
  • 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

4.6 镜像层可读

Docker镜像层都是只读的,容器层是可写的

  • 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
  • 所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中
  • 只有容器层是可写的,容器层下面的所有镜像层都是只读的。

image-20230818140528509

4.7 Docker镜像commit操作案例

docker commit提交容器副本使之成为一个新的镜像

指令 说明
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名] 提交

commit也相当于是在本地仓库中提交了镜像,仅仅是在本地

下面做个演示

  1. 首先开启Ubuntu容器
docker run -it ubuntu bash
  1. 然后下载vim指令
apt-get update
apt-get -y install vim
  1. 然后随便编辑一个文件
vim /home/hello.txt
  1. 然后再提交这个容器
docker commit -a="crispy candy" -m="安装了vim的Ubuntu" 2df82f3a53ab test/myubuntu:1.0.3

image-20230818142234874

重新启动镜像,可以发现还有vim指令

image-20230818142433683

  • Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。
  • 新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层

image-20230818142449205

第五章 本地镜像发到阿里云

image-20230818142811033

  • 容器编程镜像就是通过commit指令

5.1 镜像的生成方法

一般有两种

  1. container通过commit指令生成 docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
  2. dockerfile通过build指令生成

在上面学过,只有容器是可写的,镜像是只可读的,因此容器可以生成新的镜像

5.2 本地镜像推送到阿里云

image-20230818142811033

这里演示的是走左边的分支,即阿里云Docker Registry

5.2.1 创建仓库

  1. 选择控制台,进入容器镜像服务
  2. 选择个人实例

image-20230818143319117

image-20230818143454397

  1. 命名空间

image-20230818143726249

image-20230818144037979

  1. 仓库名称

image-20230818143832930

image-20230818143857546

  1. 获取仓库上传脚本

image-20230818144006454

5.2.2 上传镜像

主要是登录和推送

docker login --username=crispycandy750 registry.cn-hangzhou.aliyuncs.com  # 推送需要先登录
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/testregister/myubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/testregister/myubuntu:[镜像版本号]

image-20230818144655596

应该是每个仓库只能有一种镜像,当然可以有该镜像的多个版本

image-20230818144744647

5.2.3 拉下镜像

docker pull registry.cn-hangzhou.aliyuncs.com/testregister/myubuntu:[镜像版本号]

image-20230818145212909

5.3 私有库Docker Registry

私有库是什么

  1. 官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
  2. Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
  3. Docker Registry是官方提供的工具,可以用于构建私有镜像仓库

5.3.1 创建本地仓库

  1. 下拉镜像 Docker Registry
docker pull registry
  1. 运行私有库,相当于本地有个私有的Docker hub
docker run -d -p 5000:5000 -v /test/myregistry:/tmp/registry --privileged=true registry
选项 说明
-p 5000:5000 主机的5000端口映射到了容器的5000端口
-v /test/myregistry:/tmp/registry 设置仓库的映射,registry这个容器比较特殊,可以设置映射
默认情况,仓库被创建在容器的/var/lib/registry目录下
建议自行用容器卷映射,方便于宿主机联调
-d 后台运行(不后台运行就会霸占前台)
  1. 修改配置使其支持http

docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。

在主机上执行

vim /etc/docker/deamon.json
{
  "registry-mirrors": ["https://yg2hw0jm.mirror.aliyuncs.com"],
   // 添加下面这一行
  "insecure-registries":["192.168.200.130:5000"]  
}

然后重新启动docker和容器

systemctl restart docker
docker run -d -p 5000:5000 -v /test/myregistry:/tmp/registry --privileged=true registry

5.3.2 上传镜像

首先给ubuntu容器添加ifconfig命令

apt-get update
apt-get install net-tools

image-20230818164411457

  1. 首先将容器commit成为镜像(这个ubuntu安装了ifconfig的指令)
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
  1. 验证私服上有什么镜像
curl -XGET http://主机ip:主机映射端口/v2/_catalog

可以看到什么镜像都没有

image-20230818164854143

  1. 将镜像的名称改成符合私服规范的镜像名
docker   tag   镜像:Tag   Host:Port/Repository:Tag

image-20230818165052644

  1. push到私服

push之前要打开docker的http权限

docker push 192.168.200.130:5000/myubuntu:1.3

这里已经根据要求命名了。自动推到私服

  1. 再次查看
curl -XGET http://主机ip:主机映射端口/v2/_catalog

image-20230818165944105

5.3.3 拉到本地

docker pull 192.168.200.130:5000/myubuntu:1.3

image-20230818170247788

posted @ 2023-09-17 17:27  Crispy·Candy  阅读(23)  评论(0编辑  收藏  举报