目录
用Docker的背景
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题,比如依赖关系复杂,容易出现兼容性问题。例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。
Docker作用
Docker为了解决依赖的兼容问题的,采用了两个手段
-
将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
-
将每个应用放到一个隔离容器去运行,避免互相干扰
Docker是什么
Docker是一个创建容器的工具。他创建的容器可以在各平台上稳定的运行。
镜像:
-
将应用程序及其依赖、环境、配置打包在一起。
容器:
-
镜像运行起来就是容器,一个镜像可以运行多个容器。
DockerHub:
-
一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry。在上面可以下载各种需要的软件镜像,例如nginx、redis等。
安装Docker
- yum install -y docker-ce:安装docker,docker-ce为社区免费版本。
- systemctl start docker:启动Docker
- systemctl stop firewalld:启动docker之前需要关闭防火墙。
- systemctl stop docker # 停止docker服务
- systemctl restart docker # 重启docker服务
Docker镜像的操作
拉取镜像
- 在拉取镜像之前,先去镜像仓库中搜索镜像,仓库地址:https://hub.docker.com/
- docker pull nginx(镜像名),拉取镜像,默认是最新的分支版本。
查看镜像
- docker images 镜像名:查看镜像
删除镜像
- docker rmi 镜像名:删除镜像
保存镜像为一个压缩包
- docker save -o nginx.tar nginx:latest
- docker save -o [保存的目标文件名称] [镜像名称]
加载压缩包为镜像
- docker load -i nginx.tar
Docker容器的操作
容器保护三个状态:
-
运行:进程正常运行
-
暂停:进程暂停,CPU不再运行,并不释放内存
-
停止:进程终止,回收进程占用的内存、CPU等资源
其中:
-
docker run:创建并运行一个容器,处于运行状态
-
docker pause:让一个运行的容器暂停
-
docker unpause:让一个容器从暂停状态恢复运行
-
docker stop:停止一个运行的容器
-
docker start:让一个停止的容器再次运行
-
docker rm:删除一个容器
案例-创建并运行一个容器
创建并运行nginx容器的命令:
docker run --name containerName -p 80:80 -d nginx
命令解读:
-
docker run :创建并运行一个容器
-
--name : 给容器起一个名字,比如叫做mn
-
-p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-
-d:后台运行容器
-
nginx:镜像名称,例如nginx
这里的-p
参数,是将容器端口映射到宿主机端口。
默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。
现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx。
案例-进入容器,修改文件
需求:进入Nginx容器,修改HTML文件内容,添加“传智教育欢迎您”
提示:进入容器要用到docker exec命令。
步骤:
1)进入容器。进入我们刚刚创建的nginx容器的命令为:
docker exec -it mn bash
命令解读:
-
docker exec :进入容器内部,执行一个命令
-
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
-
mn :要进入的容器的名称
-
bash:进入容器后执行的命令,bash是一个linux终端交互命令
2)进入nginx的HTML所在目录 /usr/share/nginx/html
cd /usr/share/nginx/html
3)修改index.html的内容
容器内没有vi命令,无法直接修改,我们用下面的命令来修改:
sed -i -e 's#Welcome to nginx#传智教育欢迎您#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
在浏览器访问自己的虚拟机地址,例如我的是:http://192.168.150.101
Docker数据卷
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。 一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了。
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
-
create 创建一个volume
-
inspect 显示一个或多个volume的信息
-
ls 列出所有的volume
-
prune 删除未使用的volume
-
rm 删除一个或多个指定的volume
创建和查看数据卷
需求:创建一个数据卷,并查看数据卷在宿主机的目录位置
① 创建数据卷
docker volume create html
② 查看所有数据
docker volume ls
③ 查看数据卷详细信息卷
docker volume inspect html
挂载数据卷(可以是文件也可以是文件夹)
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run \ --name mn \ -v html:/root/html \ -p 8080:80 nginx \
这里的-v就是挂载数据卷的命令:
-
-v html:/root/htm
:把html数据卷挂载到容器内的/root/html这个目录中