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 @   Crispy·Candy  阅读(57)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
主题色彩