提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、Docker是什么?
Docker是一种开源的容器化技术,它可以帮助开发人员在不同的操作系统和硬件平台上构建、打包、运输和部署应用程序。
要了解Docker是什么,从隐喻开始比使用技术解释更容易,而Docker本身是一个强大的隐喻:Docker的本意是码头工人。码头工人是这样的劳动者:当船只停靠在港口时,码头工人将商品移入和移出船只。箱子和物品的大小和形状各不相同,经验丰富的码头工人因其能够以经济有效的方式手工将货物装入船舶而受到重视。雇人搬东西并不便宜,但别无选择。
在有Docker之前,不同团队的码头工人被要求装载不同形状的物体到船上去:
有Docker之后:
- 船被设计为可以更有效的携带,装载和卸载预设形状的物品
- 不同的物品放在同样一个简单的容器中。载体不关心容器里面是什么
- 载体可以装载到其他地方,减少了港口装载的瓶颈
- 仅需一个码头工人来操作设计用来移动容器的机器
对于工作在软件方面的人来说,这应该是熟悉的。花费了大量时间和智力,将隐喻奇怪形状的软件变成了不同大小的异形船,其中包含其他形状奇特的软件,因此它们可以出售给其他地方的用户或企业
二、Docker的历史
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
docker为什么会火:主要是十分轻巧
在容器出现之前,主要使用的虚拟机技术:
虚拟机:在windows中装一个vmware,通过这个软件我们可以虚拟出来一台或者多台电脑,比较笨重。
虚拟机也属于虚拟化技术,Docker容器技术,也是一种虚拟化技术。
三、Docker的组成
Docker基于go语言开发!开源项目
要安装Docker首先了解Docker的基本组成:

Docker由以下几个主要组件组成:
-
Docker引擎(Client):Docker引擎是Docker的核心组件,它负责管理容器生命周期并提供Docker API用于与Docker守护进程交互。Docker引擎包括Docker守护进程和Docker客户端,可以在Linux、Windows和MacOS上运行。
-
Docker镜像(image):Docker镜像是一个只读的模板,包含了应用程序的代码、库、依赖项以及其他运行所需的文件。Docker镜像可以使用Dockerfile文件创建。
-
Docker容器(containers):Docker容器是Docker镜像的可运行实例。Docker容器是在Docker引擎中创建和管理的,它包括了应用程序的代码和运行时环境,以及Docker镜像中定义的设置和配置。
-
Docker仓库(repository):Docker仓库是一个中央的存储库,用于存储和分享Docker镜像。Docker Hub是最常用的公共Docker仓库,您还可以使用私有Docker仓库来存储自己的Docker镜像。
除此之外,Docker还有很多辅助工具和扩展组件,例如Docker Compose、Docker Swarm等用于管理多个容器的工具。
四、Docker的工作历程
下面就不讲太多枯燥的概念了,我们只要知道什么是Docker,为什么要学Docker,Docker的基本组成就行。我个人的理解就是在不学Docker的基础上,我们需要在虚拟机上安装许多软件,如tomcat,mysql,消息中间件等。这时我们需要一个一个的安装,而且有些软件的安装需要许多繁琐的配置,软件安装会非常的耗虚拟机的内存。如果我们在克隆一个虚拟机是不是又要重复当前的操作。然后我们又去翻资料找命令安装这些软件,想想就头大。
所以Docker就流行起来了。我简单概述一些它的基本工作流程:
Docker首先是一种容器化技术,它也是一种虚拟化技术,就相当于我们用虚拟机虚拟出一个Linux系统。就是将所有的软件装在一个容器中,然后我们从容器中取来用就行了,是不是方便多了。

