目录
1、Docker是什么?
Docker是一种开源的容器化平台,用于构建、管理和部署应用程序。它通过容器化技术,将应用程序及其所有依赖项打包在一个独立的、可移植的容器中,以便在任何环境中执行。Docker容器是轻量级、可隔离和可复制的,可以在不同的操作系统和云平台上运行。
我的理解是这样的:
在软件开发中,要运行的程序就是蛋糕,要把蛋糕送给不同的人,每个不同的人就相当于不同的计算机环境。Docker可以把应用程序和它所需要的所有部分(例如库文件、配置)打包在一起,形成一个独立的镜像。这个镜像可以通过容器轻松地在任何计算机上运行,而不会受到其他应用程序的干扰,并且可以在不同的操作系统和云平台上使用。(即蛋糕店把蛋糕和装饰的配件打包在一起,放在蛋糕盒子里,蛋糕可以通过蛋糕盒子的保护,不受其他外界因素的干扰,顺利到达顾客的手上,容器就是蛋糕盒子)Docker容器就像蛋糕盒子一样,是轻巧、可隔离和可复制的。它可以简化应用程序的部署和管理过程,提供了更高效、更可靠的方式来交付和运行应用程序。
2、镜像和容器是什么?
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。一个镜像可以运行多个容器。
容器(Container):容器是镜像中的应用程序运行后形成的进程,Docker会给容器做隔离,对外不可见。
DockerHub:Docker镜像托管平台,镜像服务器。称为Docker Registry。
3、docker常用命令合集
拉取镜像
//查看镜像的可用版本
docker search [name]
//拉取镜像
docker pull [name]:[version]
//比如拉取centos
docker pull centos:centos7
//拉取MySQL
docker pull mysql:latest
//查看已安装的镜像
docker images
//查看指定镜像的版本
docker images|grep [name]
镜像名称获取途径:可通过访问dockerhub官网Docker Hub Container Image Library | App Containerization搜索镜像来获取镜像的名称版本和完整的拉取镜像命令
保存、导入镜像
//保存镜像到磁盘
docker save -o [保存的目标文件名称] [镜像名称]
如:docker save -o nginx.tar nginx:latest
//(加载)导入镜像 注:加载前,保证没有相同的镜像存在
docker load -i [镜像的压缩包名称]
//如:docker load -i nginx.tar
创建镜像
docker build -t myimage .
这将在 当前 文件夹中查找名为 "Dockerfile" 的文件,并使用它来构建镜像。构建过程中的文件和依赖项将被打包到镜像中。
-t <镜像标签>
: 指定构建生成的镜像的标签。-f <Dockerfile路径>
: 指定要使用的Dockerfile路径。如果不指定,默认使用当前路径下名为 "Dockerfile" 的文件。--no-cache
: 在构建过程中禁用缓存,强制重新下载所有依赖项,以确保最新版本。--pull
: 在构建过程中尝试拉取最新的基础镜像。--build-arg <变量名称>=<值>
: 设置构建过程中使用的构建参数,可以在Dockerfile中使用。--network <网络模式>
: 指定构建过程中使用的网络模式。
删除镜像
docker rmi 镜像名
运行容器
//新建一个容器
docker run -itd --name server1 -v /data/workspace:/home/workspace --privileged=true -p 6500:6501 centos:centos7 /bin/bash
//启动一个已停止的容器
docker start [container_id]
//重启容器
docker restart [container_id]
参数说明:
-i:交互式操作,保持STDIN开放
-t:为容器分配一个虚拟终端并连接到容器的STDIN
-d:以后台方式运行容器,并返回容器ID,此模式下默认不会进入容器,如果需要进入容器需要用:
docker exec -it 容器名字或ID /bin/bash
--name:容器的名字
-v: 指定挂载目录
/data/workspace:/home/workspace:在主机和容器之间创建一个数据卷。这将主机上的
/data/workspace
目录挂载到容器的/home/workspace
目录--privileged=true:这将赋予容器一些特权,允许容器内的进程有几乎同主机一样的权限,默认情况下为false。
-p: [外部端口号]:[所映射的容器内部端口号]
centos:centos7 :在CentOS7的环境下运行容器
/bin/bash: 放在镜像名后的是命令,容器启动后,执行的首个命令。在这里,它将运行bash shell。
进入容器
//进入容器
docker exec -it mn bash
mn:容器名称
退出终端
//退出终端
exit
或者
Ctrl + P + Q
查看容器
//查看所有容器
docker ps -a
//查看运行中的容器
docker ps
删除操作
//删除容器
docker rm [container_id]
//删除镜像
docker rmi [images_id]
上传文件到容器
//上传文件到某个容器
docker cp [文件路径] [容器名]:[容器中的路径]
重命名镜像和容器
//镜像重命名
docker tag [OPTIONS] IMAGE[:TAG]
[REGISTRYHOST/[USERNAME/]NAME[:TAG]
//比如:假设你有一个镜像 my_image:1.0,你想要重命名它为 new_image:2.0
docker tag my_image:1.0 new_image:2.0
//如果你想将镜像推送到 DockerHub,你需要将你的 DockerHub 用户名包含在镜像名中,如下所示:
docker tag my_image:1.0 yourusername/new_image:2.0
//然后,你可以使用 docker push 命令将这个新命名的镜像推送到 DockerHub:
docker push yourusername/new_image:2.0
//容器重命名
docker rename
将容器提交为镜像
docker commit [OPTIONS] CONTAINER(容器id or 名) [REPOSITORY[:TAG]]
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
数据卷操作
//创建数据卷
docker volume create [name]
//查看所有数据卷
docker volume ls
//查看数据卷详细信息,包括关联的宿主机目录位置
docker volume inspect [name]
//删除指定的数据卷
docker volume rm [name]
//删除所有未使用的数据卷
docker volume prune
//创建容器并挂载数据卷 mn:容器的名称 -v:挂载命令,格式为"-v [数据卷name]:[容器内目录]"或"-v [宿主机文件]:[容器内文]"或"-v [宿主机目录]:[容器内目录]"
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
4、什么是数据卷?
数据卷(Data Volumes)是Docker中一种用于持久化存储和共享数据的机制,是一个虚拟目录,指向宿主机文件系统中的某个目录。 。它提供了一种在容器和主机之间共享数据的方式,使得数据能够在不同的容器之间传递、持久保存,甚至可以与宿主机进行共享。
通俗理解:想象一下,你住在一个宿舍里,每个人都有自己的房间。现在,你们要共享一些物品,比如一台音响或者一本书。数据卷就像是一个公共的储物柜,可以用来放置这些共享物品。
在这里,宿舍就好比是Docker容器,每个房间就是一个个独立的容器,而数据卷就是一个大家共同使用的空间。你们可以把物品放进去,每个人都可以自由地从储物柜中取出物品或者放入物品。这样一来,无论是谁需要使用这些共享物品,都可以很方便地获取到。
另外,这个公共储物柜也和外面的世界连接着,任何人都可以从外面往里放入物品,或者从里面拿出物品。就好像数据卷可以和宿主机的文件系统进行绑定,宿主机可以将一些数据放入到数据卷中,供容器中的应用程序使用,也可以从容器中将数据取出来。
所以,数据卷就是一个方便大家共享、存储和传递数据的机制,使得容器和宿主机之间的数据交流更加便捷和可靠。它就像是一个共享的储物柜,让大家可以自由地存放和取用共享物品。
数据卷就像宿主机和容器之间的一根线,通过数据卷挂载后,用户操作宿主机的目录,操作会通过这根线影响到容器的目录。
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。 我们操作宿主机的/var/lib/docker/volumes/html目录,也就等于操作容器内的/usr/share/nginx/html目录。
5、数据卷的常用操作命令合集
命令格式
docker volume [COMMAND]
[COMMAND]的内容如下:
create 创建一个volume
inspect 显示一个或多个volume的信息
ls 列出所有的volume
prune 删除未使用的volume
rm 删除一个或多个指定的volume
创建数据卷
docker volume testvolume
查看数据卷
查看全部数据卷
docker volume ls
查看某个数据卷的信息
docker volume inspect testvolume
testvolume数据卷关联的宿主机目录为"/var/lib/docker/volumes/testvolume/_data"。
删除数据卷
删除某个数据卷
docker volume rm testvolume
删除所有未使用的数据卷
docker volume prune
数据卷挂载
一般在创建容器并运行时使用-v参数进行挂载
docker run \
--name tt \
-v testvolume:/usr/share/nginx/html \
-p 8080:80
nginx \
这句命令创建并运行一个叫tt的容器,使用-v参数把testvolume数据卷挂载到容器的/usr/share/nginx/testvolume目录下,使用-p参数把宿主机的8080端口映射到容器的880端口,这个tt容器运行一个叫nginx的镜像。
挂载后,查看数据卷在宿主机的位置:
docker volume inspect testvolume
进入该目录:
cd /var/lib/docker/volumes/testvolume/_data
就可以进行各种操作,比如修改文件:
vi index.html
操作完后,这些的操作也会作用到容器中。
6、通过Dockerfile构建自定义镜像
官方文档:Dockerfile reference | Docker Docs
Dockerfile文档的指令不区分大小写,但是官方建议把指令写成大写,以便区分参数和指令。
Docker把#开头的行视为注释,注释不能和命令写在同一行,不然会被视作参数。
Dockerfile必须以FROM指令开始。
例子:
前端代码的简单Dockerfile示例:
后端代码的简单Dockerfile文件示例:
7、通过DockerCompose 一次性部署多个服务
Docker Compose是Docker的一个开源项目,它的目标是通过一个简单的YML或JSON格式的文件来定义和运行多个相互连续的Docker容器。
对于那些由多个容器协同工作的应用(例如一个Web服务器和一个数据库服务器),用户需要分别启动各个容器并进行配置,这是一个复杂且容易出错的过程。Docker Compose的目标就是通过自动化这个过程,使得用户可以更易于启动和管理多容器应用。
通过Docker Compose,你可以在一个compose文件(例如docker-compose.yml)中定义应用的服务,每个服务实际上就是一个容器。然后,通过一个简单的命令docker-compose up,就可以一次性创建并启动所有的服务。
总之,Docker Compose提供了一种简便的方式来定义和运行多容器的Docker应用,从而极大地提升了使用者的效率。
例子:
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
ports:
- 3306:3306
web:
build: .
ports:
- "8090:8090"
mysql:一个基于
mysql:5.7.25
镜像构建的容器,并且挂载了两个目录web:一个基于
docker build
临时构建的镜像容器,映射端口时8090