徐州建设网站,建设服装网站的意义,网站制作哪家最好,海宁网站怎么做seoDocker与微服务实战#xff08;基础篇#xff09; 1、Docker简介2、Docker安装步骤1.Centos7及以上的版本2.卸载旧版本3.yum安装gcc相关4.安装需要的软件包5.设置stable镜像仓库【国内aliyun】6.更新yum软件包索引--以后安装更快捷7.安装Docker-Ce8.启动Docker9.测试10.卸载1… Docker与微服务实战基础篇 1、Docker简介2、Docker安装步骤1.Centos7及以上的版本2.卸载旧版本3.yum安装gcc相关4.安装需要的软件包5.设置stable镜像仓库【国内aliyun】6.更新yum软件包索引--以后安装更快捷7.安装Docker-Ce8.启动Docker9.测试10.卸载11.配置阿里云镜像加速 3.Docker常用命令帮助启动类命令镜像命令面试题谈谈虚悬镜像是什么怎么删除 容器命令【演示用ubuntu】1.拉取镜像2.新建启动容器3.启动交互式容器前台命令行4.列出当前所有正在运行的容器5.退出容器--两种退出方式6.启动已停止运行的容器7.重启容器8.停止容器9.强制停止容器10.删除已停止的容器 下载一个Redis6.0.8镜像演示1.启动守护式容器后台服务器2.前台交互式启动【不建议】3.查看容器日志4.查看容器内运行的进程5.查看容器内部细节6.进入正在运行的容器并以命令交互7.从容器内拷贝文件到主机上8.导入和导出容器 常用命令小结 4.Docker镜像分层的镜像UnionFS联合文件系统Docker镜像加载原理为什么Docker镜像采用这种分层结构呢重点理解docker镜像commit操作案例--演示ubuntu安装vim总结 5.本地镜像发布到阿里云本地镜像发布到阿里云流程镜像的生成方法将本地镜像推送到阿里云将阿里云的镜像下载本地 6.CentOS7安装DockerCompose6.1.下载6.2.修改文件权限6.3.Base自动补全命令 7.本地镜像发布到私有库--Docker Registry1.下载镜像--创建registry容器并开放端口2.案例演示创建一个新镜像ubuntu安装ifconfig命令3.curl验证私服库上有什么镜像4.将新镜像ubuntu修改符合私服规范的Tag5.修改配置文件使之支持http-配置Docker信任地址6.带有图形化界面版本--更改私有库7.push推送到私服库8.curl验证私服库上有什么镜像9.pull到本地并运行 8.Docker容器数据卷1.运行一个带有容器卷存储功能的实例2.宿主vs容器之间映射添加容器卷绑定映射目录查看数据卷是否挂载成功容器和宿主机之间数据共享 3.容器数据卷读写规则映射添加说明4.卷的继承和共享容器1完成和宿主机的映射 容器2继承容器1的卷规则 9.Docker常规安装简介1.总体步骤2.安装Tomcat【新版本webapps已改为webapps.dist】1.docker hub上面查找tomcat镜像2.从docker hub上拉取tomcat镜像到本地3.docker images查看是否有拉取到的tomcat4.使用tomcat镜像创建容器实例(也叫运行镜像)5.访问猫首页6.免修改版说明 3.安装mysql:5.7简单版1.查询拉取mysql镜像2.使用mysql镜像3.建库建表插入数据4.外部win10连接运行在docker上的Mysql容器实例服务5.中文字符集问题 实战版本1.新建mysql容器实例2.新建my.cnf--通过容器卷同步给mysql容器实例3.重新启动mysql容器实例再重新进入并查看字符编码4.再新建库新建表再插入中文测试 4.安装redis1.下载redis镜像到本地标签为6.0.82.入门命令3.命令提醒容器卷记得加入 --privilegedtrue4.在Centos宿主机下新建目录/app/redis5.将一个redis.conf文件模板拷贝进/app/redis6. /app/redis目录下修改redis.conf文件7.使用redis6.0.8镜像创建容器(也叫运行镜像)8.测试redis-cli连接上来9.请证明docker启动使用了我们自己指定的配置文件10.测试redis-cli连接上来第2次 5.安装Nginx endl 编码开发微服务 上线部署容器化 时时刻刻要监控 devops
1、Docker简介
docker官网https://www.docker.com/ Docker Hub仓库官网https://hub.docker.com/ Docker hub 安装docker镜像的仓库 Docker中有几个重要的概念 镜像ImageDocker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起称为镜像。
容器Container镜像中的应用程序运行后形成的进程就是容器只是Docker会给容器进程做隔离对外不可见。
一切应用最终都是代码组成都是硬盘中的一个个的字节形成的文件。只有运行时才会加载到内存形成进程。
而镜像就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。
容器呢就是将这些文件中编写的程序、函数加载到内存中允许形成进程只不过要隔离起来。因此一个镜像可以启动多次形成多个容器进程。
Docker是一个CS架构的程序由两部分组成
服务端(server)Docker守护进程负责处理Docker指令管理镜像、容器等客户端(client)通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。 2、Docker安装步骤
Docker必须部署在Linux内核的系统上如果其他系统想部署Docker就必须安装一个Linux环境
1.Centos7及以上的版本
uname命令用于打印当前系统相关信息内核版本号、硬件架构、主机名称和操作系统类型等
[root192 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root192 ~]#
[root192 ~]# uname -r
3.10.0-1160.el7.x86_64Docker的基本组成镜像image、容器container、仓库repository
2.卸载旧版本
https://docs.docker.com/engine/install/centos/ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce3.yum安装gcc相关
Centos7能上网yum -y install gccyum -y install gcc-c4.安装需要的软件包 # 国外网址容易报错建议不要照着国外安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo报错:
1[Errno 14] curl#35 -TCP connection reset by peer
2 [Errno 12] curl#35 -Timeout虚拟机联网安装yum工具
yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken5.设置stable镜像仓库【国内aliyun】
然后更新本地镜像源
# 设置docker镜像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i s/download.docker.com/mirrors.aliyun.com\/docker-ce/g /etc/yum.repos.d/docker-ce.repo6.更新yum软件包索引–以后安装更快捷
# 更新yum软件包索引
yum makecache fast7.安装Docker-Ce 然后输入命令
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin或者
yum install -y docker-cedocker-ce为社区免费版本。稍等片刻docker即可安装成功。
8.启动Docker
Docker应用需要用到各种端口逐一去修改防火墙设置。非常麻烦因此建议大家直接关闭防火墙
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalldsystemctl start docker # 启动docker服务systemctl stop docker # 停止docker服务systemctl restart docker # 重启docker服务9.测试
[root192 docker]# ps -ef | grep docker
root 2001 1 7 13:40 ? 00:00:01 /usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock
root 2291 1475 0 13:41 pts/0 00:00:00 grep --colorauto docker
[root192 docker]#
[root192 docker]# docker -v
Docker version 24.0.7, build afdd53b
[root192 docker]#
[root192 docker]# docker version 10.卸载 # 关闭docker
sudo systemctl stop dockersudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras# 卸载第三方库包
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd11.配置阿里云镜像加速
docker官方镜像仓库网速较差我们需要设置国内镜像服务
参考阿里云的镜像加速文档https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors https://promotion.aliyun.com/ntms/act/kubernetes.html
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json -EOF
{registry-mirrors: [https://hjisj8si.mirror.aliyuncs.com]
}
EOF# 查看文件内容
cat /etc/docker/daemon.json sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker3.Docker常用命令
帮助启动类命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help镜像命令
# 列出本地主机上的镜像
docker images
#列出本地所有的镜像(含历史映像层)
docker images -a
# 只显示镜像ID
docker images -q# 查找镜像
docker search [POTIONS]镜像名字
#只列出N个镜像默认是25个
docker search --limit
#只列出5个redis镜像
docker search --limit 5 redis# 下载镜像
docker pull 镜像名字[:TAG] {TAG:镜像的标签版本号}
#没有TAG就是最新版本
docker pull 镜像名字
docker pull 镜像名字:latest
docker pull ubuntu
docker pull redis:6.0.8# 查看镜像/容器/数据卷所占的空间
docker system df#删除某个镜像
docker rmi 某个镜像名字ID
#强制删除某个镜像
docker rmi -f 某个镜像名字ID
#强制删除多个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG
#强制删除多个镜像
docker rmi -f $(docker images -qa)面试题谈谈虚悬镜像是什么怎么删除
仓库名、标签都是none的镜像俗称虚悬镜像dangling image对于这样的虚悬镜像一定要删除。
查看虚悬镜像命令
docker images ls -f danglingtrue命令结果 这种虚悬镜像已经失去了存在价值可以删除。
删除虚悬镜像命令
docker image prune容器命令【演示用ubuntu】
下载一个ubuntu或者Centos镜像演示
1.拉取镜像
#拉取镜像
docker pull centos
docker pull ubuntu2.新建启动容器
#新建启动容器
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
OPTIONS说明常用:有些是一个减号有些是两个减号
--name容器新名字 为容器指定一个名称;
-d : 后台运行容器并返回容器ID也即启动守护式容器(后台运行);
-i : 以交互模式运行容器通常与-t同时使用;
-t : 为容器重新分配一个伪输入终端通常与-i同时使用;也即启动交互式容器(前台有伪终端等待交互);3.启动交互式容器前台命令行
#启动交互式容器前台命令行
docker run -it ubuntu bash
docker run -it ubuntu /bin/bash
docker run -it --namemyu1 ubuntu bash4.列出当前所有正在运行的容器
#列出当前所有正在运行的容器
docker ps
docker ps [OPTIONS]
OPTIONS说明常用:
-a :列出当前所有正在运行的容器历史上运行过的
-l :显示最近创建的容器。
-n :显示最近n个创建的容器。
-q :静默模式只显示容器编号。5.退出容器–两种退出方式
#退出容器--两种退出方式
exit run进去容器exit退出容器停止
ctrlpq run进去容器ctrlpq退出容器不停止6.启动已停止运行的容器
#启动已停止运行的容器
docker satrt 容器ID或者名字7.重启容器
#重启容器
docker resatrt 容器ID或者名字8.停止容器
#停止容器
docker stop 容器ID或者名字9.强制停止容器
#强制停止容器
docker kill 容器ID或者名字10.删除已停止的容器
#删除已停止的容器
docker rm 容器ID
docker rm -f 容器ID
#一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm下载一个Redis6.0.8镜像演示
1.启动守护式容器后台服务器
docker pull redis:6.0.8
#启动守护式容器后台服务器
-d : 表示服务后台运行模式
docker run -d 容器名2.前台交互式启动【不建议】
#前台交互式启动【不建议】
docker run -it redis:6.0.8
#启动后台守护式启动后台运行
docker run -d redis:6.0.83.查看容器日志
#查看容器日志
docker logs 容器ID4.查看容器内运行的进程
#查看容器内运行的进程
docker top 容器ID5.查看容器内部细节
#查看容器内部细节
docker inspect 容器ID6.进入正在运行的容器并以命令交互
#进入正在运行的容器并以命令交互
docker exec -it 容器ID bashShell
或者重新进入【不建议】:
docker attach 容器ID
attach : 直接进入容器启动命令的终端不会启动新的进程用exit退出会导致容器的停止
exec : 是在容器中打开新的终端并且可以启动新的进程用exit退出不会导致容器的停止
推荐大家使用docker exec命令因为退出容器终端不会导致容器的停止[root192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e58709da98ef redis docker-entrypoint.s… 14 minutes ago Up 14 minutes 6379/tcp vigilant_williams
[root192 soft]# docker exec -it e58709da98ef /bin/bash
roote58709da98ef:/data#
roote58709da98ef:/data# redis-cli -p 6379
127.0.0.1:6379 set k1 v1
OK
127.0.0.1:6379 get k1
v1
127.0.0.1:6379 exit
roote58709da98ef:/data# exit
exit
[root192 soft]# 7.从容器内拷贝文件到主机上
#从容器内拷贝文件到主机上
容器-主机
docker cp 容器ID:容器内路径 目的主机路径[root192 soft]# docker run -it ubuntu /bin/bash
root38933ab36249:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root38933ab36249:/# pwd
/
root38933ab36249:/# cd /tmp
root38933ab36249:/tmp# touch a2024.txt
root38933ab36249:/tmp# ll
total 0
drwxrwxrwt. 1 root root 23 Jan 7 10:11 ./
drwxr-xr-x. 1 root root 17 Jan 7 10:08 ../
-rw-r--r--. 1 root root 0 Jan 7 10:11 a2024.txt
root38933ab36249:/tmp#
[root192 soft]#
[root192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38933ab36249 ubuntu /bin/bash 3 minutes ago Up 3 minutes boring_brahmagupta
e58709da98ef redis docker-entrypoint.s… 27 minutes ago Up 27 minutes 6379/tcp vigilant_williams
[root192 soft]# docker cp 38933ab36249:/tmp/a2014.txt /app/soft
Error response from daemon: Could not find the file /tmp/a2014.txt in container 38933ab36249
[root192 soft]# docker cp 38933ab36249:/tmp/a2024.txt /app/soft
Successfully copied 1.54kB to /app/soft
[root192 soft]#
[root192 soft]# ll
总用量 2761172
-rw-r--r--. 1 root root 0 1月 7 18:11 a2024.txt[root192 soft]# docker exec -it 38933ab36249 /bin/bash
root38933ab36249:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root38933ab36249:/# exit
exit
[root192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38933ab36249 ubuntu /bin/bash 6 minutes ago Up 6 minutes boring_brahmagupta
e58709da98ef redis docker-entrypoint.s… 31 minutes ago Up 31 minutes 6379/tcp vigilant_williams
[root192 soft]# 8.导入和导出容器
#导入和导出容器
export 导出容器的内容留作为一个tar归档文件[对应import命令]
docker export 容器ID 文件名.tarimport 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号cat ubuntu-001.tar | docker import - user/ubuntu:001[root192 soft]# docker rm -f 38933ab36249
38933ab36249
[root192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e58709da98ef redis docker-entrypoint.s… 39 minutes ago Up 39 minutes 6379/tcp vigilant_williams
[root192 soft]#
[root192 soft]# cat ubuntu-001.tar | docker import - user/ubuntu:001
sha256:d7ff238c9005c659f4c5819554181bf5c5e56e15c2ad36db66af1acb347423fe
[root192 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
user/ubuntu 001 d7ff238c9005 15 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
[root192 soft]# docker run -it d7ff238c9005 /bin/bash
root493bd15c2a4c:/# cd /tmp
root493bd15c2a4c:/tmp# ll
total 0
drwxrwxrwt. 2 root root 23 Jan 7 10:11 ./
drwxr-xr-x. 1 root root 18 Jan 7 10:26 ../
-rw-r--r--. 1 root root 0 Jan 7 10:11 a2024.txt
root493bd15c2a4c:/tmp#
[root192 soft]# 常用命令小结
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 #提交当前容器为新的镜像
Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container #创建一个新的容器同run但不启动容器
diff Inspect changes on a containers 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包中的内容创建一个新的文件系统映像[对应expor]
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 #截取容器停止时的退出状态值4.Docker镜像 镜像是一种轻量级、可执行的独立软件包它包含运行某个软件所需的所有内容我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等)这个打包好的运行环境就是image镜像文件。 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。 分层的镜像 以我们的pu为例在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载 UnionFS联合文件系统 UnionFS联合文件系统)Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统它支持对文件系统的修改作为一次提交来一层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承基于基础镜像没有父镜像可以制作各种具体的应用镜像。 特性:一次同时加载多个文件系统但从外面看起来只能看到一个文件系统联合加载会把各层文件系统叠加起来这样最终的文件系统会包含所有底层的文件和目录 Docker镜像加载原理 docker的镜像实际上由一层一层的文件系统组成这种层级的文件系统UnionFS。 bootfs(boot fle system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的LinuxUnix系统是一样的包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了此时内存的使用权已由bootfs转交给内核此时系统也会卸载bootfs。 rootfs (root fle system)在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, bin, letc等标准目录和文件。roots就是各种不同的操作系统发行版比如UbuntuCentos等等。 平时我们安装进虚拟机的CentOS都是好几个G为什么docker这里才200M? 对于一个精简的OSrootfs可以很小只需要包括最基本的命令、工具和程序库就可以了因为底层直接用Host的kernel自己只需要提供rootfs就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。 为什么Docker镜像采用这种分层结构呢 镜像分层最大的一个好处就是共享资源方便复制迁移就是为了复用。 比如说有多个镜像都从相同的 base镜像构建而来那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载一份base镜像就可以为所有容器服务了。而且镜像的每一层都可以被共享。 重点理解 Docker镜像层都是只读的容器层是可写的 当容器启动时一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”“容器层之下的都叫“镜像层”。 当容器启动时一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”“容器层”之下的都叫“镜像层”。 所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的容器层下面的所有镜像层都是只读的。 docker镜像commit操作案例–演示ubuntu安装vim
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m提交的描述信息 -a作者 容器ID要创建的目标镜像名:[标签名]从Hub上下载ubuntu镜像到本地并成功运行
docker pull ubuntu原始的默认ubuntu镜像是不带着vim命令的
[root192 soft]# docker run -it ubuntu /bin/bash
root7878b5ae864f:/#
root7878b5ae864f:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root7878b5ae864f:/# vim a.txt
bash: vim: command not found外网连通的情况下安装vim
#先更新我们的包管理工具
apt-get update
# 然后安装我们需要的vim
apt-get install vimroot7878b5ae864f:/# cd /tmp
root7878b5ae864f:/tmp# vim a.txt
root7878b5ae864f:/tmp# cat a.txt
this is a docker安装完成后commit我们自己的新镜像 docker commit -mvim cmd add ok -alb 139727b83d29 itcast/myubuntu:1.1 -a: 指定镜像作者 -m: 自定义的提交描述信息 -139727b83d29: 容器名字这里也可以用容器ID代替 -itcast/myubuntu:1.1: 指定要创建目标镜像的自定义名字这里为itcast/myubuntu和自定义版本1.1
[root192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
139727b83d29 ubuntu /bin/bash 3 minutes ago Up 3 minutes flamboyant_hellman
[root192 soft]# docker commit -mvim cmd add ok -aldy 139727b83d29 itcast/myubuntu:1.1
sha256:1fd9ce6dfd6992d8c7033dccb9d2898e4dc2b99f1babf631db620474e11e2336
[root192 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
itcast/myubuntu 1.1 1fd9ce6dfd69 58 seconds ago 189MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB启动我们的新镜像并和原来的对比 原来72.8MB 现在189MB 总结
Docker中的镜像分层支持通过扩展现有镜像创建新的镜像。类似Java继承于一个Base基础类自己再按需扩展。新镜像是从base镜像一层一层叠加生成的。每安装一个软件就在现有镜像的基础上增加一层。
5.本地镜像发布到阿里云
本地镜像发布到阿里云流程 镜像的生成方法
基于当前容器创建一个新的镜像新功能增强
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]commit我们自己的新镜像 docker commit -mvim cmd add ok -alb 139727b83d29 -a: 提交的镜像作者 -m: 提交的说明文字
将本地镜像推送到阿里云 阿里云开发者平台https://promotion.aliyun.com/ntms/act/kubernetes.html
创建仓库镜像:选择控制台进入容器镜像服务选择个人实例命名空间仓库名称进入管理界面获得脚本 将阿里云的镜像下载本地 6.CentOS7安装DockerCompose
6.1.下载
Linux下需要通过命令下载
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m /usr/local/bin/docker-compose如果下载速度较慢或者下载失败可以使用课前资料提供的docker-compose文件 上传到/usr/local/bin/目录也可以。
6.2.修改文件权限
修改文件权限
# 修改权限
chmod x /usr/local/bin/docker-compose6.3.Base自动补全命令
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose /etc/bash_completion.d/docker-compose如果这里出现错误需要修改自己的hosts文件
echo 199.232.68.133 raw.githubusercontent.com /etc/hosts7.本地镜像发布到私有库–Docker Registry
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址https://hub.docker.com/_/registry
1.下载镜像–创建registry容器并开放端口
docker pull registry运行私有库Registry相当于本地有个私有Docker hub Docker官方的Docker Registry是一个基础版本的Docker镜像仓库具备仓库管理的完整功能但是没有图形化界面。 搭建方式比较简单命令如下 docker run -d \--restartalways \--name registry \-p 5000:5000 \-v registry-data:/var/lib/registry \--privilegedtrue \registry# -p指定端口一内一外
# -v表示挂载前者是宿主机后者是容器
# Docker挂载主机目录访问如果出现cannot open directory .: Permission denied解决办法:在挂载目录后多加一个--privilegedtrue参数即可如果是CentOS7安全模块会比之前系统版本加强不安全的会先禁止所以目录挂载的情况被默认为不安全的行为 在SELinux里面挂载目录被禁止掉了额如果要开启我们一般使用–prvilegedtrue命令扩大容器的权限解决挂载目录没有权限的 问题也即使用该参数container内的root拥有真正的root权限否则container内的root只是外部的一个普通用户权限。 命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
2.案例演示创建一个新镜像ubuntu安装ifconfig命令 [root192 soft]# docker run -it ubuntu /bin/bash
roote65d61ff09d8:/# ifconfigroote65d61ff09d8:/# apt-get -y install net-toolsroote65d61ff09d8:/# ifconfig[root192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e65d61ff09d8 ubuntu /bin/bash 3 minutes ago Up 3 minutes objective_leakey
daafa6a212e1 registry /entrypoint.sh /etc… 7 minutes ago Up 7 minutes 0.0.0.0:5000-5000/tcp, :::5000-5000/tcp registry
98d2c389f54a 1fd9ce6dfd69 /bin/bash 26 minutes ago Up 26 minutes objective_meninsky
[root192 soft]#
[root192 soft]# docker commit -mifconfig cmd add -aldy e65d61ff09d8 ubuntu:1.2
sha256:811d655579989129269df684b6f4f1fcda542f69988de2005e19a9b610bfd050
[root192 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 1.2 811d65557998 5 seconds ago 122MB
registry.cn-hangzhou.aliyuncs.com/dockerk8speed/myubuntu1.1 1.1 1fd9ce6dfd69 2 hours ago 189MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
3.curl验证私服库上有什么镜像
指令格式如下所示
curl -XGET http://主机映射的网络地址:主机映射网络端口/v2/_catalog防踩坑如果记得自己映射的主机Registy网络地址就可以直接输入如果不记得可以使用docker ps -a查看私服库Registry的网络映射信息映射网络地址和映射端口。 [root192 soft]# curl -XGET http://192.168.229.129:5000/v2/_catalog
{repositories:[]}
[root192 registry-ui]# curl -XGET http://192.168.229.129:8080/v2/_catalog
{repositories:[nginx]}可以看到目前私服库http://192.168.229.129:5000/v2/_catalog没有任何镜像上传过。。。。。。。【空的】 如下图所示我的本地私有库Registry的网络地址为0.0.0.0映射端口为5000。
4.将新镜像ubuntu修改符合私服规范的Tag
推送镜像到私有镜像服务必须先tag步骤如下:
重新tag本地镜像名称前缀为私有仓库的地址:192.168.229.129:5000docker tag nginx:latest 192.168.229.129:5000/nginx:1.0
使用命令docker tag 将 tag nginx:latest 这个镜像修改为 192.168.229.129:5000/nginx:1.0 #自己host主机ip地址
按照公式docker tag 镜像ID或镜像名:Tag Host:Port/Repository:Tag上面代码的参数含义如下所示
1镜像ID或镜像名要上传到私有库Registry的镜像ID或名字 2Tag要上传的镜像版本号 3Host本地私有库的映射网址本文为0.0.0.0 4Post本地私有库的映射端口本文为5000 5Repository:Tag上传到私有库Registry后自定义的镜像名字、版本号。
[root192 soft]# docker tag ubuntu:1.2 192.168.229.129:5000/ubuntu:1.2
[root192 soft]#
[root192 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.229.129:5000/ubuntu 1.2 811d65557998 7 minutes ago 122MB
ubuntu 1.2 811d65557998 7 minutes ago 122MB
registry.cn-hangzhou.aliyuncs.com/dockerk8speed/myubuntu1.1 1.1 1fd9ce6dfd69 2 hours ago 189MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
[root192 soft]# 5.修改配置文件使之支持http-配置Docker信任地址
安装的docker只支持阿里云镜像加速网址的http连接为了实现镜像上传到私有库Registry我们还要配置支持本地安装私有库Registry的http连接 我们的私服采用的是http协议默认不被Docker信任所以需要做一个配置
# 打开要修改的文件
vi /etc/docker/daemon.json
# registry-mirrors配置的是国内阿里提供的镜像加速地址不用加速的话访问官网的会很慢。
# vim命令添加内容http://192.168.229.129:8080为自己设置的私服库地址
insecure-registries:[http://192.168.229.129:8080]
#上述理由: docker默认不允许http方式推送镜像通过配置选项来取消这个限制。修改完后如果不生效.建议重启docker
# 重新加载
systemctl daemon-reload
# 重启docker
systemctl restart docker6.带有图形化界面版本–更改私有库
使用DockerCompose部署带有图象界面的DockerRegistry命令如下
version: 3.0
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE个人私有仓库- REGISTRY_URLhttp://registry:5000depends_on:- registry[root192 soft]# mkdir registry-ui
[root192 soft]# cd registry-ui/
[root192 registry-ui]# ll
总用量 0
[root192 registry-ui]# touch docker-compose.yml
[root192 registry-ui]# vim docker-compose.yml
[root192 registry-ui]#
[root192 registry-ui]# cat docker-compose.yml
version: 3.0
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE个人私有仓库- REGISTRY_URLhttp://registry:5000depends_on:- registry
[root192 registry-ui]# ll
总用量 4
-rw-r--r--. 1 root root 322 1月 8 07:27 docker-compose.yml
[root192 registry-ui]# docker-compose up -d
Creating network registry-ui_default with the default driver
Pulling ui (joxit/docker-registry-ui:static)...
static: Pulling from joxit/docker-registry-ui
540db60ca938: Pull complete
197dc8475a23: Pull complete
39ea657007e5: Pull complete
37afbf7d4c3d: Pull complete
0c01f42c3df7: Pull complete
d590d87c9181: Pull complete
3333c94ae44f: Pull complete
33d7cca6fc9f: Pull complete
076b2dd9bdd1: Pull complete
b70198f04ee7: Pull complete
1fb6c5acc953: Pull complete
Digest: sha256:b0657b6be748173583516e411bd71552e54cb7d5dda94964726297ce8774415c
Status: Downloaded newer image for joxit/docker-registry-ui:static
Creating registry-ui_registry_1 ... done
Creating registry-ui_ui_1 ... done
[root192 registry-ui]#
[root192 registry-ui]#
[root192 registry-ui]# docker-compose logs -f
Attaching to registry-ui_ui_1, registry-ui_registry_1
ui_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
ui_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
ui_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
ui_1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
ui_1 | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
ui_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
ui_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
ui_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/90-docker-registry-ui.sh
ui_1 | /docker-entrypoint.sh: Configuration complete; ready for start up
registry_1 | time2024-01-07T23:31:22.196329571Z levelwarning msgNo HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable. go.versiongo1.11.2 instance.id513135ab-7e70-40dc-8e08-70a6164afe97 serviceregistry versionv2.7.1
registry_1 | time2024-01-07T23:31:22.196463852Z levelinfo msgredis not configured go.versiongo1.11.2 instance.id513135ab-7e70-40dc-8e08-70a6164afe97 serviceregistry versionv2.7.1
registry_1 | time2024-01-07T23:31:22.200039301Z levelinfo msgStarting upload purge in 12m0s go.versiongo1.11.2 instance.id513135ab-7e70-40dc-8e08-70a6164afe97 serviceregistry versionv2.7.1
registry_1 | time2024-01-07T23:31:22.203727763Z levelinfo msgusing inmemory blob descriptor cache go.versiongo1.11.2 instance.id513135ab-7e70-40dc-8e08-70a6164afe97 serviceregistry versionv2.7.1
registry_1 | time2024-01-07T23:31:22.20447663Z levelinfo msglistening on [::]:5000 go.versiongo1.11.2 instance.id513135ab-7e70-40dc-8e08-70a6164afe97 serviceregistry versionv2.7.1 7.push推送到私服库
命令格式为
docker push 符合私服规范的Tag的镜像名称或ID:版本号docker tag nginx:1.0 192.168.229.129:8080/nginx:1.0
docker push 192.168.229.129:8080/nginx:1.0
docker tag ubuntu:1.2 192.168.229.129:8080/ubuntu:1.2
docker push 192.168.229.129:8080/ubuntu:1.28.curl验证私服库上有什么镜像
上传私服库完成在终端输入命令curl -XGET http://192.168.229.129:8080/v2/_catalog查看私服库上是否有推送的镜像
[root192 soft]# curl -XGET http://192.168.229.129:8080/v2/_catalog
{repositories:[nginx,ubuntu]}9.pull到本地并运行
使用docker pull命令从私有库拉取镜像到docker中
docker pull Registry的网络映射:Registry的端口映射/私有库中的镜像名字:版本号docker pull 192.168.229.129:8080/nginx:1.0 防踩坑上面的curl指令只显示了私服库上的镜像名字如为了获得版本号需要如下指令需要注意的ubuntu-advanced是要拉取的镜像名字
curl -XGET http://192.168.229.129:8080/v2/nginx/tags/list8.Docker容器数据卷 将docker容器内的数据保存进宿主机的磁盘中 1.运行一个带有容器卷存储功能的实例
docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录 镜像名将运用与运行的环境打包镜像run后形成容器实例运行但是我们对数据的要求希望是持久化的
Docker容器产生的数据如果不备份那么当容器实例删除后容器内的数据自然也就没有了。 为了能保存数据在docker中我们使用卷。
特点
数据卷可在容器之间共享或重用数据卷中的更改可以直接实时生效爽数据卷中的更改不会包含在镜像的更新中数据卷的生命周期一直持续到没有容器使用它为止
2.宿主vs容器之间映射添加容器卷
绑定映射目录
#读写默认
docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录 镜像名docker run -it --name myubt --privilegedtrue -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash查看数据卷是否挂载成功
docker inspect 容器ID容器和宿主机之间数据共享 1 docker修改主机同步获得 2 主机修改docker同步获得 3 docker容器stop主机修改docker容器重启看数据成功同步。 3.容器数据卷读写规则映射添加说明
# 可读可写
docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录:rw 镜像名# 容器实例内部被限制只能读取不能写
docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录:ro 镜像名ro read only 此时如果宿主机写入内容可以同步给容器内容器可以读取到。
4.卷的继承和共享
容器1完成和宿主机的映射
docker run -it --privilegedtrue -v /tmp/myHostData:/tmp/myDockerData --name u1 ubuntu /bin/bash容器2继承容器1的卷规则 docker run -it --privilegedtrue --volumes-from 父类 --name u2 ubuntudocker run -it --privilegedtrue --volumes-from u1 --name u2 ubuntu9.Docker常规安装简介
1.总体步骤 搜索镜像 拉取镜像 查看镜像 启动镜像 - 服务端口映射 停止容器 移除容器 2.安装Tomcat【新版本webapps已改为webapps.dist】
https://hub.docker.com/
1.docker hub上面查找tomcat镜像 2.从docker hub上拉取tomcat镜像到本地 3.docker images查看是否有拉取到的tomcat 4.使用tomcat镜像创建容器实例(也叫运行镜像)
docker run -it -p 8080:8080 tomcat-p :小写主机端口:docker容器端口
-P :大写随机分配端口
-i :交互
-t :终端
-d :后台5.访问猫首页 可能没有映射端口或者没有关闭防火墙 把webapps.dist目录转成webapps 6.免修改版说明
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk83.安装mysql:5.7
简单版
1.查询拉取mysql镜像
docker search mysql# 不加版本号5.7默认拉取的是最新版
docker pull mysql:5.7docker images mysql:5.72.使用mysql镜像
docker run -p 3306:3306 --name mq -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7docker psdocker exec -it 容器ID /bin/bashmysql -u root -p3.建库建表插入数据 4.外部win10连接运行在docker上的Mysql容器实例服务 5.中文字符集问题
show variables like character%;mysql show variables like character%;
------------------------------------------------------
| Variable_name | Value |
------------------------------------------------------
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
------------------------------------------------------
8 rows in set (0.01 sec)
实战版本
1.新建mysql容器实例
docker run \
--name mysql \
--privilegedtrue \
-e MYSQL_ROOT_PASSWORD123456 \
-p 3306:3306 \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-d \
mysql:5.7--name : 起名字
--privilegetrue : 容器数据卷权限开启
-p : 端口映射
-d : 后台运行或者
docker run \
--name mysql \
--privilegedtrue \
-e MYSQL_ROOT_PASSWORD123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25编写hmy.cnf
[mysqld]
skip-name-resolve
character_set_serverutf8
datadir/var/lib/mysql
server-id10002.新建my.cnf–通过容器卷同步给mysql容器实例
[client]
default_character_setutf8
[mysqld]
collation_server utf8_general_ci
character_set_server utf83.重新启动mysql容器实例再重新进入并查看字符编码 4.再新建库新建表再插入中文测试
show databases;create database db01;
use db01;
create table t1(id int,name varchar(20));
insert into t1 values(1,zs),(2,lisi),(3,王五);select * from t1;show variables like character%;drop database db01;4.安装redis
1.下载redis镜像到本地标签为6.0.8
docker search redis --limit 5docker pull redisdocker images redis2.入门命令 3.命令提醒容器卷记得加入 --privilegedtrue
4.在Centos宿主机下新建目录/app/redis
mkdir -p /app/redis5.将一个redis.conf文件模板拷贝进/app/redis 开启redis验证
requirepass 123456允许redis外地连接必须注释掉 #bind 127.0.0.1 daemonize no 后台启动设置为no
将daemonize yes注释起来或者daemonize no设置因为该配置和docker run中-d参数冲突会导致容器一直启动失败开启redis数据持久化appendonly yes可选 6. /app/redis目录下修改redis.conf文件
默认出厂的原始redis.conf
7.使用redis6.0.8镜像创建容器(也叫运行镜像)
docker run \
--name mr \
--privilegedtrue \
-p 6379:6379 \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
-d redis:6.0.8 \
redis-server /etc/redis/redis.conf8.测试redis-cli连接上来 9.请证明docker启动使用了我们自己指定的配置文件 10.测试redis-cli连接上来第2次 5.安装Nginx
docker search nginx --limit 5docker pull nginxdocker run --name mn -p 80:80 -d nginx# docker run 启动一个镜像
# -d 表示后台允许
# --name mn 表示为当前容器起一个别名
# -p 80:80 表示将本机的80端口映射到nginx镜像的80端口进入Nginx容器当中
docker exec -it nginx /bin/bash
命令详解
# docker exec 在运行的容器中执行命令
# -i 以交互模式运行容器通常与 -t 同时使用例如-it
# -t 为容器重新分配一个伪输入终端通常与 -i 同时使用例如-it
# nginx 容器名
# /bin/bash 其实就是表示载入容器后运行bash命令语言解释程序, 因为docker中必须要保持一个进程运行的程序的运行要不然整个容器就会退出所以说bash就担任起了docker中运行的那个进程的角色
#而/bin/bash则是bash在linux下的位置endl