Docker入门
Docker
1.什么是docker?
1.1 官方定义
官方介绍:https://www.docker.com/
1.2 docker的起源
2.为什么是Docker
1.docker可以将程序以及使用软件环境直接打包在一起,无论到哪个机器上都能保障环境的一致性。
2.对进程进行封装隔离,容器与容器之间互不影响,更高效的利用系统资源。
3.通过镜像可以轻松复制N个环境一致的容器
3.Docker与虚拟机的区别
Docker是不携带操作系统的,所以Docker的应用非常轻巧。另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存-->虚拟物理内存-->真正物理内存。
但是Docker是利用Docker Engine去调用宿主机的资源的,这时候的过程是虚拟内存-->真正物理内存
4.Docker的安装
目前docker支持各大主流的操作系统,Windows,MacOS,Linux,CentOS
官方安装教程:https://docs.docker.com/engine/install/centos/#installation-methods
4.1普通安装
- 卸载原始的docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装doker依赖
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 指定版本安装docker
# 查看可提供安装的docker版本
yum list docker-ce --showduplicates | sort -r
# 指定版本安装 命令格式 <VERSION_STRING> 指定版本号
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
- 安装最新版docker
# 不指定版本号即可
sudo yum install docker-ce docker-ce-cli containerd.io
4.2 使用便捷脚本安装
-
Docker在get.docker.com 和test.docker.com上提供了便利脚本,用于将Docker Engine-Community的边缘版本和测试版本快速且非交互地安装到开发环境中。脚本的源代码在 docker-install存储库中。 不建议在生产环境中使用这些脚本,并且在使用它们之前,您应该了解潜在的风险:
-
脚本需要运行root或具有sudo特权。因此,在运行脚本之前,应仔细检查和审核脚本。
这些脚本尝试检测Linux发行版和版本,并为您配置软件包管理系统。此外,脚本不允许您自定义任何安装参数。从Docker的角度或您自己组织的准则和标准的角度来看,这可能导致不支持的配置。
这些脚本将安装软件包管理器的所有依赖项和建议,而无需进行确认。根据主机的当前配置,这可能会安装大量软件包。
该脚本未提供用于指定要安装哪个版本的Docker的选项,而是安装了在“ edge”通道中发布的最新版本。
如果已经使用其他机制在主机上安装了Docker,请不要使用便捷脚本。
本示例使用get.docker.com上的脚本在Linux上安装最新版本的Docker Engine-Community。要安装最新的测试版本,请改用test.docker.com。在下面的每个命令,取代每次出现get用test。
警告:
在本地运行它们之前,请务必检查从Internet下载的脚本。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
5 docker的基础命令
5.1查看安装docker的信息
#查看docker引擎的安装版本
docker info
5.2docker运行相关命令
# 通过编辑脚本安装或者使用yum命令安装后的docker会在系统中生成一个service,使用系统命令systemctl启动
#启动docker
systemctl start docker
#重启docker
systemctl restart docker
#关闭docker
systemctl shop docker
#查看docker状态
systemctl status docker
5.3配置docker开机自启动
systemctl enable docker
5.4建立用户组[建议]
默认情况下docker命令会通过Unix socket与Docker引擎通讯。而只有root用户和docker组用户可以访问docker引擎的Unix socket。出于安全考虑,一般linux上不会直接使用root用户。因此更好的做法是将需要使用docker的用户加入到 docker 用户组。
# 建立docker用户组
sudo groupadd docker
# 将当前用户加入到docker组
sudo usermod -aG docker $USER
5.5检测docker是否安装正确
docker run hello-world
6.docker的核心概念
6.1 镜像[image]
定义:一个软件代表一个镜像,如mysql镜像,redis镜像,nginx镜像
特点:只读
6.2 容器[Container]
定义:基于某个镜像运行一次就是生成一个程序实例,一个程序实例称之为一个容器
特点:可读可写
6.3 仓库[Repository]
定义:用来存储docker中所有镜像的具体位置
远程仓库:docker官方维护的一个仓库,当需要一些仓库的时候,需要去远程仓库下载
本地仓库:下载一个远程镜像之后,会存放在本地仓库中,不用每次使用都下载
7 docker镜像相关命令
7.0 查询镜像详情
1.通过docker官网查看docker镜像详情,通过需要使用的软件名称进项搜索,如mysql,直接在dockerhub搜索mysql
带有 [OFFICIAL IMAGE]表示是docker官方提供的镜像
网站访问地址:https://hub.docker.com/
2.通过命令查看查询镜像
docker search [image-name]
通过docker命令搜索需要的镜像,只需要在命令后面加上要找的镜像名称即可
docker search redis
命令搜索镜像列表中的信息是有限的,查看不到镜像的版本号,如果需要确认版本号,还需要在搜索的时候,在镜像名称后面添加上版本号
docker search redis:4.1.10
命令搜索镜像
[root@localhost ~]docker search redis
[镜像名称] [镜像描述] [人气] [是否为官方] []
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source … 9177 [OK] bitnami/redis
Bitnami Redis Docker Image 174 [OK]
sameersbn/redis 83 [OK]
7.1 获取远程镜像
#docker pull [镜像名称:tag(版本号)] 如下
# 如果不指定tag(版本号)docker默认下载最新版本的镜像
[root@localhost ~] docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Downloading [==============================================> ] 25.26MB/27.11MB
f6c208f3f991: Download complete
88a9455a9165: Download complete
406c9b8427c6: Download complete
7c88599c0b25: Download complete
25b5c6debdaf: Download complete
43a5816f1617: Download complete
1831ac1245f4: Download complete
37677b8c1f79: Downloading [===> ] 7.35MB/108.4MB
27e4ac3b0f6e: Download complete
7227baa8c445: Waiting
7.2 查看本地镜像
[root@localhost ~] docker images
[镜像名称] [镜像版本] [镜像ID] [镜像创建时间] [镜像大小]
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 14 months ago 13.3kB
#查看本地镜像,指定镜像名称,会将该镜像名称下所有版本的镜像都罗列出来,相当于一个过滤
docker images [image-name]
#查看所有镜像[-a] 查看所有,docker images 默认效果就是加上[-a]参数
docker images -a
#不显示镜像的全部信息,只显示镜像的id
docker images -q
7.3 删除镜像
#删除镜像有两种方式,这两种方式都支持删除一个镜像或者删除多个镜像,在命令后面添加必要的参数,并且以空格隔开即可
# 1.通过镜像名和版本删除
docker image rm [image-name:tag]
# 2.通过镜像的ID删除
docker image rm [id]
# 如果需要删除的镜像在本地运行过,该镜像会生成对应的容器,这时候删除镜像,docker会报错,如果仍然想要删除镜像,可以使用强制删除命令
docker image rm -f [image-name:tag|id]
# 强制删除存在一定的风险,docker会在删除镜像的同时将镜像对应的容器也一并删除掉。
#示例
[root@localhost ~] docker image rm -f hello-world:latest
Untagged: hello-world:latest
Untagged: hello-world@sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
#删除镜像命令简写
#rm 表示删除 i 表示image镜像
docker rmi [image-name:tag|id]
# 强制删除
docker rmi -f [image-name:tag|id]
#查看镜像和删除镜像的命令组合使用
docker rmi -f $(docker images -q)
#$() -->命令先执行,将命令的返回结果作为外部命令的参数
#先将所有的镜像id查询到,然后强制删除
8 容器相关命令[Container]
8.1将打包好的tar镜像导入到本地docker仓库中
docker load -i [image-file-name]
8.2 运行容器-基本[以tomcat为例]
docker run tomcat:9.0.43-jdk8-corretto
# 启动容器时需要指定image的名字和版本,也可以通过image的id号来启动
通过docker run 指定image的方式可以启动镜像并且生成容器,但是docker容器是系统级别的进程隔离,这样启动的docker容器是不能被外界访问到的,容器内部启动的应用也不能被外界访问。
8.3 查看当前正在运行的容器
docker ps
[root@localhost ~]# docker ps
CONTAINER ID 301cac850968 [容器id]
IMAGE tomcat:9.0.43-jdk8-corretto [以哪个镜像启动]
COMMAND "catalina.sh run" [容器启动时内部执行的命令]
CREATED 23 seconds ago [创建完成时间]
STATUS UP 19 seconds [容器当前状态]
PORTS 8080/tcp [容器内应用端口]
NAMES gracious_bell [容器名称(启动时未指定,docker自动生成)]
#docker ps 是查看当前正在运行的容器,如果想要查看所有容器,可以使用
docker ps -a
#所有的容器包括已经停止的容器,通过docker run命令每次都会形成一个新的容器。
#查看当前正在运行的容器的id
docker ps -q
#查看所有的容器的id [-q:表示只查看id| -a表示所有]
docker ps -aq
docker ps -qa
8.3 运行容器-拓展
1:端口映射[-p 表示将端口映射 宿主机端口(:)容器端口,将宿主机端口与容器内部应用监听的端口映射]
docker run -p 8080:8080 tomcat:9.0.43-jdk8-corretto
# 通过访问宿主机的 ip:8080 就可以访问容器内的tomcat
# 端口映射可以有多个
docker run -p 8080:8080 -p 3306:3306 tomcat:9.0.43-jdk8-corretto
2:后台启动[-d:表示后台运行]
# 在启动容器时,直接使用run命令,docker容器的日志会直接打印在终端,如果断开连接或者终止操作,容器就会直接停止,所以docker提供了容器的后台启动方式.
[启动容器] [映射端口] [后台启动] [镜像名称|版本]
docker run -p 8080:8080 -d tomcat:8
3:指定容器名称[--name 跟容器名称]
#启动容器时,如果没有指定名称,docker会随机生成容器的名称,在启动容器的时候也可以自定义容器名称,需要保证容器名称是全局唯一的。
[启动容器] [映射端口] [后台启动] [指定容器名称] [镜像名称|版本]
docker run -p 8080:8080 -d --name tomcat-8 tomcat:8
4:容器的状态操作[启动|重启|停止]
#启动容器的前提,是docker run image生成过容器,并且容器停止了。
# 启动
docker start [container-name|container-id]
#重启
docker restart [container-name|container-id]
#停止
docker stop [container-name|container-id]
docker kill [container-name|container-id]
#docker run image 生成的容器在意外停止之后,是可以直接重启容器,不需要再次使用docker run image命令在生成新的容器
5:删除容器
#删除已经停止的容器
docker rm [container-name|container-id]
#删除正在运行的容器
docker rm -f [container-name|container-id]
#组合删除所有容器
docker rm -f ${docker ps -q|docker ps -aq}
6:查看容器内服务的日志
#[容器ID不用全部都写,写3到4位,能够与其他容器id区分,docker就可以找到相应的容器]
#[仅仅是将现有日志打印出来,不会实时监听日志]
docker logs [container-name|container-id]
#实时监听日志
docker logs -f [container-name|container-id]
#加入时间戳
docker logs -t [container-name|container-id]
#实时监听+加日志时间戳
docker logs -ft [container-name|container-id]
#查看容器内部日志的最后一段日志[指定行数]
docker logs --tail [行数] [container-name|container-id]
7:查看容器内的进程
docker top [container-name|container-id]
8:进入容器
docker exec -it [container-name|container-id] bash
#docker exec:[exec]表示与容器进行交互
#docker exec -it :[-it]表示进入容器
#docker exec -it [container-name|container-id] :指定进入的容器
#docker exec -it [container-name|container-id] bash:进入容器是以哪种方式[bash表示以命令模式]
9:宿主机与容器的文件传输
# 从容器复制文件到操作系统
docker cp [container-name|id]:/path/filename ./local/path
#从宿主机(操作系统)复制文件到容器当中
docker cp /local/file/name [container-name|id]:/path/filename
9 查看容器信息
# 查看容器信息
docker inspect [container-name|container-id]
10 运行容器-数据卷[volume]
作用:实现宿主机与容器之间的文件共享,将容器中的某个文件或者文件夹挂载到宿主机本地的文件或者文件夹,在宿主机中修改文件,容器内的文件也会被修改,并且在容器停止甚至被删除之后,挂载到宿主机的文件或者文件夹也不会丢失,在重新启动容器后,原来挂载到宿主机的文件不会丢失。
容器被删除之后,通过docker run重新生成容器的时候只需要将原本挂载到宿主机的文件,与新生成的文件建立数据卷[映射关系],容器就会将数据重新读取到。
应用场景:使用docker安装mysql将mysql的数据文件挂载到宿主机,这时候将容器停止并且删除,重新run生成一个全新的mysql容器,只需要将mysql容器中的数据库文件指向宿主机的数据库文件,就可以恢复原本的数据,虽然容器变化了,但数据仍然是原来的数据。
宿主机文件通过数据卷与容器内文件映射,两边的文件修改,都会影响到另一方的文件,两个文件的变化是实时的。
数据卷的使用:在启动一个容器的时候,或者说是创建一个容器的时候,就必须指定数据卷,指定容器内文件与宿主机文件的映射关系,可以指定多个。
数据卷的实现方式有两种
1:自定义数据卷的目录
# 创建容器的时候,使用[-v 宿主机文件地址:容器文件地址]建立文件映射 (宿主机路径必须为绝对路径)
docker run -d -p 80:80 -v /local/path:/container/path --name container-name image-name|image-id
#自定义数据卷目录的情况下,docker以宿主机目录为主,如果宿主机目录为空,那么对应的容器内目录的内容也会被清除。
2:自动数据卷目录
# 创建容器的时候,指定一个不存在的目录,作为容器挂载到宿主机的目录,docker自动创建宿主机目录
docker run 0d -p 80:80 -v new:/container/path -- name container-name image-name|image-id
#自动数据卷目录,docker自动创建宿主机目录,这种情况下,docker容器内部需要挂载的文件或者目录不为空,docker会将里面的内容拷贝到宿主机docker创建的文件或目录当中,不会清空内容
#自动创建的数据卷,在宿主机的/var/lib/docker/valume/new [new为创建时写的不存在的文件或目录名]
10.1 数据卷高级
1:数据卷作用?
用来实现容器与宿主机之间数据共享
2:数据卷特点
a:数据卷可以在容器之间共享和重用
b:数据卷的修改会立刻影响到对应容器
c:
11 将容器打包成为一个新的镜像
docker commit -m "描述信息" -a "作者信息" [容器名称|容器ID] 打包形成镜像的名称:标签(版本)
12 将镜像备份
# 将镜像备份出来,指定镜像名称或者镜像id指定版本号 打包成为一个tar包
docker save container-name|container-id:tag -o package-tag.tar
13 Docker网络相关
1:为什么提供网络功能
docker 允许通过外部访问容器或者容器之间互联的方式来提供网络服务
2:docker与操作系统的通讯机制
13.1docker网桥
查看网桥命令,默认网桥名称[bridge]
docker network ls
NETWORK ID NAME DRIVER SCOPE
e0be85fd884e bridge bridge local
db1b45fcffa9 host host local
d6442414c14c none null local
当docker启动时,会自动在主机上创建一个docker0[新版默认名称bridge]虚拟网桥,实际上是linux的一个网桥[bridge],可以理解为一个软件交换机,它会挂载到它的网口之间进行转发。
同时,docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给docker0接口,比如典型的172.17.42.1,掩码为255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址
13.2 docker容器与操作系统通信机制
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
13.3 docker 网络使用
注意:一般在使用docker网桥[bridge]实现容器与容器通信时,都是站在一个应用的角度进行容器通信
a:查看docker网桥设置
docker network ls
b:创建自定义网桥
docker create ems(网桥名称) ===》docker create -d bridge ems(网桥)
docker run -d -p 8080:8080 --network ems --name tomcate tomcat:8.0
docker run -d -p 8081:8080 --network ems --name tomcate tomcat:8.0
c:删除网桥
docker network rm <网桥名称>
删除所有未使用的网桥
docker network prune
d:查看网桥纤细
docker inspect <网桥名称>
注意:一旦在启动容器时指定了网桥之后,可以在任何这个网桥关联的容器中使用容器名字进行与其他容器通信