这个图是不是看起来非常复杂,我也觉得复杂,其实里面已经包含了大部分Docker的一些基本命令。学了下面的内容我们基本上能看懂这个图了。
Docker的安装
安装Docker
#第一步卸载旧的版本
yum remove docker docker-common docker-selinux docker-engine
#安装工具包和依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#配置docker仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐使用阿里云镜像
#更新软件包索引
yum makecache faster
#安装最新版的docker引擎
yum -y install docker-ce docker-ce-cli containerd.io
#启动docker
systemctl start docker
#设置开机自动启动
systemctl enable docker
#测试
docker run hello-world
#查看一些下载的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 months ago 13.3kB
卸载Docker
真的要卸载尝试吧,毕竟安装命令有点多…
#卸载依赖,删除目录
sudo yum remove docker-ce
#删除资源
sudo rm -rf /var/lib/docker
#docker默认工作路径
sudo rm -rf /var/lib/docker
阿里云镜像加速
这是为了能更快的安装镜像,你也不想等半天吧。
1.登录阿里云找到容器镜像服务

2.找到镜像加速地址

3.配置使用
每个人的镜像加速器都不一样

hello-world镜像的运行原理

Docker为什么比VM快
1.Docker有着比虚拟机更少的抽象层。

2. Docker利用的是宿主机的内核
所以新建一个新的容器时候,docker不需要像虚拟机一样重新加载一个操作系统内核,虚拟机的加载Guest OS,分钟级别,而docker利用宿主机的操作系统。省略了这个复杂的过程

