Docker入门

试想一下,如果有一天你换了一台新电脑,是不是新电脑里得重新安装很多很多东西?

docker可以做到,将你的以前的那个电脑的c盘d盘等等盘,压缩成一个压缩包,在新电脑上解压这个压缩包,这样新电脑就和以前的电脑,完全一样了,这个电脑上甚至垃圾箱,桌面,游戏什么的,都可以正常运行.


起源

Docker是世界领先的软件容器平台,想要搞懂Docker的概念我们须从容器开始说起

容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西是比如是系统环境,网站,程序之类

早在十多年前国内外的一些大厂就开始投入研发和使用容器技术,比如Google,对他们来说,使用容器能够充分利用计算资源节省硬件成本,而这几年,真正把容器技术发扬光大的是Docker。

Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化

Docker入门_第1张图片
她的slogan“Build,Ship & Run anywhere”定位非常清晰,Docker的出现打破了传统运维模式里从打包到部署的过程中环境、语言、平台不一致的乱象,将这一整套开发运维模式标准化了,从而真正帮助企业实践了DevOps和微服务化。

但是,国内的大型企业面临技术转型的的时候,历史包袱太沉重,对Docker的接受和部署非常缓慢。同样地,多数的中小型企业也并未把Docker作为生产环境上部署和管理服务的标配,而选择继续使用传统的运维方案。

造成这种现象的原因是什么呢?可能原因之一是企业从业人员对Docker的学习认知并不够。之二是目前市面上Docker的容器编排系统很多,常见的就有K8s、Mesos、Swarm、Rancher、Newben,编排系统的学习和认知成本也进一步提升了企业应用Docker的难度

本文作者同大家一起开始步入docker的镜像世界,一步一步,深入docker,从入门到精通,从使用到理解掌握


0. 为什么选择Docker

既然都是为了解决软件和环境的依赖问题,难道就docker这一个选择吗

通常我会使用百度指数,在涉足一个新的领域的时候帮助我了解这个领域哪些将会是趋势,哪些只是残留

0.1 vmware

通常我们会将docker和vmware进行对比

Docker入门_第2张图片

VMWare VS docker - Google Trends

Docker入门_第3张图片

VMWare VS docker - 百度指数

从搜索趋势图中可以看出来vmware是曾经的巨头,一直盘踞着一片江山,不过docker的增长趋势告诉我们, 时代要变了


1. 各操作系统安装

1.1 Mac

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 镜像源横评

1.2 RedHat

注意: 目前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

1.3 Ubuntu

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
重启后所有此系统上没有开机自启功能的服务都需要手动再启动,否则这些服务都处于关闭状态.
注意: 重启系统之前确认通知到别的正在使用这台机器的开发小伙伴!
注意: 重启系统之前确认通知到别的正在使用这台机器的开发小伙伴!
注意: 重启系统之前确认通知到别的正在使用这台机器的开发小伙伴!

1.4 Win10(企业版或专业版)

Docker基本安装

  1. 打开百度,搜索“docker download",单击如图中的链接,跳转到docker官方网站,点击“Download for Windows”,或者直接访问https://www.docker.com/products/docker-desktop

  1. 点击中下方的“Download Desktop For Mac And Windows",必须登录才能下载,跳转登录页,如果没有账号则注册后再登录,登录后,点“Download Desktop For ......."链接

  1. 弹出下载文件窗口,选择位置进行保存文件,等下载完成,双击运行“Docker for Windows Installer.exe”,开始安装

Docker中配置国内镜像


2. docker基本组成

2.1 组成图

Docker入门_第4张图片

docker结构

2.2 各结构说明

  • 镜像(image):

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run==>tomcato1容器(提供服务器),

通过这个镜像可以创建多个容器(最终服务运行或者项自运行就是在容器中的)。

  • 容器(container):

Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。

启动,停止,删除,基本命令!

目前就可以把这个容器理解为就是一个简易的linux系统

  • 仓库(repository):

仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!

DockerHub(默认是国外的)

3. 快速入门案例

3.1 构建基本环境

安装成功之后,打开终端

确定你想要的操作系统,如果是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

3.2 保存自己的环境

然后我们新建一个文件夹


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库

3.3 将自己的环境提交到远程

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入门_第5张图片

也就是现在只要有一台机器安装了docker,就可以得到这个镜像('压缩包'),里面除了一个现成的os还有我们可能安装部署完的环境

3.4 同步远程库环境到本地

先尝试一下本地下载远程的我们提交的镜像

先删除掉本地的容器和镜像, 先删除容器,后删除镜像

因为镜像诞生容器,所以必须这个镜像的所有的生成的已有容器被删除光,这个镜像才能被删除,否则删除会报错提示,删除不了

先删除掉本地的容器 关闭容器- 删除容器


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的入门使用

4. docker常用命令

1 基础命令


docker version #查看docker的版本信息
docker info #查看docker的系统信息
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help

2 镜像命令

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

3 容器命令

运行容器的命令说明:


docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口(-p ip:主机端口:容器端口 配置主机端口映射到容器端口-p 主机端口:容器端口-p 容器端口)
-p 3306:3306
-P 随机指定端口(大写的P)

run命令运行流程图

Docker入门_第6张图片

运行并进入容器


[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 #强制停止当前容器(了解)

4 其他常用命令

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

5. image镜像详解

1 什么是镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。

2 Docker镜像加载原理

Docker的镜像实际上由一层一层的文件系统组成,这种层级文件系统名字叫UnionFS联合文件系统

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(uniteseveraldirectories intoasinglevirtualfilesystem)。

Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

3 分层理解

我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!

Docker入门_第7张图片

思考:为什么Docker镜像要采用这种分层的结构呢?

最大的好处,莫过于是资源共享了!比如有多个镜像都从相同的基础镜像构建而来,那么宿主机只需在磁盘上保留一份基础镜像

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

查看镜像分层的方式可以通过docker image inspect mysql:5.7命令!

Docker入门_第8张图片

分层信息查看

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层

举一个简单的例子,假如基于UbuntuLinux18.04创建一个新的镜像,这就是新镜像的第一层;

如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;

如果继续添加一个安全补丁,就会创建第三个镜像层。

该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。

Docker入门_第9张图片

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像

层包含3个文件,而镜像包含了来自两个镜像层的6个文件。

Docker入门_第10张图片

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。

Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。Linux上可用的存储引擎有AUFS、Overlay2、DeviceMapper、Btrfs以及ZFS。

顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。

Docker在Windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW。

下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

Docker入门_第11张图片

6. docker中的网络

端口

Docker入门_第12张图片

docker run命令有一个参数  设置网络模式, --network host  将当前创建的这个容器的网络和宿主机的网络并成一个网络环境, 也就是说, 此时宿主机的ip就是当前这个容器的ip, 他们是同一个人了

注意: 是无法使用lsof -i:端口号命令 查看处于容器中的占用端口号的服务的

数据卷命令

-v 宿主机目录:容器目录

绝大多数官方软件的镜像 内部 是没有vim编辑器, 而且有可能连apt也没有

这个时候就需要使用-v数据卷映射 将容器内部的配置文件所在的目录 映射到宿主机中

7.特权模式

特权模式于版本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、挂载后就可以访问宿主机目录

8.安装docker-compose


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

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镜像中, 通过自定义的镜像创建的容器来启动应用

你可能感兴趣的:(docker,容器,运维)