【Docker笔记01】【基础内容】

一、前言

本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件,部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0

本系列仅为自身学习笔记记录使用,记录存在偏差,推荐阅读原视频内容或本文参考笔记。


二、Docker 概述

Docker的主要目标是:Build, Ship and Run Any App, Anywhere,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能做到一次镜像,处处运行。

1. Docker运行速度快的原因

Docker有比虚拟机更少的抽象层:

由于Docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker有明显优势。

Docker利用的是宿主机的内核,而不需要加载操作系统OS内核:

当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较耗时耗资源的过程。当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。

2. Docker 三要素

Docker容器的本质就是一个进程。

  1. 镜像 :Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。
  2. 容器 :Docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。
  3. 仓库 :Docker仓库是集中存放镜像文件的场所。仓库分为公开仓库和私有仓库两种。最大的公开仓库是Docker官方的Docker Hub:https://hub.docker.com/

3. Docker架构

Docker是一个 C/S(Client-Server) 结构的系统,后端是一个松耦合架构,众多模块各司其职。

Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从容器接收命令并管理运行在主机上的容器。

Docker运行的基本流程为:

  1. 用户是使用Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
  2. Docker Daemon 作为 Docker 架构的主体部分,首先提供 Docker Server 的功能使其可以接收 Docker Client 的请求
  3. Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在
  4. Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载镜像以 Graph 的形式存储
  5. 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境
  6. 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成
  7. Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作

三、Docker 的安装

1. 基础安装

官方安装文档地址:https://docs.docker.com/engine/install/centos/

