Docker 学习笔记 - 基础一 安装、常用命令、镜像和发布

Docker 学习笔记 - 基础一

笔记记录尚硅谷周阳老师的 docker 教程
链接地址: https://www.bilibili.com/video/BV1gr4y1U7CY?p=1

1. 安装

放在128 机器上
https://zhuanlan.zhihu.com/p/112937605
使用Linux的系统CentOS7

1.1 更新yum包

​sudo yum update

1.2 安装需要的包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

1.3 配置镜像仓库,设置yum源为阿里云
– 使用国内的源

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.4 安装docker

sudo yum install docker-ce

1.5 启动Docker

systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker

2. 利用阿里云镜像加速器

参考文档:
https://zhuanlan.zhihu.com/p/112937605
https://blog.csdn.net/huangjhai/article/details/118854733

3. 常用命令

3.1 新建、启动容器

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

在这里插入图片描述

OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=“容器新名字” 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p

在这里插入图片描述
#使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

docker run -it centos /bin/bash

参数说明:
-i: 交互式操作。
-t: 终端。
centos : centos 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:

3.2 列出所有当前正在运行的容器

docker ps [OPTIONS]

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

3.3 退出容器

两种方式
在这里插入图片描述

3.4 容器的启动和停止

# 容器启动
docker start 容器ID或容器名
# 容器停止
docker stop 容器ID或容器名
# 容器重启
docker restart 容器ID或容器名
# 强制停止容器
docker kill 容器ID或容器名

3.5 容器的删除

# 删除已停止的容器
docker rm 容器ID

一次性删除多个容器实例

比较危险,生产上不要用
删除所有容器
docker rm -f $(docker ps -a -q)
或者
docker ps -a -q | xargs docker rm

3.6 重要命令

3.6.1 启动守护式容器(后台服务器)

有镜像才能创建容器,这是根本前提(下载一个Redis6.0.8镜像演示)

	# 下载Redis:
	docker pull redis:6.0.8 

暴露redis端口, f1b6973564e9是image id, 把6379端口暴露到6479端口上

	# f1b6973564e9 是 redis 镜像名
	docker run -d -p 6479:6379 --name myredis f1b6973564e9
# 命令行:
docker run -d 容器名
# 前台交互式启动:
docker run -it redis:6.0.8
# 后台守护式启动:  
docker run -d redis:6.0.8
3.6.2 查看指定容器的日志
docker logs -f ad13e0a1e899 
3.6.3 查看容器内运行的进程
docker top 容器ID
3.6.4 查看容器内部细节
docker inspect 容器ID
3.6.5 进入正在运行的容器并以命令行交互(重要)
# 可参考
doker exec -help
# 指令格式
docker exec -it 容器ID /bin/bash

# 具体例子:查看redis容器
docker exec -it ad13e0a1e899 /bin/bash
3.6.6 重新进入
docker attach 容器ID

attach 直接进入容器启动命令的终端,不会启动新的进程
用exit退出,会导致容器的停止。
在这里插入图片描述
exec 是在容器中打开新的终端,并且可以启动新的进程
用exit退出,不会导致容器的停止
在这里插入图片描述
推荐使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

一般用-d后台启动的程序,再用exec进入对应容器实例,如下:

# 后台守护式启动:  
docker run -d -p 6479:6379 --name myredis f1b6973564e9
# exec 进入容器实例, 两个都可以
docker exec -it f1b6973564e9 /bin/bash
docker exec -it myredis /bin/bash

在这里插入图片描述

3.6.7 从容器内拷贝文件到主机上

容器 -> 主机

docker cp 容器ID:容器内路径 目的主机路径
docker cp 容器名称:容器内路径 目的主机路径

# 例子:
mkdir /usr/local/docker/nginx/conf1112 /usr/local/docker/nginx/html1112 /usr/local/docker/nginx/logs1112
# 容器ID 或者容器名称
docker cp mynginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/conf1112/nginx.conf
docker cp mynginx:/etc/nginx/conf.d /usr/local/docker/nginx/conf1112/conf.d
docker cp mynginx:/usr/share/nginx/html /usr/local/docker/nginx/html1112
docker cp mynginx:/var/log/nginx /usr/local/docker/nginx/logs1112
3.6.8 导入和导出容器
  • 1). 概念:

