虚拟机: 操作系统是一个很笨重的程序,即是啥都不干,虚拟本身都要占用很多内存和磁盘,并且启动很慢(操作系统要从头到尾把该检测的都检测了,该加载的都加载上)。
容器: 类似于码头的集装箱——相互隔离、长期反复使用、快速装载和卸载、规格标准,在港口和船上都可以摆放。
虚拟机&Docker的隔离:
Docker: Go语言开源项目,docker将程序以及程序所有的依赖都打包到docker container。Docker可以把程序所需要的环境装在容器里面,以做到一次容器配置,程序处处可运行。
组成(理解):
关键指令:
docker build
docker run
docker pull
Docker的关键组件:
本文全的案例与指令全是基于Centos7.6!!!
注意:Docker默认安装目录:/var/lib/docker
查看docker稳定版本,并选择安装:
# 在存储库中列出可用版本
yum list docker-ce --showduplicates | sort -r
# 安装
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装
yum update
# 安装必要依赖
# yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置yum源(2选1)
# 阿里
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 中央
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
# 可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-18.03.1.ce
安装之后启动 Docker 服务,并配置开机自启动
# 启动Docker服务,也可以使用 systemctl start docker 启动服务
service docker start
# 设置开机自启动
chkconfig docker on
# 查看Docker是否开机自启动
systemctl is-enabled docker
卸载Docker,可参考这篇博客:https://blog.csdn.net/zqd_java/article/details/122249755
此部分以拉取Postgresql:14.2的镜像为例
如果拉取镜像报错报错:missing signature key
处理: 查看docker版本docker version
docker版本太老,需要重装
安装最新的Docker:yum install docker-ce -y
docker search postgres
查看远程仓库有哪些版本的postgres
docker pull postgres:14.2
拉取Postgresqldocker images
展示本地镜像docker rmi imagesId
通过镜像ID卸载镜像
如果一个镜像正在被一个容器所使用,那就删除这个容器,再卸载镜像,或者 docker rmi -f ImageId
强制卸载
如何删除一个容器
docker container list --all
,也可以用docker ps
docker stop ContainerId
docker rm ContainerId
注意:
- 默认情况下,Docker容器中的PostgreSQL数据目录通常位于容器内部的/var/lib/postgresql/data路径下
- 刚拉下来Postgresql镜像并不会立即创建一个数据目录,而是需要运行起来容器之后才会创建
- 最好初始化一个docker卷来持久化Postgresql的数据,并将其挂载到PostgreSQL容器的/var/lib/postgresql/data目录
配置postgreSQL14.2镜像:
创建一个docker卷持久化Postgresql的数据
docker卷:volume
,一个持久的存储区域,可以用来保存数据,即使容器被删除或重新创建,数据仍然可以保留(注:卷名必须唯一)
docker volume create psql-data
创建并运行容器
# docker run -d --name 容器名 -v docker卷:psql数据目录 -e POSTGRES_USER=用户名 -e POSTGRES_PASSWORD=密码 -p 端口 repository:tag
docker run --privileged=true -d --name mypg -v psql-data:/var/lib/postgresql/data -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=admin -p 5432:5432 postgres:14.2
验证持久目录
注意: 直接ls /var/lib/postgresql/data
可能会报错——ls: cannot access
[root@VM-8-9-centos lib]# ls /var/lib/postgresql/data
ls: cannot access /var/lib/postgresql/data: No such file or directory
当使用-v
选项将宿主机上的目录挂载到容器内时,Docker会在宿主机上创建一个卷,并使用容器内的路径来映射它。如我将psql-data卷挂载到了容器的/var/lib/postgresql/data目录。
但是,/var/lib/postgresql/data这个路径是PostgreSQL容器的内部路径,而不是宿主机上的实际路径。当我尝试在宿主机上使用ls命令列出这个路径时,它会提示“No such file or directory”,因为该路径在宿主机上并不存在。
应该使用Docker提供的命令和工具,而不是直接在宿主机上访问该路径。应该用docker exec <container_name_or_id> <command>
在容器内部执行指令。
[root@VM-8-9-centos lib]# docker exec -it mypg ls /var/lib/postgresql/data
base pg_ident.conf pg_serial pg_tblspc postgresql.auto.conf
global pg_logical pg_snapshots pg_twophase postgresql.conf
pg_commit_ts pg_multixact pg_stat PG_VERSION postmaster.opts
pg_dynshmem pg_notify pg_stat_tmp pg_wal postmaster.pid
pg_hba.conf pg_replslot pg_subtrans pg_xact
连接数据库
报错原因和上面是一样的
[root@VM-8-9-centos ~]# psql -U postgres -h localhost -p 5432 -d postgres
-bash: psql: command not found
换个指令:docker exec -it mypg psql -U postgres -h localhost -p 5432 -d postgres
[root@VM-8-9-centos ~]# docker exec -it mypg psql -U postgres -h localhost -p 5432 -d postgres
psql (14.2 (Debian 14.2-1.pgdg110+1))
Type "help" for help.
postgres=#
开启密码校验:可以看到,无须密码就登录进去了,现在就需要去修改一下配置文件了
就是要找到pg_hba.conf文件的目录,然后修改
[root@VM-8-9-centos ~]# find / -name pg_hba.conf
/var/lib/docker/volumes/psql-data/_data/pg_hba.conf
[root@VM-8-9-centos ~]# vim /var/lib/docker/volumes/psql-data/_data/pg_hba.conf
改前:
改后:
重启容器就OK了
为了方便阅读,这里对文中的相关指令做一些说明。
Docker常用指令:都是docker
开头的指令。
指令 | 说明 | 案例 |
---|---|---|
docker pull | 拉取镜像 | docker pull postgres:14.2 |
docker version | 查看docker版本 | |
docker search | 查看远程仓库的镜像版本 | docker search postgres |
docker images | 展示本地镜像 | |
docker rmi | 卸载镜像 | docker rmi imagesId docker rmi -f imagesId |
docker container list docker container list --all | 展示在运行的容器 展示本地所有容器 | |
docker ps | 展示正在跑的容器 | |
docker stop | 停止容器运行 | docker stop ContainerId |
docker rm | 卸载容器 | docker rm ContainerId docker rm -f ContainerId |
docker volume | docker卷操作 | docker volume create psql-data 创建一个叫psql-data的卷 |
docker run | 创建并运行容器 | docker run --privileged=true -d --name mypg -v psql-data:/var/lib/postgresql/data -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=admin -p 5432:5432 postgres:14.2 |
docker exec | 在容器内部执行指令 | docker exec -it mypg ls /var/lib/postgresql/data |
docker satrt | 运行容器 | docker satrt name |
docker restart | 重启容器 | docker restart name |
一些Centos7操作:
操作 | 指令 |
---|---|
修改环境变量 | vi /etc/profile export 变量名=$PATH:文件目录 source /etc/profile |
查看环境变量 | echo $变量名 或env |
删除环境变量 | unset 变量名 或unset *.* |
对比which、whereis、find、locate:
which
——用于查找可直接执行的命令,且只在$PATH路径(环境变量)中搜索,只返回第一个匹配的文件路径,但可以通过-a
选项返回所有匹配结果
[root@VM-8-9-centos bin]# which docker
/usr/bin/docker
whereis
——在$PATH路径基础上增加了一些系统目录的查找,查找范围比which稍大,查找速度快。可以通过选项-b限定只搜索二进制文件
[root@VM-8-9-centos bin]# whereis docker
docker: /usr/bin/docker /etc/docker /usr/share/man/man1/docker.1.gz
find
——直接搜索整个文件目录的任意文件,默认从根目录开始搜索,匹配名字
[root@VM-8-9-centos bin]# find / -name docker
/sys/fs/cgroup/devices/docker
/sys/fs/cgroup/cpuset/docker
/sys/fs/cgroup/hugetlb/docker
/sys/fs/cgroup/net_cls,net_prio/docker
/sys/fs/cgroup/pids/docker
/sys/fs/cgroup/freezer/docker
/sys/fs/cgroup/cpu,cpuacct/docker
/sys/fs/cgroup/blkio/docker
/sys/fs/cgroup/memory/docker
/sys/fs/cgroup/perf_event/docker
/sys/fs/cgroup/systemd/docker
/etc/docker
/usr/share/bash-completion/completions/docker
/usr/bin/docker
/var/lib/docker
/var/lib/docker/overlay2/07892f16155c27680887056014518b9bda0c79aa0da2a3973dcc6d68c337a9a8/diff/etc/dpkg/dpkg.cfg.d/docker
/var/lib/docker/overlay2/b6417229db3f6b31cfc75c95453e44541e6c172e961631dd92de966a100bbe3f/diff/etc/dpkg/dpkg.cfg.d/docker
/run/docker
locate
——超快速查找任意文件。它会从Linux内置的索引数据库查找文件的路径,索引速度超快。刚刚新建的文件可能需要一定时间才能加入该索引数据库,可以通过执行updatedb
命令来强制更新一次索引,这样确保不会遗漏文件。该命令通常会返回大量匹配项,可以使用-r
选项通过正则表达式来精确匹配