在部署应用程序的方式上 , 主要经历了三个时代
Docker就是一个用来装应用程序的容器 , 就好比被子用来装水 , 笔筒用来装笔 , 书包用来装书 , 你也可以把Hello World放到Docker里 , 你可以把网站放在Docker里 , 你可以把你想的到的任何程序放到Docker里
Docker又是那个重要的概念 : 仓库 , 镜像 , 容器
仓库使用来存放镜像的地方 , 类似于Maven仓库 , Git仓库等用途 , 仓库之上还有注册服务器(Registry)的概念 ,上面存放着多个仓库 , 每个仓库中又有多个镜像 , 而每个镜像又可以有多个标签(tag) , 目前最大的公开仓库是Docker Hub , 我们可以使用类似Git命令的方式去pull/push镜像
可以理解为一个只读的模板 , 镜像可以用来创建容器 , 一个镜像可以创建多个容器 , 你可以直接从官方仓库(docker hub) 或者其他私服仓库拉取(pull)想要的镜像 , 或通过Dockerfile来构建属于你自己的镜像 ,这一切的操作都是非常简单的
容器是由镜像创建的实例 , 他可以被启动 , 停止 , 运行 , 删除 , 每个容器之间是互相隔离的 , 保证安全的平台 , 可以把容器看做为一个简单的Linux环境
在虚拟机上安装Docker 使用CentOS7来安装Docker , 不过Docker官方要求CentOS操作系统内核必须在3.10以上
基于CentOS安装Docker :
# 0.安装yum-utils工具
yum -y install yum-utils
# 1.设置 yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 2.安装 docker
yum install -y docker-ce
# 3.启动 docker 服务端
systemctl start docker
# 4.设置docker服务开机自启
systemctl enable docker
# 5.校验 docker 是否启动成功
docker version
当出现下面这种情况就代表Docker安装成功 :
Docker默认的镜像仓库在国外,我们进行镜像拉取的时候,速度会比较慢,所以我们需要设置镜像加速器,像阿里云、腾讯云都提供了镜像加速器免费服务.
步骤 :
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://eqa6sci6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart dock
命令格式:
docker run IMAGE [COMMAND] [ARGS...]
命令解释.
命令会检测当前要运行的镜像在本地存不存在,若不存在他会自动 pull 下来再运行
运行后会启动一个容器, 并且开启一个文件系统, 你可以直接在容器内创建文件夹. 运行一个指定的程序, 当程序退出后, 容器也就退出了
示例:
docker run centos echo 'hello docker'
命令格式:
docker ps [-a] [-l]
参数解释:
-a:表示列举所有的容器
-l :表示列举最近创建的容器.
默认情况容器在运行之后就停止了,ps只是显示正在运行的容器.
命令格式:
docker run -i -t IMAGE /bin/bash
参数解释:
-i --interactive=true|false 默认是false:允许你对容器内的标准输入 (STDIN) 进行交互 -t --tty=true|false 默认是false:在新容器内指定一个伪终端或终端
示例:
docker run -it centos /bin/bash
docker exec -it 容器ID/容器名 /bin/bash
docker inspect 容器ID/容器名
docker rm -f $(docker ps -aq) 批量删除
要查看容器的详细信息 , 需要输入很长的字母 , docker允许用户可以自定义容器的名字
命令格式 : docker run --name = 自定义名称 -it IMAGE /bin/bash
docker run --name=mycontainer -it IMAGE /bin/bash`
查询所有容器的ID , 命令格式 :
docker ps -aq
删除所有容器 , 命令格式 :
docker rm -f $(docker ps -aq)
查看容器内的进程 , 命令格式 :
docker top 容器ID/容器名
拷贝文件到容器内部 , 命令格式 :
# 命令格式: docker cp 文件 容器ID:容器目录
docker cp index.html cff96db0cd78:/usr/share/nginx/
通常我们在docker中部署中间件或者程序的时候 , 这些程序需要开放端口才可以访问 , 比如Nginx要开放80端口 , MySQL需要开放3306端口 , 所以我们现在需要部署Nginx的话 , 需要对容器的端口进行映射
# 宿主机会随机选择一个端口和容器内的80端口进行映射
docker run -d -p 80 nginx:1.17.1
# 宿主机会选择8080端口和容器内的80端口进行映射
docker run -d -p 8080:80 nginx:1.17.1
# 创建容器
docker run --name nginx-test -p 8080:80 -d nginx:1.17.1
通过地址栏进行访问:http://宿主机IP:8080
编写index.html,内容如下:
hello docker nginx
拷贝index.html到容器的指定目录
docker cp index.html nginx-test:/usr/share/nginx/html
通过地址栏进行访问:http://宿主机IP:8080
Nginx的配置文件在这个目录下: /etc/nginx/nginx.conf
我们都知道Docker其中一个理念就是应用和环境打包 , 通常docker容器的生命周期都是和容器中的应用是一致的 , 如果删除了容器 , 那么容器内产生的数据也会一并被删除
对于有些容器(比如MySQL) , 我们可能会有持续化数据的需求 , 也就是容器启动时需要加载已有的数据 , 容器销毁时希望保留产生数据 , 这个就需要用到Docker的Data Vloume存储机制
Docker数据卷设计的目的 , 在于数据的永久化 , 他完全独立于容器的生存周期 , 因此 , Docker不会再容器删除时删除其挂载的数据卷 , 也不会存在类似的垃圾回收机制 , 对容器引用的数据卷进行处理
通过上面这张图 :
操作步骤 :
# -e参数表示给容器设置环境变量,MySQL在容器安装的时候默认将环境变量MYSQL_ROOT_PASSWORD作为登录密码
docker run --name mysql-5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.35
# 此时通过Navicat连接访问容器中的MySQL,然后新建test数据库
# 此时删除掉该容器
docker rm -f mysql-5.7
# 再次启动容器,发现前面创建的test数据库不见了,说明数据并没有持久化
docker run --name mysql-5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.35
数据卷操作步骤
# 先删除掉前面创建的MySQL容器
docker rm -f mysql-5.7
# -v 宿主机目录:容器目录 ---> 表示数据卷的映射
docker run --name mysql-5.7 -v /mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.35
# 此时通过Navicat连接访问容器中的MySQL,然后新建test数据库
# 此时删除掉该容器
docker rm -f mysql-5.7
# 再次启动容器,发现前面创建的test数据库依然存在,说明数据实现了持久化的功能.
docker run --name mysql-5.7 -v /mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.35
我们在前面的Nginx案例中,我们是将index.html页面内容拷贝到容器内部,这样就可以替换默认的首页了。假如我们在启动容器之后需要修改index.html的内容怎么办呢? 或者我们需要对nginx.conf的内容做修改怎么办呢? 进入容器修改?但是容器内部并没有安装vi或者vim的工具。这个需求我们也可以通过数据卷来解决,让宿主机的目录和容器内的目录做映射,我们需要修改index.html或者nginx.conf的时候,就不需要进入容器内部,直接在宿主机修改即可.
步骤如下:
第一步: 创建nginx的html存储目录
# 创建目录
mkdir -p /nginx/html
# 新建index.html文件
vi /nginx/html/index.html
第二步: 在/nginx/html目录中创建index.html文件,内容如下
hello docker DataVolume
第三步: 创建容器
docker run --name nginx-dv -v /nginx/html:/usr/share/nginx/html -p 8080:80 -d nginx:1.17.1
第四步: 修改宿主机index.html内容
vi /nginx/html/index.html
访问浏览器 , 可以看到内容也同步进行修改了