export: 导出容器的内容留作为一个tar归档文件(对应import命令) import:
从tar包中的内容创建一个新的文件系统再导入位镜像(对应export)

  • 2). 案例:在 docker 中导入和导出 ubuntu 系统
# pull ubuntu
docker pull ubuntu
# 查看镜像
docker images

在这里插入图片描述

  • 3). 启动容器:
docker run -it ubuntu /bin/bash
  • 4). 导出容器:
# 用docker ps 查出容器id是 f32074cf62f1
mkdir /usr/local/tardir
docker export f32074cf62f1 > /usr/local/tardir/abcdUbuntu.tar
# 结果:
[root@vm001 admin]# cd /usr/local/tardir/
[root@vm001 tardir]# ll
总用量 73396
-rw-r--r--. 1 root root 75157504 4月  22 17:46 abcdUbuntu.tar
[root@vm001 tardir]# 

此时再删除 ubuntu容器

[root@vm001 tardir]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS          PORTS                                                                                         NAMES
f32074cf62f1   ubuntu         "/bin/bash"              9 minutes ago   Up 9 minutes                                                                                                  confident_morse
[root@vm001 tardir]# docker rm -f f32074cf62f1
f32074cf62f1
  • 5). 导入容器:
[root@vm001 tardir]# cat abcdUbuntu.tar | docker import - pyh/ubuntu:666
sha256:c7200d38aeca985e271e1e1db45e175cb5eb7039eaafe890de744654c31e1bbe
[root@vm001 tardir]# docker images
REPOSITORY           TAG          IMAGE ID       CREATED          SIZE
pyh/ubuntu           666          c7200d38aeca   21 seconds ago   72.8MB
  • 6). 导入结果测试:
[root@vm001 tardir]# docker run -it c7200d38aeca /bin/bash
root@b593a668e937:/# [root@vm001 tardir]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                                                         NAMES
b593a668e937   c7200d38aeca   "/bin/bash"              25 seconds ago   Up 23 seconds                                                                                                 determined_bell

3.7. 小总结

3.7.1 命令列表:

在这里插入图片描述

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 归档文件[对应 import ]

history   Show the history of an image                  # 展示一个镜像形成历史

images    List images                                   # 列出系统当前镜像

import    Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]

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 包中加载一个镜像[对应 save]

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 中搜索镜像

start     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   # 截取容器停止时的退出状态值
3.7.2 相关参考文档

配置阿里云镜像加速器:
https://zhuanlan.zhihu.com/p/112937605

以及查看阿里云镜像加速器的地址配合使用
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

4. docker 镜像

4.1 镜像的概念:

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

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载:
在这里插入图片描述

4.2 UnionFS(联合文件系统)

Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
​特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

4.3 Docker镜像加载原理

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

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
在这里插入图片描述
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??
在这里插入图片描述
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

4.4 docker使用镜像分层结构的原因

镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;

同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

4.5 重点理解

Docker镜像层都是只读的,容器层是可写的。
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
在这里插入图片描述

4.6 docker commit命令

docker commit提交容器副本使之成为一个新的镜像
命令格式:

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

例子:ubuntu安装vim

  • 1). 从docker hub上下载ubuntu镜像到本地并成功运行
  • 2).原始的默认Ubuntu镜像是不带着vim命令的
[root@vm001 admin]# docker run -it ubuntu /bin/bash
root@993946f21878:/# vim a.txt
bash: vim: command not found

  • 3). 外网连通的情况下,安装vim
# docker容器内执行下面两条命令:
apt-get update
apt-get -y install vim
root@993946f21878:/# apt-get update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]                              
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [25.8 kB]                                                                   
Get:4 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [870 kB]                                                                      
Get:5 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1771 kB]                                                                         
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]                                                                                              
Get:6 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]                                                                                      
Get:7 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]                                                                                    
Get:8 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]                                                                             
Get:9 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]                                                                               
Get:10 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]                                                                             
Get:11 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]                                                                                  
Get:12 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2185 kB]                                                                          
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1214 kB]                                                                    
Get:14 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1153 kB]                                                                      
Get:15 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [30.3 kB]                                                                    
Get:16 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [51.2 kB]                                                                        
Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [26.0 kB]                                                                    
Ign:5 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages                                                                                   
Get:18 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1139 kB]
Get:5 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1771 kB]                                                                         
Fetched 21.7 MB in 4min 3s (89.1 kB/s)                                                                                                                       
Reading package lists... Done