bash 复制代码
# 安装 gcc
[root@192 ~]# yum -y install gcc
[root@192 ~]# yum -y install gcc- c++
# 根据官网命令执行
[root@192 ~]# yum install -y yum-utils
# 指定镜像仓库,这里换成国内阿里云
[root@192 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新 yum 缓存,可以不执行,执行了yum 下载会更快
[root@192 ~]# yum makeche fast

# 安装 Docker 引擎
[root@192 ~]#  yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动 Docker 引擎
[root@192 ~]# systemctl start docker
# 查看 Docker 版本信息
[root@192 ~]#  docker version
# 运行 hello world : 会从仓库中下载 helloworld 镜像并运行
[root@192 ~]# docker run hello-world

2. 可选:配置阿里云镜像加速(阿里云登录后控制台如下操作)



按照上图教程执行命令 (需要修改为自己的加速器地址)

bash 复制代码
[root@192 ~]#  mkdir -p /etc/docker
[root@192 ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://xxxxxxxx.com"]
> }
> EOF
{
  "registry-mirrors": ["https://xxxxxxxx.com"]
}
[root@192 ~]# systemctl daemon-reload
[root@192 ~]# systemctl restart docker

3. Docker Run 命令 的执行过程

4. 补充

4.1 Docker 的卸载

powershell 复制代码
# 关闭 Docker 服务
[root@192 ~]# systemctl stop docker
# 删除 Docker 引擎
[root@192 ~]# yum remove docker-ce docker-ce-cli containerd.io
# 删除镜像、容器、卷、自定义配置等文件
[root@192 ~]# rm -rf /var/lib/docker
[root@192 ~]# rm -rf /var/lib/containerd

4.2 Docker 比 VM 快的原因

四、Docker 常用命令

1. 帮助启动类命令

bash 复制代码
# 启动 docker
[root@192 ~]# systemctl start docker
# 停止 docker
[root@192 ~]# systemctl stop docker
# 重启 docker
[root@192 ~]# systemctl restart docker
# 查看 docker 状态
[root@192 ~]# systemctl status docker
# 开机启动
[root@192 ~]# systemctl enable docker
# 查看 docker 概要信息
[root@192 ~]# docker info
# 查看docker 总体帮助文档
[root@192 ~]# docker --help
# 查看 docker命令帮助文档
[root@192 ~]# docker [具体命令] --help

2. 镜像命令

2.1 docker images

bash 复制代码
# 列出 本机镜像信息;docker -image -a (查看全部镜像);docker -image -q(只展示镜像IMAGE ID); docker -image -aq (组合使用)
[root@192 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   10 months ago   13.3kB

命令展示的表头信息释义:

  1. REPOSITORY :表示镜像的仓库源
  2. TAG : 镜像的标签版本号
  3. IMAGE ID :镜像ID
  4. CREATED :镜像创建时间
  5. SIZE :镜像大小

同一仓库源可以有多个 TAG 版本,代表这个仓库源的不同版本,可以使用 REPOSITORY:TAG 来定义不同的镜像,如果不执行镜像的 TAG,则会默认使用 lastest 版本。

bash 复制代码
# 查找 镜像仓库中的 Redis 镜像
[root@192 ~]# docker search redis
NAME                                DESCRIPTION                                      STARS     OFFICIAL
redis                               Redis is an open source key-value store that...   12715     [OK]
redislabs/redisinsight              RedisInsight - The GUI for Redis                 97        
redislabs/redisearch                Redis With the RedisSearch module pre-loaded...   62        
redis/redis-stack-server            redis-stack-server installs a Redis server w...   68        
redis/redis-stack                   redis-stack installs a Redis server with add...   101       
redislabs/rebloom                   A probablistic datatypes module for Redis        26   

命令展示的表头信息释义:

  1. NAME : 镜像名称
  2. DESCRIPTION :镜像说明
  3. STARS :点赞数量
  4. OFFICIAL :是否官方
  5. AUTOMATED :是否是自动构建的

命令支持的其他参数释义:

powershell 复制代码
# --limit N : 只列出来前 N 个镜像,默认25个
# 只列出来前5个 Redis 镜像
[root@192 ~]# docker search --limit 5 redis

2.3 docker pull

bash 复制代码
# 拉取镜像 : 拉取 Redis 镜像,不写版本号默认拉取最新,如 docker pull redis:6.0.8 拉取 Tag 为 6.0.8 的Reids
[root@192 ~]# docker pull redis

2.4 docker system df

bash 复制代码
# 查看镜像、容器、数据卷所占用的空间
[root@192 ~]# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         1         104.2MB   104.2MB (99%)
Containers      1         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

2.5 docker rmi

bash 复制代码
# docker rmi [IMAGE ID] 移除某个镜像,移除 hello-world 镜像; 
# docker rmi 镜像1:TAG 镜像2:TAG 镜像3:TAG : 一次性删除多个镜像
[root@192 ~]# docker rmi 16ecd2772934
# 强制移除某个镜像,即使他被某个容器使用着
[root@192 ~]# docker rmi -f 16ecd2772934
# 删除全部镜像
[root@192 ~]#  docker rmi -f $(docker images -qa)

2.6 虚悬镜像

Docker 的虚悬镜像 :仓库名、标签名都是 的镜像,称为虚悬镜像(dangling image)。

列出docker中的虚悬镜像:

powershell 复制代码
docker image ls -f dangling=true

虚悬镜像一般是因为一些错误而出现的,没有存在价值,可以删除:

powershell 复制代码
# 删除所有的虚悬镜像
docker image prune

3. 容器命令

3.1 docker run [OPTIONS] IMAGE [COMMAND][ARG...]

docker run 用于新建和启动容器

OPTIONS 常用参数说明:

bash 复制代码
--name=[容器名称] : 为容器指定一个名称
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用。

-it:即 -t、-i 同时使用,表示启动交互式容器(前台有微终端,等待交互)

-P: 随机端口映射 (大写P)
-p: 指定端口映射 (小写P),如 -p 8080:80 即将宿主机8080端口映射到docker 容器80 端口

使用如下:

bash 复制代码
# 使用Docker 基于 ubuntu  镜像生成一个容器,并以交互模式在容器中执行 /bin/bash 命令
[root@192 ~]# docker run -it ubuntu /bin/bash
# 进入 ubuntu 容器内容,可以执行常规 Linux 命令操作, exit 退出交互模式(Ctrl + q +p 组合键: 退出容器,容器不关闭)
/
root@71fc025482b7:/# ps -ef 
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:51 pts/0    00:00:00 /bin/bash
root          8      1  0 13:51 pts/0    00:00:00 ps -ef
root@71fc025482b7:/# exit  
exit


# 同上,通过 --name指定了容器的名字
[root@192 ~]# docker run -it --name myu1 ubuntu bash

其他相关命令:

  1. 退出容器的方式:

    • Ctrl + q +p 组合键: 退出容器,容器不关闭
    • exit : 退出并关闭容器
  2. 启动已经停止运行的容器:docker start [容器ID 或 容器名]

  3. 重启容器:docker restart [容器ID 或 容器名]

  4. 停止容器:docker stop [容器ID 或 容器名]

  5. 强制停止容器:docker kill [容器ID 或 容器名]

  6. 删除已经停止的容器(rmi 是删除镜像):docker rm [容器ID 或 容器名]

  7. 强制删除容器(rmi 是删除镜像):docker rm -f [容器ID 或 容器名]

  8. 一次性删除多个容器:docker rm -f $(docker ps -a -q)docker ps -a -q | xargs docker rm

3.2 docker ps [OPTIONS]

docker ps 列出所有正在运行的容器

常用参数

使用如下:

bash 复制代码
[root@192 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
3a512bb471d9   ubuntu    "bash"        22 seconds ago       Up 21 seconds                 myu1
801a1290ecd8   ubuntu    "/bin/bash"   About a minute ago   Up About a minute             elated_liskov
[root@192 ~]# docker ps -q
3a512bb471d9
801a1290ecd8
# 限制最近创建的1个容器。
[root@192 ~]# docker ps -n 1
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
3a512bb471d9   ubuntu    "bash"    3 minutes ago   Up 3 minutes             myu1

3.3 docker run -d [容器名]

docker run -d [容器名] :启动守护式容器(后台服务器)

Docker 机制决定了没有前台进程的服务会被杀死,可以使用 -it 指定前台交互式启动

3.4 docker logs [容器id]

查看容器日志

bash 复制代码
[root@192 ~]# docker run -d redis:6.0.8 
9537da1f6228625aa8693a6d3b58ab250c0b641d9774fcf41320d1fe2640d0a2
[root@192 ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS         PORTS      NAMES
9537da1f6228   redis:6.0.8   "docker-entrypoint.s..."   4 seconds ago   Up 4 seconds   6379/tcp   naughty_satoshi
[root@192 ~]# docker logs 9537da1f6228
1:C 14 Mar 2024 11:13:24.330 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 14 Mar 2024 11:13:24.330 # Redis version=6.0.8, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 14 Mar 2024 11:13:24.330 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 14 Mar 2024 11:13:24.331 * Running mode=standalone, port=6379.
1:M 14 Mar 2024 11:13:24.331 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 14 Mar 2024 11:13:24.331 # Server initialized
1:M 14 Mar 2024 11:13:24.331 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 14 Mar 2024 11:13:24.331 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').
1:M 14 Mar 2024 11:13:24.332 * Ready to accept connections

3.5 docker top [容器ID]

查看容器内进程

bash 复制代码
[root@192 ~]# docker top 9537da1f6228
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             9133                9114                0                   19:13               ?                   00:00:00            redis-server *:6379

3.6 docker inspect [容器ID]

查看容器内部细节

3.7 docker exec -it [容器ID] 和 docker attach [容器ID]

重新进入退出的容器

bash 复制代码
# 运行一个  ubuntu 容器
[root@192 ~]# docker run -it ubuntu /bin/bash
root@bfdb196ae
# 查看存活的容器
[root@192 ~]# docker ps 
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS          PORTS      NAMES
bfdb196aecda   ubuntu        "/bin/bash"               30 seconds ago   Up 30 seconds              focused_lalande
9537da1f6228   redis:6.0.8   "docker-entrypoint.s..."   13 minutes ago   Up 13 minutes   6379/tcp   naughty_satoshi
[root@192 ~]# 
# 重新进入刚才的 ubuntu  容器
[root@192 ~]# docker exec -it bfdb196aecda /bin/bash
# 退出容器
root@bfdb196aecda:/# exit
exit
# ubuntu  容器仍然存活
[root@192 ~]# docker ps 
CONTAINER ID   IMAGE         COMMAND                   CREATED              STATUS              PORTS      NAMES
bfdb196aecda   ubuntu        "/bin/bash"               About a minute ago   Up About a minute              focused_lalande
9537da1f6228   redis:6.0.8   "docker-entrypoint.s..."   14 minutes ago       Up 14 minutes       6379/tcp   naughty_satoshi

# attach 命令进入 ubuntu  容器
[root@192 ~]# docker attach bfdb196aecda
# exit 命令退出
root@bfdb196aecda:/# exit
exit
# ubuntu  容器已经被杀死


[root@192 ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS          PORTS      NAMES
9537da1f6228   redis:6.0.8   "docker-entrypoint.s..."   14 minutes ago   Up 14 minutes   6379/tcp   naughty_satoshi
[root@192 ~]# 

docker exec 和 docker attach 区别:

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

如果有多个终端,都对同一个容器执行了 docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。

如下: Docker通过 exec 进入容器并连接 Redis 命令

bash 复制代码
[root@192 ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS         PORTS      NAMES
ab4819a0530d   redis:6.0.8   "docker-entrypoint.s..."   2 minutes ago   Up 2 minutes   6379/tcp   nice_keldysh
[root@192 ~]# docker exec -it ab4819a0530d /bin/bash
root@ab4819a0530d:/data# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
root@ab4819a0530d:/data# exit
exit

3.8 docker cp [容器ID]:[容器内路径] [目的主机路径]

从容器拷贝文件到本机上

bash 复制代码
[root@192 ~]# docker cp 344cbde95ad4:/tmp/a.txt /tmp

3.9 docker export 和 docker import

导入和导出容器

  1. export:导出容器的内容流作为一个tar归档文件(对应import命令);
  2. import:从tar包中的内容创建一个新的文件系统再导入为镜像(对应export命令);
bash 复制代码
[root@192 ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS          PORTS      NAMES
344cbde95ad4   ubuntu        "/bin/bash"               5 minutes ago    Up 5 minutes               nostalgic_mclaren
ab4819a0530d   redis:6.0.8   "docker-entrypoint.s..."   13 minutes ago   Up 13 minutes   6379/tcp   nice_keldysh
# 导出 ubuntu 容器 为宿主机的 /tmp/ubuntu.tar 文件
[root@192 ~]# docker export 344cbde95ad4 > /tmp/ubuntu.tar

# 根据 tar 包导入镜像
# cat tar文件 | docker import - 自定义镜像用户/自定义镜像名:自定义镜像版本号
[root@192 ~]# cat /tmp/ubuntu.tar | docker import - test-ubuntu:6.6.6
sha256:9d946a78c3640f44ab2a76421521df4af0dd9a4af0c10dde9ff8ec67dc0b408e
# 查看镜像
[root@192 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
test-ubuntu   6.6.6     9d946a78c364   23 seconds ago   72.8MB
redis         latest    7614ae9453d1   2 years ago      113MB
ubuntu        latest    ba6acccedd29   2 years ago      72.8MB
redis         6.0.8     16ecd2772934   3 years ago      104MB

五、Docker 镜像

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

1. 镜像的分层

UnionFS (联合文件系统) :UnionFS 时一种分层、请谅解并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。 UnionFS 时 Docker 镜像的基础, 镜像可以通过分层来进行继承、基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

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

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

Docker镜像层都是只读的,容器层是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作"容器层", "容器层"之下的都叫"镜像层"。所有对容器的改动(添加、删除、修改等)都只会发生在容器层。

2. docker commit

基础命令格式如下:

powershell 复制代码
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[tag]

2.1 提交自己制作的镜像

案例 : ubuntu 容器中中添加 vim 命令

bash 复制代码
[root@192 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
d2a1d7523c03   ubuntu    "/bin/bash"   6 seconds ago   Up 6 seconds             relaxed_murdock
[root@192 ~]# docker exec -it d2a1d7523c03 /bin/bash
root@344cbde95ad4:/# vim a.txt
bash: vim: command not found
root@344cbde95ad4:/# 
[root@192 ~]# docker exec -it d2a1d7523c03 /bin/bash
# 更新包管理工具
root@d2a1d7523c03:/# apt-get update
# 安装 vim 命令 (apt-get install net-tools 命令可以安装网络)
root@d2a1d7523c03:/# apt-get -y install vim

# 制作新的镜像
[root@192 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
d2a1d7523c03   ubuntu    "/bin/bash"   5 minutes ago   Up 5 minutes             relaxed_murdock
# 通过 commit 命令制作
[root@192 ~]# docker commit -m="test" -a="kingfish" d2a1d7523c03 kingfis-kingfish:0.0.1
sha256:dececcc5448239fb6627ec70141fa344e00101c606c31b61ccd21555c5ae0fd3
# 制作出的新镜像在本地
[root@192 ~]# docker images
REPOSITORY                 TAG       IMAGE ID       CREATED          SIZE
kingfish/ubunbu-kingfish   0.0.1     dececcc54482   17 seconds ago   191MB
redis                      latest    7614ae9453d1   2 years ago      113MB
ubuntu                     latest    ba6acccedd29   2 years ago      72.8MB
redis                      6.0.8     16ecd2772934   3 years ago      104MB

2.2 提交自己的镜像到阿里云

在阿里云镜像管理建立自己的空间,参考阿里云的命令进行操作。

具体操作如下:

bash 复制代码
# 上传镜像到阿里云
[root@192 ~]# docker login --username=dingtalk_liqcuw registry.cn-hangzhou.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@192 ~]# docker tag dececcc54482 registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo:1.0.1
[root@192 ~]# docker push registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo:1.0.1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo]
299fcc70a8c4: Pushed 
9f54eef41275: Pushed 
1.0.1: digest: sha256:89a360e9d089d89a08963c2f86ea787e1baaa42e0f86825bbf9a3b77c0abb878 size: 741


# 从阿里云拉取
[root@192 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo:1.0.1

3. docker 私有库

docker 允许用户通过 Docker Registry 建立一个私有的镜像库,来将镜像上传到本地库中。流程步骤如下图:

3.1 新制作一个本地镜像

具体制作过程不展开,跟着上面的Demo 制作,为 ubuntu-ifconfig,增加了 ubuntu 支持 ifconfig 命令的功能,如下图中的 ubuntu-ifconfig :

bash 复制代码
[root@192 ~]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED         SIZE
ubuntu-ifconfig                                               1.2.0     bce980974e7f   6 minutes ago   124MB
registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo   1.0.1     dececcc54482   3 days ago      191MB
redis                                                         latest    7614ae9453d1   2 years ago     113MB
registry                                                      latest    b8604a3fe854   2 years ago     26.2MB
ubuntu                                                        latest    ba6acccedd29   2 years ago     72.8MB
redis                                                         6.0.8     16ecd2772934   3 years ago     104MB

3.2 安装 Docker Registry

Docker Registry 本身就是一个镜像,因此可以直接拉取后启动

bash 复制代码
[root@192 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
# 拉取  Docker Registry
[root@192 ~]# docker pull registry
# 启动 Docker Registry 容器
[root@192 ~]# docker run -d -p 5000:5000 -v /dr/myregistry/:/tmp/registry --privileged=true registry
0579513c7c3a40ff1dfe7af4fc6b494f67b0a2e7cacf5de464b7b4c6857e471b
[root@192 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS          PORTS                                       NAMES
0579513c7c3a   registry   "/entrypoint.sh /etc..."   59 seconds ago   Up 59 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   friendly_ritchie

3.3 上传镜像

bash 复制代码
# 验证私服库上的镜像内容
[root@192 ~]# curl -XGET http://localhost:5000/v2/_catalog
{"repositories":[]}

# 将新镜像修改为符合私服库规范,如:docker tag [镜像名]:[Tag] [私库Host]:[私库Port]/[Repository]:[Tag]
[root@192 ~]# docker tag ubuntu-ifconfig:1.2.0 192.168.64.132:5000/ubuntu-ifconfig:1.2.0
# 新增的镜像为【192.168.64.132:5000/ubuntu-ifconfig 】
[root@192 ~]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED          SIZE
192.168.64.132:5000/ubuntu-ifconfig                           1.2.0     bce980974e7f   10 minutes ago   124MB
ubuntu-ifconfig                                               1.2.0     bce980974e7f   10 minutes ago   124MB
registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo   1.0.1     dececcc54482   3 days ago       191MB
redis                                                         latest    7614ae9453d1   2 years ago      113MB
registry                                                      latest    b8604a3fe854   2 years ago      26.2MB
ubuntu                                                        latest    ba6acccedd29   2 years ago      72.8MB
redis                                                         6.0.8     16ecd2772934   3 years ago      104MB

# 宿主机上对 daemon.json  文件增加内容  `"insecure-registries":["192.168.64.132:5000"]` (IP 端口替换为实际内容)
# 因为 Docker 默认不允许 http 方式推送镜像,通过该选项来取消这个限制,修改完如果不生效则重启 docker。
[root@192 ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://ym0ntur0.mirror.aliyuncs.com"]
}
[root@192 ~]# vim /etc/docker/daemon.json 
# 修改后如下
[root@192 ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://ym0ntur0.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.64.132:5000"]
}

# 本机尝试修改完需要重启docker 才生效 (据说高版本不用重启)
[root@192 ~]# systemctl restart docker 
# 重启后重新运行 Docker Registry 容器
[root@192 ~]# docker run -d -p 5000:5000 -v /dr/myregistry/:/tmp/registry --privileged=true registry
57bcf60789633da726f6392fca24c44567bfc2842cd71338699d70af8fbbb505

[root@192 ~]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED          SIZE
192.168.64.132:5000/ubuntu-ifconfig                           1.2.0     bce980974e7f   22 minutes ago   124MB
ubuntu-ifconfig                                               1.2.0     bce980974e7f   22 minutes ago   124MB
registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo   1.0.1     dececcc54482   3 days ago       191MB
redis                                                         latest    7614ae9453d1   2 years ago      113MB
registry                                                      latest    b8604a3fe854   2 years ago      26.2MB
ubuntu                                                        latest    ba6acccedd29   2 years ago      72.8MB
redis                                                         6.0.8     16ecd2772934   3 years ago      104MB
# 推送镜像到本地
[root@192 ~]# docker push 192.168.64.132:5000/ubuntu-ifconfig:1.2.0
The push refers to repository [192.168.64.132:5000/ubuntu-ifconfig]
5a9c7cc5ce7e: Pushed 
9f54eef41275: Pushed 
1.2.0: digest: sha256:17f8674c947da87310188bad54275bba91521585ed41b0cc0733c5e848d3aa7f size: 741
[root@192 ~]# curl -XGET http://localhost:5000/v2/_catalog
{"repositories":["ubuntu-ifconfig"]}

# 删除原始镜像重新拉取
[root@192 ~]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED       SIZE
registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo   1.0.1     dececcc54482   3 days ago    191MB
redis                                                         latest    7614ae9453d1   2 years ago   113MB
registry                                                      latest    b8604a3fe854   2 years ago   26.2MB
ubuntu                                                        latest    ba6acccedd29   2 years ago   72.8MB
redis                                                         6.0.8     16ecd2772934   3 years ago   104MB
[root@192 ~]# docker pull 192.168.64.132:5000/ubuntu-ifconfig:1.2.0
1.2.0: Pulling from ubuntu-ifconfig
7b1a6ab2e44d: Already exists 
bec394bbcba9: Pull complete 
Digest: sha256:17f8674c947da87310188bad54275bba91521585ed41b0cc0733c5e848d3aa7f
Status: Downloaded newer image for 192.168.64.132:5000/ubuntu-ifconfig:1.2.0
192.168.64.132:5000/ubuntu-ifconfig:1.2.0
[root@192 ~]# docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED          SIZE
192.168.64.132:5000/ubuntu-ifconfig                           1.2.0     bce980974e7f   34 minutes ago   124MB
registry.cn-hangzhou.aliyuncs.com/kingfishx/kingfish.gogogo   1.0.1     dececcc54482   3 days ago       191MB
redis                                                         latest    7614ae9453d1   2 years ago      113MB
registry                                                      latest    b8604a3fe854   2 years ago      26.2MB
ubuntu                                                        latest    ba6acccedd29   2 years ago      72.8MB
redis                                                         6.0.8     16ecd2772934   3 years ago      104MB

4. 容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFS,提供一些用于持续存储或共享数据。

特性:卷设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

  • 数据卷可以在容器之间共享或重用数据
  • 卷中的更改可以直接实施生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

基础命令如下:

bash 复制代码
# 如果挂载主机目录访问出现了 cannot open directory Permission denied 则可以在挂载命令加上 --privileged=true参数
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即 使用该参数, container内的root拥有真正的root权限,否则, container内的root只是外部的一个普通用户权限。

以下面的命令为例,意义为:后台启动(-d)一个容器名为 (registry) 的容器,其端口映射为宿主机的5000端口映射到容器的5000端口(-p 5000:5000),同时使用宿主机 /dr/myregistry 路径映射到 容器的 /tmp/registry 路径(-v /dr/myregistry/:/tmp/registry),并且放开权限(--privileged=true)

bash 复制代码
# -v [path01]:[path02] : -v 代表添加自定义容器卷; path01 代表宿主机目录;path02 代表Docker 容器内目录
# --privileged=true : 放开权限
# registry 启动的容器名
[root@192 ~]# docker run -d -p 5000:5000 -v /dr/myregistry/:/tmp/registry --privileged=true registry
bash 复制代码
-v [path01]:[path02]

4.3 容器卷命令

查看容器挂载目录详情 : docker inspect [容器Id]

bash 复制代码
CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS          PORTS                                       NAMES
57bcf6078963   registry   "/entrypoint.sh /etc..."   41 minutes ago   Up 41 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   eloquent_pare
# docker inspect  命令可以查看容器详情,如下图中的 Mounts 节点则为挂载信息
[root@192 ~]# docker inspect 57bcf6078963

4.4 容器卷的读写规则

bash 复制代码
# 默认为 rw 规则:即容器对映射路径默认可读可写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
# 同上
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
# 容器对映射路径是只读的,不可写。宿主机写入内容,容器内可以读取
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

4.5 卷的继承和共享

通过 --volumes-from 命令可以指定子容器继承 父容器的卷映射关系,子容器继承关系后并不会因为父容器改变映射关系而改变。

bash 复制代码
# 创建容器 u1, 配置映射规则
[root@192 ~]# docker run -it --privileged=true -v /mydocker/u:/tmp/u --name u1 ubuntu /bin/bash
root@ccf198e7b9c7:/# 
[root@192 ~]# 
[root@192 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND                   CREATED             STATUS             PORTS                                       NAMES
ccf198e7b9c7   ubuntu     "/bin/bash"               38 seconds ago      Up 37 seconds                                                  u1
57bcf6078963   registry   "/entrypoint.sh /etc..."   About an hour ago   Up About an hour   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   eloquent_pare

# 运行 u2 容器,通过 --volumes-from [容器名] 继承 u1 的容器卷映射规则。
[root@192 ~]# docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu /bin/bash

六、参考内容

B 站 尚硅谷 Docker 视频
https://www.yuque.com/tmfl/cloud/dketq0

相关推荐
MonkeyKing_sunyuhua12 分钟前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
小灰灰__15 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭18 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
准橙考典19 分钟前
怎么能更好的通过驾考呢?
人工智能·笔记·自动驾驶·汽车·学习方法
程序媛小果39 分钟前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林44 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el
duration~2 小时前
Maven随笔
java·maven
zmgst2 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
€☞扫地僧☜€2 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器