一、前言
本系列是根据 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容器的本质就是一个进程。
- 镜像 :Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。
- 容器 :Docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。
- 仓库 :Docker仓库是集中存放镜像文件的场所。仓库分为公开仓库和私有仓库两种。最大的公开仓库是Docker官方的Docker Hub:https://hub.docker.com/
3. Docker架构
Docker是一个 C/S(Client-Server) 结构的系统,后端是一个松耦合架构,众多模块各司其职。
Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从容器接收命令并管理运行在主机上的容器。
Docker运行的基本流程为:
- 用户是使用Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
- Docker Daemon 作为 Docker 架构的主体部分,首先提供 Docker Server 的功能使其可以接收 Docker Client 的请求
- Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载镜像以 Graph 的形式存储
- 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成
- Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作
三、Docker 的安装
1. 基础安装
官方安装文档地址:https://docs.docker.com/engine/install/centos/
# 安装 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. 可选:配置阿里云镜像加速(阿里云登录后控制台如下操作)
按照上图教程执行命令 (需要修改为自己的加速器地址)
[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 的卸载
# 关闭 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. 帮助启动类命令
# 启动 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
# 列出 本机镜像信息;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
命令展示的表头信息释义:
- REPOSITORY :表示镜像的仓库源
- TAG : 镜像的标签版本号
- IMAGE ID :镜像ID
- CREATED :镜像创建时间
- SIZE :镜像大小
同一仓库源可以有多个 TAG 版本,代表这个仓库源的不同版本,可以使用 REPOSITORY:TAG 来定义不同的镜像,如果不执行镜像的 TAG,则会默认使用 lastest 版本。
2.2 docker search
# 查找 镜像仓库中的 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
命令展示的表头信息释义:
- NAME : 镜像名称
- DESCRIPTION :镜像说明
- STARS :点赞数量
- OFFICIAL :是否官方
- AUTOMATED :是否是自动构建的
命令支持的其他参数释义:
# --limit N : 只列出来前 N 个镜像,默认25个
# 只列出来前5个 Redis 镜像
[root@192 ~]# docker search --limit 5 redis
2.3 docker pull
# 拉取镜像 : 拉取 Redis 镜像,不写版本号默认拉取最新,如 docker pull redis:6.0.8 拉取 Tag 为 6.0.8 的Reids
[root@192 ~]# docker pull redis
2.4 docker system df
# 查看镜像、容器、数据卷所占用的空间
[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
# 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中的虚悬镜像:
docker image ls -f dangling=true
虚悬镜像一般是因为一些错误而出现的,没有存在价值,可以删除:
# 删除所有的虚悬镜像
docker image prune
3. 容器命令
3.1 docker run [OPTIONS] IMAGE [COMMAND][ARG…]
docker run 用于新建和启动容器
OPTIONS 常用参数说明:
--name=[容器名称] : 为容器指定一个名称
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用。
-it:即 -t、-i 同时使用,表示启动交互式容器(前台有微终端,等待交互)
-P: 随机端口映射 (大写P)
-p: 指定端口映射 (小写P),如 -p 8080:80 即将宿主机8080端口映射到docker 容器80 端口
使用如下:
# 使用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
其他相关命令:
-
退出容器的方式:
- Ctrl + q +p 组合键: 退出容器,容器不关闭
- exit : 退出并关闭容器
-
启动已经停止运行的容器:docker start [容器ID 或 容器名]
-
重启容器:
docker restart [容器ID 或 容器名]
-
停止容器:
docker stop [容器ID 或 容器名]
-
强制停止容器:
docker kill [容器ID 或 容器名]
-
删除已经停止的容器(rmi 是删除镜像):
docker rm [容器ID 或 容器名]
-
强制删除容器(rmi 是删除镜像):
docker rm -f [容器ID 或 容器名]
-
一次性删除多个容器:
docker rm -f $(docker ps -a -q)
或docker ps -a -q | xargs docker rm
3.2 docker ps [OPTIONS]
docker ps 列出所有正在运行的容器
常用参数
使用如下:
[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]
查看容器日志
[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]
查看容器内进程
[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]
重新进入退出的容器
# 运行一个 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 命令
[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]:[容器内路径] [目的主机路径]
从容器拷贝文件到本机上
[root@192 ~]# docker cp 344cbde95ad4:/tmp/a.txt /tmp
3.9 docker export 和 docker import
导入和导出容器
- export:导出容器的内容流作为一个tar归档文件(对应import命令);
- import:从tar包中的内容创建一个新的文件系统再导入为镜像(对应export命令);
[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
基础命令格式如下:
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[tag]
2.1 提交自己制作的镜像
案例 : ubuntu 容器中中添加 vim 命令
[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 提交自己的镜像到阿里云
在阿里云镜像管理建立自己的空间,参考阿里云的命令进行操作。
具体操作如下:
# 上传镜像到阿里云
[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 :
[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 本身就是一个镜像,因此可以直接拉取后启动
[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 上传镜像
# 验证私服库上的镜像内容
[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不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可以在容器之间共享或重用数据
- 卷中的更改可以直接实施生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
基础命令如下:
# 如果挂载主机目录访问出现了 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)
# -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
-v [path01]:[path02]
4.3 容器卷命令
查看容器挂载目录详情 : docker inspect [容器Id]
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 容器卷的读写规则
# 默认为 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 命令可以指定子容器继承 父容器的卷映射关系,子容器继承关系后并不会因为父容器改变映射关系而改变。
# 创建容器 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