root@993946f21878:/# apt-get -y install vim
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
# 以下略去好多行下载代码

验证:

root@993946f21878:/# vim a.txt
root@993946f21878:/# cat a.txt 
this is a new ubuntu new image with vim
  • 4). 安装完成后,commit我们自己的新镜像
# 再写一遍
# docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
docker commit -m="add vim cmd" -a="boger peng" 993946f21878 pyh/myubuntu:1.666

在这里插入图片描述

  • 5). 启动我们的新镜像并和原来的对比
1 官网是默认下载的Ubuntu没有vim命令
2 我们自己commit构建的镜像,新增加了vim功能,可以成功使用。
3 直接多了100多M

4.7 小总结

Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。

新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层
在这里插入图片描述

5. 本地镜像发布到阿里云

5.1 本地镜像发布到阿里云流程

在这里插入图片描述

5.2 镜像生成方法

5.2.1 docker commit(参照4.6)
5.2.2 docker file

后面会详细讲

5.3 本地镜像推送到阿里云

5.3.1 本地镜像素材原型(两个)
[root@vm001 docker]# docker images
REPOSITORY           TAG          IMAGE ID       CREATED         SIZE
pyh/myubuntu         1.666        b27ccd4c001a   17 hours ago    176MB
pyh/ubuntu           666          c7200d38aeca   47 hours ago    72.8MB
5.3.2 阿里云开发者平台
https://promotion.aliyun.com/ntms/act/kubernetes.html
5.3.3 创建仓库镜像

1). 选择控制台,进入容器镜像服务
在这里插入图片描述
2). 选择个人实例
在这里插入图片描述
3). 命名空间
设置默认仓库类型为:公开
在这里插入图片描述
4). 仓库名称
在这里插入图片描述
在这里插入图片描述

5.3.4 管理界面可以获得相应执行脚本
https://cr.console.aliyun.com/repository/cn-hangzhou/xxxxx/myubuntu/details
5.3.5 镜像推送到阿里云

在这里插入图片描述

  • 登录
[root@vm001 docker]# docker login --username=xxxxxx 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@vm001 docker]# 
  • 打tag
[root@vm001 docker]# docker images
REPOSITORY           TAG          IMAGE ID       CREATED         SIZE
pyh/myubuntu         1.666        b27ccd4c001a   17 hours ago    176MB
pyh/ubuntu           666          c7200d38aeca   2 days ago      72.8MB

# docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:[镜像版本号]
docker tag b27ccd4c001a registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:1.666
  • push包
# docker push registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:1.666

[root@vm001 docker]# docker push registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:1.666
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu]
4b8a76068bc4: Pushed 
9f54eef41275: Pushed 
1.666: digest: sha256:32d78127d727ccc2ae3f7a85b281d570172488a4544b3ea6c82a7640f26ca5ab size: 741
  • 阿里云查看镜像
    在这里插入图片描述
5.3.6 从阿里云拉取镜像
  • 删除原有镜像
[root@vm001 docker]# docker images
REPOSITORY                                                    TAG          IMAGE ID       CREATED         SIZE
pyh/myubuntu                                                  1.666        b27ccd4c001a   18 hours ago    176MB
registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu   1.666        b27ccd4c001a   18 hours ago    176MB
pyh/ubuntu                                                    666          c7200d38aeca   2 days ago      72.8MB

[root@vm001 docker]# docker rmi -f b27ccd4c001a
Untagged: pyh/myubuntu:1.666
Untagged: registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:1.666
Untagged: registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu@sha256:32d78127d727ccc2ae3f7a85b281d570172488a4544b3ea6c82a7640f26ca5ab
Deleted: sha256:b27ccd4c001a2777b9514b873b080e41e90cafbb5339493bcf459476bb326290
Deleted: sha256:6febcdc08c65808b3ba3f0f70b8ec87bc745e9fe69ddca58d39579d8fa88f775
[root@vm001 docker]# docker images
REPOSITORY           TAG          IMAGE ID       CREATED         SIZE
pyh/ubuntu           666          c7200d38aeca   2 days ago      72.8MB

  • 拉取镜像
