Docker

发布时间 2023-09-26 15:22:53作者: 仧空

Docker 架构

Docker 包括三个基本概念:

  镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。为一个只读模板。

  容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。容器可以被创建、启动、停止、删除、暂停等。

  仓库(Repository):仓库用来保存镜像。

容器与镜像的关系类似于面向对象编程中的对象与类。在安装好并启动了Docker之后,我们可以使用在命令行中使用Docker命令操作Docker,比如我们使用如下命令打印Docker的版本信息。

docker version                  打印版本信息

 

Docker的安装

1.查看是否安装docker

yum list installed | grep docker

2.安装docker

yum install -y docker

3.启动查看docker

systemctl start/stop/status docker

start 启动、stop 停止、status  状态

 4.配置国内源

输入命令:vi /etc/docker/daemon.json

在该文件内编辑加入以下语句

 systemctl daemon-reload systemctl restart docker

 

Docker相关操作

docker images                        查看镜像列表
docker pull -a 80:80 仓库名                        拉取镜像(仓库名则由作者名和软件名组成。可以从https://hub.docker.com上查找相关镜像)
docker rm 镜像名                        删除镜像
docker load < path                        导出镜像(path是保存的路径)
docker ps -a            查看所有镜像
docker run -d --name 容器名称 镜像名称             启动容器
docker stop 镜像名称            停止容器

举例:

  1.创建并运行一个容器

docker run --name mn -p 80:80 -d nginx

  mn:容器名称

  -p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(这里的`-p`参数,是将容器端口映射到宿主机端口。默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了)

  -d:后台运行容器

  nginx:镜像名称

  2.进入容器,修改文件

docker exec -it mn bash     或     docker exec -it 容器id /bin/bash

  docker exec :进入容器内部,执行一个命令

  -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互

  mn :要进入的容器的名称

  bash:进入容器后执行的命令,bash是一个linux终端交互命令

注:若出现报错,①查看容器id②启动容器(docker start 容器id)③使用刚刚的命令即可进入

  3.进入文件后,nginx的环境、配置、运行文件全部都在这个文件系统中,包括我们要修改的html文件。查看DockerHub网站中的nginx页面,可以知道nginx的html目录位置在/usr/share/nginx/html我们执行命令cd /usr/share/nginx/html,进入该目录。修改index.html的内容 容器内没有vi命令,无法直接修改,我们用下面的命令来修改:

sed -i -e 's#Welcome to nginx#Welcome to Docker!#g' -e 's#<head>#<meta charset="utf-8">#g' index.html

  4.修改完成后打开主机浏览器,访问地址192.168.233.138

 

数据卷

  数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录,在之前的nginx案例中,修改nginx的html页面时,需要进入nginx内部。并且因为没有编辑器,修改文件也很麻烦。
这就是因为容器与数据(容器内文件)耦合带来的后果。此时,使用数据卷就方便许多。一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。

  这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了

数据卷相关操作

docker volume create html                        创建数据卷
docker volume ls                        查看所有数据
docker volume inspect html                        查看数据卷详细信息卷
docker volume rm html                        删除指定数据卷(这里删除html数据卷)
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 nginx            给nginx挂载数据卷

案例:给MySQL挂载数据卷 

  1)拉取mysql镜像

  2)创建目录/tmp/mysql/data

  3)创建目录/tmp/mysql/conf,编辑默认配置文件my.cnf

  4)去DockerHub查阅资料,创建并运行MySQL容器,要求:

    ① 挂载/tmp/mysql/data到mysql容器内数据存储目录

    ② 挂载/tmp/mysql/conf/my.cnf到mysql容器的配置文件

    ③ 设置MySQL密码

  5)设置mysql密码

docker run --name mysql -e MYSQL_ROOT_PASSWORD=输入自己设置的密码 -v /tmp/mysql/data/:/var/lib/mysql -v /tmp/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf -p 3306:3306 --privileged -d mysql

  6)添加新的端口,这里我设置的端口是3306,配置防火墙通行条件

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload            重新载入防火墙禁止进入规则

  7)win+r 输入services.msc查看MySQL服务,启动服务,然后通过主机所下载的MySQL路径win+r进入命令编辑,输入命令

mysql -h 192.168.233.138 -P 3306 -uroot -p