五、Docker中常用的命令
帮助命令
docker version #显示docker的版本
docker info
docker 命令 --help #万能命令
镜像命令
[root@localhost /]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的时间
SIZE 镜像的大小
#可选项
-a, --all #列出所有的镜像
-q, --quiet #只显示镜像id
docker search 搜索镜像
[root@localhost /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13234 [OK]
mariadb MariaDB Server is a high performing open sou… 5062 [OK]
#可选项,通过收藏来过滤
-f, --filter=STARS=3000 搜索出来的镜像就是STARS大于3000的
docker pull 下载镜像
#下载镜像docker pull 镜像名 [:tag]
[root@localhost /]# docker pull mysql
Using default tag: latest #如果不写版本 默认latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载,docker images核心,联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #docker.io真实地址
#等价
docker pull mysql == docker pull docker.io/library/mysql:latest
#指定版本下载
[root@localhost /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
docker rmi -f 镜像id #删除指定的镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id #删除多个镜像
docker rmi -f $(docker images -aq) #删除全部镜像
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
新建容器并启动
docker run[可选参数] images
#参数说明
--name="Name" 容器名字 tomcat01 tomcat02用来区分容器
-d 后台运行方式
-it 使用交互方式,进入容器
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口映射到容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
#测试
[root@ecs-300055 /]# docker run -it centos /bin/bash #启动并进入容器
[root@4029218a7e38 /]# ls #查看容器内的centos,基础版本,很多命令都是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@4029218a7e38 /]# exit #退出容器
exit
[root@ecs-300055 /]# ls #查看服务器
bin CloudResetPwdUpdateAgent etc lib media patch run sys var
boot CloudrResetPwdAgent home lib64 mnt proc sbin tmp www
CloudResetPwdAgent dev
列出所有的运行的容器
docker ps
[root@ecs-300055 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-a #列出当前正在运行的容器,顺带历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
退出容器
exit #直接推出容器
ctrl+p+q #容器还在运行,退出容器的命令行
删除容器
docker rm #容器id不能删除运行的容器,如果强制删除是rm -rf
docker rm -f $(docker ps -aq) #删除全部容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
后台启动
docker run -d 镜像名!
[root@ecs-300055 /]# docker run -d centos
#问题docker ps 发现centos停止了
#常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
#nginx 容器启动,发现自己提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -f -t --tail #查看日志
docker logs -tf --tail 10 c4180c000d34 #显示10条日志条数
查看容器中进程信息ps
#命令
docker top 容器id
[root@ecs-300055 /]# docker top c4180c000d34
UID PID PPID C STIME TTY
root 104390 104371 0 13:54 ?
root 106863 104390 0 14:24 ?
查看镜像的元数据
#命令
docker inspect 容器id
进入当前正在运行的容器
#我们通常容器都是使用后台运行的,需要进入容器,修改一些配置
#命令
docker exec -it 容器id /bin/bash
#测试
[root@ecs-300055 /]# docker exec -it c4180c000d34 /bin/bash
[root@c4180c000d34 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@c4180c000d34 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 05:54 ? 00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;done
root 2440 0 0 06:35 pts/0 00:00:00 /bin/bash
root 2461 1 0 06:35 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 2462 2440 0 06:35 pts/0 00:00:00 ps -ef
#方法二
docker attach 容器id
#测试
[root@ecs-300055]~# docker attach c4180c000d34 #正在执行当前代码
#docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach #进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机
docker cp 容器id:容器内路径 目的的主机路径
#创建并运行容器
[root@ecs-300055]/home# docker run -it centos
[root@5dd3b22b9824 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@5dd3b22b9824 /]# cd home/
[root@5dd3b22b9824 home]# ls
#新建一个文件
[root@5dd3b22b9824 home]# touch jkdb.py
[root@5dd3b22b9824 home]# ls
jkdb.py
[root@5dd3b22b9824 home]# exit
exit
[root@ecs-300055]/home# ls
www
[root@ecs-300055]/home# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5dd3b22b9824 centos "/bin/bash" 33 seconds ago Exited (0) 4 seconds ago naughty_shockley
#将文件拷贝到主机上
[root@ecs-300055]/home# docker cp 5dd3b22b9824:/home/jkdb.py /home
[root@ecs-300055]/home# ls
jkdb.py www
#拷贝是个手动过程,未来我们使用-v卷的技术,可以实现
Docker常用命令
#info|version
docker info #显示docker的系统信息,包括镜像和容器的数量
docker version #显示docker的版本信息。
#帮助命令
docker 命令 --help #帮助命令
#镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search #搜索镜像
docker pull #下载镜像 docker image pull
docker rmi #删除镜像 docker image rm
#容器命令
docker run 镜像id #新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id #删除指定容器
#删除所有容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
#启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
#退出容器
exit #容器直接退出
ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作
#其他常用命令
docker run -d 镜像名 #后台启动命令
docker logs #查看日志
docker top 容器id #查看容器中进程信息ps
docker inspect 容器id #查看镜像的元数据
docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
docker attach # 进入容器正在执行的终端
docker cp 容器id:容器内路径 主机目的路径 #从容器内拷贝到主机上
六、Docker可视化界面
portainer
Docker图形化界面管理工具!提供一个后台面板供我们操作
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:外网:8088 http://ip:8088
七、Docker镜像加载原理

八、Commit镜像
如何提交一个属于自己的镜像
docker commit # 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名: [版本号]
示例:
# 1、启动一个默认的tomcat
docker run -it -p 8080:8080 tomcat02:1.0
#进入容器
docker exec -it 50b /bin/bash
# 2、发现这个默认的tomcat 是没有webapps应用,镜像的原因,官方的镜像默认 webapps 下面是没有文件的
docker commit -a="wkb" -m="add webapps app" 50b tomcat02:1.0
# 3、手动执行拷贝进去的基本文件
cp -r webapps.dist/* webapps
# 4、将我们操作过的容器通过commit提交为一个新的镜像!以后若需要就可以使用我们修改过的镜像
这样我们就可以主机号:8080访问tomcat页面了,记得关闭防火墙,不然可能不能访问
访问成功后就是以下这个界面了…

如果你想要保存当前的容器状态,就可以通过commit来提交,获得一个镜像;类似在虚拟机中创建一个快照!
总结
学完以上的内容,你也算是个Docker的入门者了,后面数据卷和DockerFile才是重头戏。
4264

被折叠的 条评论
为什么被折叠?