# docker pull registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:[镜像版本号]
docker pull registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:1.666
# 拉取镜像
[root@vm001 docker]# docker pull registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:1.666
1.666: Pulling from xxxxx/myubuntu
7b1a6ab2e44d: Already exists 
3fed42e29117: Pull complete 
Digest: sha256:32d78127d727ccc2ae3f7a85b281d570172488a4544b3ea6c82a7640f26ca5ab
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:1.666
registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu:1.666
# 查看镜像是否存在
[root@vm001 docker]# docker images
REPOSITORY                                                    TAG          IMAGE ID       CREATED         SIZE
registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu   1.666        b27ccd4c001a   18 hours ago    176MB
pyh/ubuntu                                                    666          c7200d38aeca   2 days ago      72.8MB

# 启动新拉取的镜像,并查看
[root@vm001 docker]# docker run -it b27ccd4c001a /bin/bash
root@d0dfe7dc1d52:/# [root@vm001 docker]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                                                         NAMES
d0dfe7dc1d52   b27ccd4c001a   "/bin/bash"              10 seconds ago   Up 10 seconds                                                                                                 elated_hawking

  • 查看之前添加的文件 a.txt
    在这里插入图片描述

6. 本地镜像发布到私有库

6.1 发布到私有库流程

在这里插入图片描述

6.2 docker registry

1). 官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。

2). Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。

Docker Registry是官方提供的工具,可以用于构建私有镜像仓库

6.3 本地镜像推送到私有库

使用 128 的机器

6.3.1 下载镜像 Docker Registry
docker pull registry 

[root@vm001 admin]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete 
0d96da54f60b: Pull complete 
5b27040df4a2: Pull complete 
e2ead8259a04: Pull complete 
3790aef225b9: Pull complete 
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

6.3.2 运行私有库Registry,相当于本地有个私有Docker hub

默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调

# 这里涉及到 -v 容器数据卷,后面会讲
docker run -d -p 5000:5000  -v /pyh/myregistry/:/tmp/registry --privileged=true registry

[root@vm001 admin]# docker run -d -p 5000:5000  -v /pyh/myregistry/:/tmp/registry --privileged=true registry
3abfa367a021d87d09235956c4ae05594135436b9768dbdc2de05a9530f5a7f9
[root@vm001 admin]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                                                         NAMES
3abfa367a021   registry       "/entrypoint.sh /etc…"   24 seconds ago   Up 22 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp                                                     nifty_shtern

6.3.3 案例演示创建一个新镜像,ubuntu安装ifconfig命令
# 运行最原始的 ubuntu 镜像,它是不带着 ipconfig 命令的
[root@vm001 admin]# docker run -it ubuntu /bin/bash
root@e5e0066d1fcc:/# 
root@e5e0066d1fcc:/# vim a.txt
bash: vim: command not found
root@e5e0066d1fcc:/# 
root@e5e0066d1fcc:/# ifconfig
bash: ifconfig: command not found
  • 1). docker容器内执行下面两条命令:
apt-get update

apt-get install net-tools

结果:

root@e5e0066d1fcc:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.5  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:05  txqueuelen 0  (Ethernet)
        RX packets 3452  bytes 22298596 (22.2 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2886  bytes 162679 (162.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  • 2). 安装完成后,commit我们自己的新镜像
# 公式:
# docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
# 命令:在容器外执行,记得

docker commit -m="ifconfig cmd add" -a="pyh" e5e0066d1fcc pyhubuntu:2.777

[root@vm001 admin]# docker commit -m="ifconfig cmd add" -a="pyh" e5e0066d1fcc pyhubuntu:2.777
sha256:8117dfe394e644899423709f94769bf8b0513b2def42c3f73c1c23851bebb9d0
[root@vm001 admin]# docker images
REPOSITORY                                                    TAG          IMAGE ID       CREATED          SIZE
pyhubuntu                                                     2.777        8117dfe394e6   18 seconds ago   109MB
ubuntu                                                        latest       ba6acccedd29   6 months ago    72.8MB

  • 3). 启动我们的新镜像并和原来的对比
    官网是默认下载的Ubuntu没有ifconfig命令
    我们自己commit构建的新镜像,新增加了ifconfig功能,可以成功使用。
