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