当前位置:   article > 正文

Docker基础及简单部署_docker部署

docker部署

一、 基本原理
容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出,Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包打包到一个可移植的容器中,然后发布(C/S架构,本机是客户端,可以理解为docker引擎就是服务端)
在这里插入图片描述
二、优点
共用宿主机内核,轻量级,损耗少,启动快,性能高,运行在linux系统上,能够对应用程序及应用程序的运行环境进行打包,防止因环境而造成的各种影响
三、与传统虚拟化方式对比
在这里插入图片描述
四、docker三要素
1、 仓库:Docker仓库是用来存储镜像的(docker hub),包括本地镜像和远程镜像
2、 Image:镜像,类似于一个应用程序的软件包,只读,镜像内部是一个精简的操作系统,同时还包含应用程序运行所必须的文件和依赖包
3、 Container:容器,运行一个image的实例,类似于一个进程
五、docker的基本操作(以nginx为例)
1、 docker为一个引擎,类似于linux中的一个服务,通过docker引擎对容器进行相关的操作,所以在运行前需安装docker引擎
(1)下载yum源,用于安装docker引擎
[root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
(2)安装docker引擎
[root@localhost yum.repos.d]#yum install -y yum-utils device-mapper-persistent-data
[root@localhost yum.repos.d]# yum install -y docker-ce
在这里插入图片描述
(3)查看版本信息
[root@localhost yum.repos.d]# docker version(可以判定是否安装成功)
在这里插入图片描述
[root@localhost ~]# docker pull nginx:1.19.8
在这里插入图片描述
也可以通过传入压缩包的方式导入镜像到本地
注:如果从其他网站pull镜像到本地,需要加上该网站的url
[root@localhost ~]# docker load -i docker-mysql-5.7.tar.gz
在这里插入图片描述
在这里插入图片描述
(5)查看镜像
[root@localhost ~]# docker images
在这里插入图片描述
REPOSITORY:镜像名称
TAG:镜像版本标签
IMAGE ID:镜像ID(唯一)
CREATED:创建时间(为该镜像创建者创建的时间,而不是下载的时间)
SIZE:镜像大小
(6)运行该镜像
[root@localhost ~]# docker run -d nginx:1.19.8
[root@localhost ~]# docker ps (查看正在运行的容器,-a参数可以查看所有容器包括已经停止的。Port暴露出来的端口与容器内部进程的端口没有关系)
在这里插入图片描述
注:可以给运行的容器自定义一个名称,该名称和镜像ID一样,也是唯一的
[root@localhost ~]# docker run -d --name nginx_01 nginx:1.19.8
在这里插入图片描述
(7)根据唯一ID停止容器
[root@localhost ~]# docker stop 8331ce5e02a5
(8)进入容器
[root@localhost ~]# docker exec -it 43d2af13de6b bash(-it进入容器的交互模式,bash为容器内部的命令行,也可以通过唯一name进入容器)
[root@43d2af13de6b:/etc/nginx# exit (退出容器)
2、 由于docker运行的容器是相互隔离的,所以外部无法访问容器内的nginx进程,如果外部想要访问,需要将nginx的端口与外部宿主机的端口做映射
[root@localhost ~]# docker run -d -p 80:80 --name nginx_02 nginx:1.19.8
在这里插入图片描述
3、 之后通过宿主机IP可访问到该页面
在这里插入图片描述
六、数据卷volumes
1、原理:为了方便正式环境程序部署,将本地宿主机的某个目录挂载到容器的指定目录上,使文件目录共享,则可以通过修改宿主机该目录下的内容,从而影响容器内部的内容,同时也方便容器内的数据与宿主机同步,防止容器被误操作,导致数据丢失(在容器启动时挂载)
2、具体操作
(1)在没有数据卷的情况下,可以使用docker cp命令在宿主机和容器之间传输文件
[root@localhost _data]# docker cp nginx_01:/etc/nginx/nginx.conf ./(将容器内的文件拷贝到宿主机上)
在这里插入图片描述
[root@localhost _data]# docker cp ./50x.html nginx_01:/root(将宿主机的文件拷贝到容器上,如果有相同的文件会将其覆盖)
在这里插入图片描述
(2)[root@localhost ~]# docker run -d -v /root/opt/:/etc/nginx/conf.d/ --name nginx_03 -p 8080:80 nginx:1.19.8
在宿主机/root/opt目录下传入配置文件后,容器里面也出现该配置文件
在这里插入图片描述
在这里插入图片描述
同样在容器中删除该配置文件,宿主机的文件同时也被删除
在这里插入图片描述
(3)[root@localhost ~]# docker run -d --name nginx_02 -v nginx_02:/usr/share/nginx/html/ -p 8082:80 nginx:1.19.8
给宿主机数据卷自定义名称/var/lib/docker/volumes/nginx_02目录下,容器内的数据会自动同步到自定义的nginx_02目录下
注:数据卷必须写绝对路径
在这里插入图片描述
在宿主机的数据卷下传入网站文件部署,通过外部也可以访问,容器内也同时存在该网站文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
七、Docker网络使用
每个容器在启动时会自动形成一个虚拟网桥,用于同一主机上的容器之间通信,容器之间相互隔离,同一网桥上的各容器可以相互通信

在这里插入图片描述
[root@localhost ~]# docker inspect nginx_01 查看容器详细信息
在这里插入图片描述
1、 默认网桥
默认网桥中的容器只能通过IP的方式访问其他容器
2、 自定义网桥
自定义网桥提供DNS解析,可以通过容器的名字或者是别名访问其他容器
注:容器可以自由进入或者是退出自定义网桥,如果想要退出默认桥接网络,需要先停止容器的运行,然后重新创建该容器,并指定需要连接的其他网络
3、 相关操作
[root@localhost ~]# docker network ls (查看网桥信息,bridge为默认网桥)
在这里插入图片描述
[root@localhost ~]# docker network create --driver bridge nginx (创建网桥nginx)
在这里插入图片描述
[root@localhost ~]# docker run -d --name nginx_02 -p 8080:80 --network nginx nginx:1.19.8 启动容器时指定使用nginx的网桥
[root@localhost ~]#docker run -d --name nginx_03 --network nginx -p 8082:80 nginx:1.19.8
指定nginx_02与nginx_03两个容器使用同一网桥,进入nginx_02访问nginx_03
在这里插入图片描述
八、Dockerfile
1、概念
Dockerfile是一个用来构建镜像的文本文件,文本中包含了一条条构建镜像所需的指令和说明
注:使用Dockerfile构建镜像时需要创建一个空目录专门放Dockerfile文件,否则在生成镜像时会将Dockerfile文件所在目录的所有文件传到服务端,影响镜像生成
2、构建nginx的Dockerfile
[root@localhost ~]# mkdir -p docker/nginx 构建一个空目录用于放置Dockerfile
[root@localhost nginx]# vi Dockerfile
在这里插入图片描述
[root@localhost nginx]# docker build -t nginx:01 ./ 创建镜像
注:服务端在生成镜像时时按照每一条语句创建一个镜像,层层叠加
FROM:指定创建镜像的基础
RUN:运行系统时使用的命令
EXPOSE:指定镜像监听的端口
ADD:对压缩文件进行解压缩;将数据移动到指定的目录
COPY:复制宿主机数据到镜像内部使用
WORKDIR:切换到镜像容器中的指定目录中
VOLUME:挂载数据卷到镜像容器中
USER:指定运行容器的用户
在这里插入图片描述
九、Docker-compose
1、概念
用于定义和运行多个容器 Docker 应用程序的工具(同时管理一个项目中的多个容器),使各个容器能够互通,适用Python语言编写,Compose使用YAML文件(用于描述要构建的容器)来配置应用程序的服务,能使用单个命令,从配置中创建并启动所有服务,适用于所有生产环境(开发、测试、生产)
2、三个步骤
(1)使用一个Dockerfile文件定义程序的环境,使其能在任何地方被复制
(2)在docker-compose.yml中定义组成应用程序的服务,使它们可以在一个孤立的环境中一起运行
(3)运行docker-compose up,docker-compose启动并运行整个应用程序(一条命令管理所有服务)
3、安装docker-compose
[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.29.0/docker-compose- ( u n a m e − s ) − (uname -s)- (unames)(uname -m) -o /usr/local/bin/docker-compose
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# docker-compose -v
在这里插入图片描述
4、 部署一个测试docker-compose
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Version:指定compose文件的版本(指定本 yml 依从的 compose 哪个版本制定的)
在这里插入图片描述
Service:定义服务信息,service下面可以定义多个服务(容器)
image: “nginx:001”:自定义容器名称
在这里插入图片描述
Hostname:定义该容器的主机名
Build:基于Dockerfile创建镜像,启动容器
Context:Dockerfile文件所在上下文目录
Dockerfile:Dockerfile文件名称(默认为Dockerfile)
Ports:类似于 docker -p参数,用于容器与宿主机端口映射(端口最好用双引号引起来)
Networks:定义容器网络名称(类似于域名,同一个项目下的容器通过该网络名称访问)
Volumes:定义挂载的目录
Command:覆盖容器启动后默认执行的命令
Environment:定义环境变量
在这里插入图片描述
在这里插入图片描述
5、 启动docker-compose
[root@localhost work]# docker-compose -f docker-compose.yml up (-d为后台运行)
注:在docker-compose.yml文件所在的目录启动
[root@localhost work]# docker-compose -f docker-compose.yml up -d –build(后台运行)
在这里插入图片描述
6、 查看docker服务启动详情
[root@localhost ~]# docker ps
在这里插入图片描述
注:容器名称work_nginx_1中work为当前docker-compose文件所在目录名,1为副本数
7、 页面访问测试
在这里插入图片描述
十、docker-machine
1、特点
(1)在windows平台和MAC平台安装和运行docker
(2)搭建和管理多个docker主机
(3)搭建swarm集群
2、安装
[root@localhost ~]# curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-uname -s-uname -m >/tmp/docker-machine
在这里插入图片描述
[root@localhost tmp]# chmod +x /tmp/docker-machine
[root@localhost tmp]# cp /tmp/docker-machine /usr/local/bin/docker-machine
[root@localhost tmp]# docker-machine version
4、 创建machine,docker-machine为本机创建machine时也需要进行ssh认证
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id root@192.168.1.11
[root@localhost ~]# docker-machine create --driver generic --generic-ip-address 192.168.1.11 test
注:–driver为指定基于什么虚拟化技术的驱动,generic只适用于linux系统,–generic-ip-address为指定要安装宿主机的IP(远程主机必须有SSH root用户免密登录)
[root@localhost ~]# docker-machine ls
在这里插入图片描述
5、 在192.168.1.11机子上发现已经安装好docker
在这里插入图片描述
6、 查看VM的环境变量
[root@localhost ~]# docker-machine env vm
在这里插入图片描述
7、 进入到docker-machine中
[root@localhost ~]# docker-machine ssh test
在这里插入图片描述
8、 启动一个容器
[root@test ~]# docker pull nginx:1.19.8
[root@test ~]# docker images
[root@test ~]# docker run -d -p 8080:80 nginx:1.19.8
在这里插入图片描述
在这里插入图片描述
9、 已通过192.168.1.12远程在192.168.1.11上成功启动一个nginx容器
在这里插入图片描述
10、docker-machine常用命令
docker-machine ls:查看docker-machine创建的远程docker
docker-machine ip test:查看远程容器IP
docker-machine env test:查看test的环境变量
docker-machine ssh test:进入到远程主机test上
docker-machine upgrade test:远程升级docker版本
docker-machine ssh test free –m:查看远程主机内存等情况(test后面可以接任何linux命令)
docker-machine status test:查看远程管理端服务器状态
注:generic这个驱动器不支持stop和kill关闭远程主机,只能使用start和restart
Docker-machine mount test:/aaa /bbb:将远程主机test上的aaa目录挂载到docker-machine主机的/bbb目录上(-u参数可以卸载已挂载的目录)
十一、swarm集群管理
1、 简介
Docker Swarm是Docker的集群管理工具,Docker Swarm提供了标准的Docker API,所有已经与Docker守护进程通信的工具都可以使用Swarm轻松地扩展到多个主机(支持Dokku、Docker Compose、Docker Machine等工具),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,等Swarm重新恢复运行之后,他会收集重建集群信息
2、 原理
Swarm集群由管理节点(manager)和工作节点(work node)构成
Swarm manager:负责整个集群的管理工作,包括集群配置、服务管理等所有跟集群有关的工作
Work node:主要负责运行相应的服务来执行任务(task)
在这里插入图片描述
[root@manager ~]# docker swarm init --advertise-addr 192.168.1.11
在这里插入图片描述
在这里插入图片描述
[root@manager ~]# docker node ls
在这里插入图片描述
Node上
[root@node ~]# docker swarm join --token SWMTKN-1-2dp2tblm2ijrhsnv1nqccpkf9h5l7jnp665kewkkl4om83nzlu-6rsijill5kz2sboqnfdg6tt47 192.168.1.11:2377
注:若出现
Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid
则说明两台机子时间不一致,更改时间后正常
在这里插入图片描述
在manager上
注:当node1的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上
修改状态:
docker node update --availability active node
docker node update --availability drain node
在这里插入图片描述
例:以nginx
1、 创建网络
[root@manager ~]# docker network create -d overlay nginx_net
创建一个overlay网络(overlay允许不同机器上的容器相互通信,同时支持对消息进行加密,建立容器之前先创建一个overlay的网络,用来保证在不同主机上的容器网络互通的网络模式,当我们初始化一个swarm或是加入到一个swarm中时,使用overlay网络,防火墙要求TCP端口2377,用于集群管理信息的交流、TCP、UDP端口7946用于集群中节点的交流、UDP端口4789用于overlay网络中数据报的发送与接收)
在这里插入图片描述
2、 创建一个只有一个副本的服务,使用nginx镜像
[root@manager ~]# docker service create --replicas 1 --network nginx_net --name my_nginx -p 8080:80 nginx
在这里插入图片描述
注:–replicas 参数指定服务由几个实例组成
在这里插入图片描述
查看容器
在这里插入图片描述
将副本更新为两个
[root@manager ~]# docker service update --replicas 2 my_nginx
在这里插入图片描述
在这里插入图片描述
在node节点上即可查到该容器
在这里插入图片描述
目录挂载
(1) 创建挂载目录
[root@manager ~]# docker volume create --name testvolume
[root@manager ~]# docker volume ls
[root@manager ~]# docker volume inspect testvolume
在这里插入图片描述
挂载
[root@manager ~]# docker service create --replicas 2 --mount type=volume,src=testvolume,dst=/root --name test_nginx nginx

docker service create --mount type=bind,target=/container_data/,source=/host_data/

挂载并使用网络
docker service create --replicas 1 --mount type=bind,target=/usr/share/nginx/html/,source=/opt/web/ --network nginx_net --name zjz_nginx -p 8880:80 nginx

查看加入manager的令牌
[root@manager ~]# docker swarm join-token manager
在这里插入图片描述
通过docker-compose文件部署服务
[root@manager ~]#docker stack deploy -c docker-compose.yml deploy_deamon

为了可以使用swarm的覆盖网络,在启用swarm模式之间你需要在swarm节点之间开放以下端口:
TCP/UDP端口7946 – 用于容器网络发现
UDP端口4789 – 用于容器覆盖网络

创建overlay网络
[root@manager ~]#docker network create --driver overlay --opt encrypted --subnet 192.168.1.0/24 ngx_net
在这里插入图片描述
–opt encrypted 默认情况下swarm中的节点通信是加密的。在不同节点的容器之间,可选的–opt encrypted参数能在它们的vxlan流量启用附加的加密层。
–subnet 命令行参数指定overlay网络使用的子网网段。当不指定一个子网时,swarm管理器自动选择一个子网并分配给网络

获取虚拟IP
[root@manager ~]# docker service inspect --format=’{{json .Endpoint.VirtualIPs}}’ my_nginx
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/73935
推荐阅读
相关标签
  

闽ICP备14008679号