# 新镜像能够使用 ifconfig 功能
[root@vm001 admin]# docker images
REPOSITORY                                                    TAG          IMAGE ID       CREATED         SIZE
pyhubuntu                                                     2.777        8117dfe394e6   2 minutes ago   109MB
[root@vm001 admin]# docker run -it pyhubuntu:2.777 /bin/bash
root@9ddd17d9aeb9:/# 
root@9ddd17d9aeb9:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.5  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:05  txqueuelen 0  (Ethernet)
        RX packets 7  bytes 586 (586.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
6.3.4 curl验证私服库上有什么镜像

curl -XGET http://192.168.226.128:5000/v2/_catalog

# 可以看到,目前私服库没有任何镜像上传过。。。。。。
# 如果没有联通,可查看防火墙是否有开放该端口,或者直接关闭防火墙(不推荐)
[root@vm001 admin]# curl -XGET http://192.168.226.128:5000/v2/_catalog
{"repositories":[]}
6.3.5 将新镜像 pyhubuntu:2.777 修改符合私服规范的Tag

按照公式:

docker tag 镜像:Tag Host:Port/Repository:Tag

自己host主机IP地址,填写自己的,不要粘贴错误

使用命令 docker tag
将 pyhubuntu:2.777 这个镜像修改为192.168.226.128:5000/pyhubuntu:2.777

# 具体指令执行后,能看到出现了另外的一个 2.777 的镜像
docker tag  pyhubuntu:2.777 192.168.226.128:5000/pyhubuntu:2.777

[root@vm001 admin]# docker tag  pyhubuntu:2.777 192.168.226.128:5000/pyhubuntu:2.777
[root@vm001 admin]# 
[root@vm001 admin]# docker images
REPOSITORY                                                    TAG          IMAGE ID       CREATED         SIZE
192.168.226.128:5000/pyhubuntu                                2.777        8117dfe394e6   8 minutes ago   109MB
pyhubuntu                                                     2.777        8117dfe394e6   8 minutes ago   109MB
registry.cn-hangzhou.aliyuncs.com/xxxxx/myubuntu   1.666        b27ccd4c001a   24 hours ago    176MB
pyh/ubuntu                                                    666          c7200d38aeca   2 days ago      72.8MB

6.3.6 修改配置文件使之支持http
[root@vm001 admin]# cat /etc/docker/daemon.json 

{
  "registry-mirrors": ["https://n76ky23k.mirror.aliyuncs.com"]
  # 添加安全注册的地址, 记得有逗号
  ,"insecure-registries": ["192.168.226.128:5000"]	
}

# 修改完成后,重启docker
[root@vm001 admin]# systemctl daemon-reload
[root@vm001 admin]# systemctl restart docker

上述理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker

6.3.7 push推送到私服库
# 再次启动 docker registry, 并设置为常开
[root@vm001 admin]# docker run -d -p 5000:5000  -v /pyh/myregistry/:/tmp/registry --privileged=true registry
b014f0b061b4c39c5d13cfdcbc38e4cbb64cbb8c5939ba4fa2385cbd5628165b
[root@vm001 admin]# 
[root@vm001 admin]# docker update --restart=always b014f0b061b4
b014f0b061b4

# docker push
[root@vm001 admin]# docker push 192.168.226.128:5000/pyhubuntu:2.777
The push refers to repository [192.168.226.128:5000/pyhubuntu]
3e483ae5b1e1: Pushed 
9f54eef41275: Pushed 
2.777: digest: sha256:603d7e0e5cc90b71a9a130f9063654355f79aca236b5a631c68a2bcd9c63dfbb size: 741
[root@vm001 admin]# 
6.3.8 curl验证私服库上有什么镜像2

curl -XGET http://192.168.226.128:5000/v2/_catalog

# 私服库上面有 pyhubuntu 的镜像
[root@vm001 admin]# curl -XGET http://192.168.226.128:5000/v2/_catalog
{"repositories":["pyhubuntu"]}
[root@vm001 admin]# 
6.3.9 pull到本地并运行

1). 删本地镜像

[root@vm001 admin]# docker rmi -f 192.168.226.128:5000/pyhubuntu:2.777
Untagged: 192.168.226.128:5000/pyhubuntu:2.777
Untagged: 192.168.226.128:5000/pyhubuntu@sha256:603d7e0e5cc90b71a9a130f9063654355f79aca236b5a631c68a2bcd9c63dfbb
[root@vm001 admin]# 

2). docker pull 192.168.226.128:5000/pyhubuntu:2.777

# 拉取私有库镜像
[root@vm001 admin]# docker pull 192.168.226.128:5000/pyhubuntu:2.777
2.777: Pulling from pyhubuntu
Digest: sha256:603d7e0e5cc90b71a9a130f9063654355f79aca236b5a631c68a2bcd9c63dfbb
Status: Downloaded newer image for 192.168.226.128:5000/pyhubuntu:2.777
192.168.226.128:5000/pyhubuntu:2.777
# 查询镜像
[root@vm001 admin]# docker images
REPOSITORY                                                    TAG          IMAGE ID       CREATED          SIZE
192.168.226.128:5000/pyhubuntu                                2.777        8117dfe394e6   33 minutes ago   109MB
pyhubuntu                                                     2.777        8117dfe394e6   33 minutes ago   109MB

# 启动拉取的镜像 -- 记得启动命令添加版本号
[root@vm001 admin]# docker run -it 192.168.226.128:5000/pyhubuntu /bin/bash
Unable to find image '192.168.226.128:5000/pyhubuntu:latest' locally
docker: Error response from daemon: manifest for 192.168.226.128:5000/pyhubuntu:latest not found: manifest unknown: manifest unknown.
See 'docker run --help'.
[root@vm001 admin]# docker run -it 192.168.226.128:5000/pyhubuntu:2.777 /bin/bash
root@eeca92df6d68:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.5  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:05  txqueuelen 0  (Ethernet)
        RX packets 7  bytes 586 (586.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

7. 本地镜像发布到 docker hub

参考雷丰阳老师的课和他的笔记:

https://www.bilibili.com/video/BV13Q4y1C7hS?p=23
https://www.yuque.com/leifengyang/oncloud/ox16bw

如下:

7.1 找镜像

以 nginx 为例子

docker pull nginx  #下载最新版

镜像名:版本名(标签)
docker pull nginx:1.20.1

docker pull redis  #下载最新
docker pull redis:6.2.4 # 下载指定版本

## 下载来的镜像都在本地
docker images  #查看所有镜像

redis = redis:latest
## 删除镜像
docker rmi 镜像名:版本号/镜像id

7.2 启动容器

启动nginx应用容器,并映射88端口,测试的访问

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

【docker run  设置项   镜像名  】 镜像启动运行的命令(镜像里面默认有的,一般不会写)

# -d:后台运行
# --restart=always: 开机自启
docker run --name=mynginx   -d  --restart=always -p  88:80   nginx

# 查看正在运行的容器
docker ps
# 查看所有
docker ps -a
# 删除停止的容器
docker rm  容器id/名字
docker rm -f mynginx   #强制删除正在运行中的

#停止容器
docker stop 容器id/名字
#再次启动
docker start 容器id/名字

#应用开机自启
docker update 容器id/名字 --restart=always

7.3 修改容器内容

7.3.1 容器内部修改
# 进入容器内部的系统,修改容器内容
docker exec -it 容器id  /bin/bash
7.3.2 挂载到容器外部修改
docker run --name=mynginx   \
-d  --restart=always \
-p  88:80 -v /data/html:/usr/share/nginx/html:ro  \
nginx

# 修改页面只需要去 主机的 /data/html

7.4 提交改变和镜像传输

commit changes

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

docker commit -a "leifengyang"  -m "首页变化" 341d81f7504f guignginx:v1.0

镜像传输

# 将镜像保存成压缩包
docker save -o abc.tar guignginx:v1.0

# 别的机器加载这个镜像
docker load -i abc.tar

# 离线安装
# 即把打好的 .tar 包传输过去安装

7.5 推送到 docker hub(企业包不建议这么做)

# 命令格式
docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname

具体操作

# 把旧镜像的名字,改成仓库要求的新版名字
docker tag guignginx:v1.0 leifengyang/guignginx:v1.0

# 登录到docker hub
docker login       

docker logout(推送完成镜像后退出)

# 推送
docker push leifengyang/guignginx:v1.0

# 别的机器下载
docker pull leifengyang/guignginx:v1.0

7.6 补充

docker logs 容器名/id   排错

docker exec -it 容器id /bin/bash


# docker 经常修改nginx配置文件
docker run -d -p 80:80 \
-v /data/html:/usr/share/nginx/html:ro \
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf \
--name mynginx-02 \
nginx


#把容器指定位置的东西复制出来 
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf  /data/conf/nginx.conf
#把外面的内容复制到容器里面
docker cp  /data/conf/nginx.conf  5eff66eec7e1:/etc/nginx/nginx.conf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值