docker运维技术总结
docker
**背景**:部署到云端的服务需要相互隔离,让每个服务都运行在独立的容器中,而docker正是当下最流行的容器化技术
**概述**:docker是一个虚拟化平台(docker.com),go语言实现,可以通过虚拟化方式,为应用提供可运行的容器,容器之间相互隔离,独自运行。基于这种方式,我们可以更快地打包、部署和运行应用程序,实现软件的快速交付
**优点**:
1.保证开发环境的一致性 将所有的环境依赖打包到镜像中,通过镜像传输
2.多版本混合部署 每个容器都有自己独立的文件系统,多版本应用同时部署到一台服务器就不会出现文件路径冲突的问题,对于端口冲突问题,只需要在启动容器时指定不同的端口映射即可解决
3.快速搭建内部开发测试环境
将应用程序需要的依赖都固化到docker镜像中,然后在对应的docker容器中进行开发测试,就算环境出问题,只要将当前环境删除,重新启动即可恢复
docker核心对象
镜像(Image)
docker镜像可以看成是磁盘上特殊的文件系统(https://hub.docker.com/),镜像打包了应用程序及其需要的运行环境,是静态的,可以通过docker启动镜像,进而将镜像中的程序在一个容器中启动起来。在镜像中,操作系统不包含内核,容器都是共享所在的宿主机的内核,所以说容器只包含必要的操作系统(通常只有操作系统文件和文件系统对象),可以暂时将镜像理解为一个安装程序
容器(container)
容器可以理解为运行镜像的载体,容器基于镜像创建、启动,然后运行镜像中的文件。当你的应用成功在docker运行时,这个应用就是容器化应用。docker启动一个容器需要先启动其所在的镜像,然后启动容器,进入容器,启动的容器相当于一个进程
docker应用架构分析
docker是一种ClientServer架构的应用程序
- docker Client是安装完docker之后,直接使用的docker命令
- Docker Host 是docker的宿主机(安装docker的操作系统)
- Docker Daemon 是docker后台守护进程,处理docker客户端命令
- Registry 是docker拉取镜像的远程仓库,其提供了大量的镜像供下载,下载完成之后保存在Images中
- Images 是docker本地的镜像仓库,可以通过
docker images
命令查看镜像文件
Docker运行机制
docker pull 执行过程:
1.客户端将指令发送给docker deamon
2.docker daemon 先检查本地images中有没有相关镜像
3.如果本地没有,则向镜像服务请求,将远程镜像下载到本地
docker run执行过程
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统(简版Linux)并在制度镜像层外面挂载一层可读写层
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个ip地址给容器
- 执行用户指定的应用程序
Docker 安装实践
准备工作
第一步:准备CentOS
第二步:基于vmware打开CentOS
第三步:克隆CentOs(选择链接克隆,更节省空间,命名为CentOS-docker)
第四步:开启虚拟机 (用户名/密码:root)
第五步:右键->打开终端->ifconfig 查找虚拟机的ip
第六步:通过MobaXterm工具链接虚拟机系统
2:虚拟机的ip,3:root
密码:root
离线安装Docker系统
推荐使用课前资料中已经下载好的资源(docker-setup.zip),也可以按如下步骤自己下载,然后将资源放到一个目录再安装,
第一步:下载docker离线包
https://download.docker.com/linux/static/stable/x86_64/docker-20.10.6.tgz
说明,也可以从https://download.docker.com/linux/static/stable/网址下载指定版本
第二步:下载离线安装工具
https://github.com/Jrohy/docker-install/
第三步:将下载好的这个工具解压放在一个目录,例如:
第四步:在linux环境下,创建/root/setup/docker目录,然后拷贝下载好的资源到此目录(可通过MobaXterm工具直接上传到linux目录),例如
第五步:执行安装操作
# 进入/root/setup/docker 文件夹
cd /root/setup/docker
# 为 install.sh添加执行权限
chmod +x install.sh
# 安装
./install.sh -f docker-20.10.6.tgz
安装成功后,会出现如下信息:
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
docker 20.10.6 install success!
第六步:安装成功以后,检查安装状态
docker info
在线安装Docker
第一步:安装一组工具
sudo yum install -y yum-utils
第二步:设置 yum 仓库地址
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第三步:更新 yum 缓存
sudo yum makecache fast #yum 是包管理器
第四步:安装新版 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
Docker 服务基本操作
1.启动docker服务
systemctl start docker
2.查看docker状态 (可以查看docker是否启动)
systemctl status docker
3.重新启动docker服务
systemctl restart docker
4.设置docker开机自启
systemctl enable docker
5.禁用docker开机自启
systemctl disable docker
6.查看docker 信息
docker info
查看docker info中具体key的信息
docker info | grep ‘Docker Root Dir:’
7.停止docker服务
systemctl stop docker
Docker镜像加速
由于国内网络问题,需要配置加速器来加速。修改配置文件 /etc/docker/daemon.json
下面命令直接生成文件 daemon.json
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"data-root": "/var/lib/docker"
}
EOF
说明:在执行如上指令时,保证你的登录用户为root管理员用户,并且设置好以后重启docker服务.
Docker镜像操作实践
1.下载镜像
docker pull hello-world
2.浏览镜像文件
docker inspect hello-world
3.查看镜像历史
一个镜像是由多个层(layer)组成的,那么,我们要如何知道各个层的具体内容呢?通过 docker history 命令,可以列出各个层(layer)的创建信息,例如:
docker history hello-world
4.导出镜像文件
镜像导出(linux系统中的镜像文件下载到本地-例如window),导出后给他人使用
docker save hello-world | gzip > hello-world.tar.gz
5.删除镜像文件
语法:docker image rm 镜像名或镜像id
docker image rm hello-world
6.导入镜像操作
镜像导入(要在hello-world.tar.gz 文件所在目录下执行)
docker load < hello-world.tar.gz
7.运行镜像文件
基于镜像,启动容器运行。
docker run hello-world
Docker 容器操作实践
1.下载镜像(Image)
docker pull centos:7
2.下载完以后,查看centos7镜像文件。
docker images
3.创建并启动容器(Container)
docker run -it xxxx bash
其中:
1)xxxx - 镜像名, 或 image id 的前几位,
2)-it 这是两个参数(-i表示交互式操作, -t 表示终端)
3) bash 表示进入操作终端,基于交互式进行相关操作(例如执行linux相关指令)。
案例:通过docker启动运行 centos7镜像
docker run -it centos:7 bash
4.查看Docker中的容器(Container)
# 查看docker运行中的容器(要在宿主机执行docker指令)
docker ps
# 查看docker运行中的所有容器
docker ps -a
5.查看容器日志(logs)信息
docker container logs 802 #802为自己的容器id(一般写前三位即可)
说明,查看容器的运行日志时,容器应该处于一种运行状态.
6.停止(stop)或重启(Restart)容器(Container)
docker container stop 802 #802为容器自己的id
docker container restart 802 #802位容器自己的id
7.进入(exec)指定容器(Container)
docker exec -it 802 bash #802为容器id
8.从容器(Container)中退出(exit)
exit
9.删除(rm)容器(Container)
docker container rm 802 #802为容器id
假如容器正在运行执行删除,会出现如下问题
如果删除运行中的容器,需要添加 -f 参数执行强制删除
docker container rm -f 802 #802为容器id
10.清理所有处于终止状态容器
docker container prune
Docker数据管理实践
在容器中管理数据主要有两种方式:
- 数据卷(Volumes)
- 挂载主机目录 (Bind mounts)
数据卷:
数据卷是一个可供一个或多个容器使用的特殊目录,可以在容器之间共享和重用,默认会一直存在,即使容器被删除
数据卷操作
第一步:创建数据卷
docker volume create container-vol
第二步:查看所有数据卷
docker volume ls
查看指定 数据卷 的信息
docker volume inspect container-vol
第三步:启动挂载数据卷的容器
docker run -it --mount source=container-vol,target=/root centos:7 bash
# 或者采用如下简写方式
docker run -it -v container-vol:/root centos:7 bash
-v container-vol:/root :把数据卷 container-vol 挂载到容器的 /root 目录
第四步:删除数据卷(如果数据卷被容器使用则无法删除),
docker volume rm container-vol
清理无主数据卷
docker volume prune
挂载主机目录
在启动容器时,目录直接挂载的方式进行数据操作
docker run -it -v /usr/app:/opt/app centos:7 bash
其中:
1)/usr/app:为宿主机目录
2)/opt/app: 为启动容器的一个目录
3)-v 用于指定挂载目录,如果本地目录(宿主机目录)不存在, Docker 会自动为你按照挂载目录进行目录的创建。
1.查看挂载目录信息
docker inspect 91a #91a 为容器id
Dockerfile及镜像制作实践
我们基于docker pull指令可以从远程仓库下载我们需要的一些镜像(image),加入远程仓库没有我们需要的镜像,我们就要自己创建,下面是自己如何制作镜像.
镜像制作分析
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。我们通常会基于此文件创建docker镜像,例如:
制作JDK镜像
准备工作
-
centos:7镜像 (所有的镜像文件创建时都需要有一个空的centos镜像,就类似通过一个空的光盘或u盘创建一个系统启动盘是一样的)
-
jdk压缩包 jdk-8u51-linux-x64.tar.gz(可以从课前资料获取),基于此压缩包,制作jdk镜像。
第一步: 创建setup->jdk目录 :JDK 拷贝的目录
第二步: 创建Dockerfile文件
在创建新的镜像时都需要有一个Dockerfile文件(文件名一定要注意大小写),这个文件中定义镜像制作过程。1. 进入jdk-8u51-linux-x64.tar.gz文件所在目录,基于vim创建Dockerfile文件。 vim Dockerfile 2. 按键盘上的"i"进入编辑模式 3. 拷贝如下代码到你的Dockerfile中
FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 \
PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH
CMD ['bash']
5.拷贝完成,按ESC进入命令行模式(又叫最后一行模式)
6.然后按shift+冒号,输入wq保存退出.目录结构如下:
第三步: 创建JDK镜像文件
在Dockerfile所在目录执行docker build指令.
docker build -t jdk:8 . #不要丢掉这里的点,-t表示镜像标识(镜像名),是tag单词的缩写.
注意末尾的点,表示构建过程中从当前目录寻找文件,jdk:8为我们创建的镜像名。
第四步: 运行JDK镜像(image)文件
在宿主机中执行如下指令,启动JDK容器,
docker run -it jdk:8 bash
第五步: 进入容器以后,可以通过echo $PATH查看环境变量(注意单词大小写),并可以通过java –version查看JDK版本信息
基于JDK镜像启动sentinel
JDK镜像创建以后,如何通过此镜像运行一个web服务
第一步: 将sentinel拷贝宿主机指定目录,例如/root/servers目录(servers目录不存在可以自己创建)。
第二步: 启动镜像容器,通过java执行运行web服务
基于jdk:8镜像启动运行sentinel服务(服务启动后可在宿主机通过localhost:8180进行访问)
docker run -d -p 8180:8080 --name sentinel \
-v /root/servers:/usr/sca \
jdk:8 java -jar /usr/sca/sentinel-dashboard-1.8.1.jar
其中:
-d 表示后台运行
-p 用于实现端口映射(假设外部要访问这个容器,必须要做端口映射)
–name 表示为启动的容器起一个名字
服务启动后可通过docker ps 指令查看启动的服务,假如看不到服务,可能服务启动失败,可通过如下指令查看具体日志
docker container logs 689 #这里689为容器id,也可以为你的容器名
我们访问sentinel服务时需要通过宿主机进行访问,不可以直接访问,所以要做端口映射,
第三步: 打开浏览器,访问sentinel服务.
在windows中打开浏览器,输入你的ip地址(这个ip为远端宿主机的ip地址),端口号为宿主机的端口号
制作Sentinel镜像
准备工作
centos:7镜像(课前资料中的)
jdk-8u51-linux-x64.tar.gz(可以从课前资料获取)
sentinel-dashboard-1.8.1.jar
通过docker images指令查看centos:7是否存在,然后将 jdk-8u51-linux-x64.tar.gz,sentinel-dashboard-1.8.1.jar放在/root/setup/sentinel目录(目录不存在的话自己创建)
构建Sentinel镜像
第一步: 在sentinel所在目录创建Dockerfile文件,并添加如下内容
FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/
ADD sentinel-dashboard-1.8.1.jar /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \
PATH=/usr/local/jdk1.8.0_51/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.1.jar"]
其中,EXPOSE表示对外暴露的服务端口,ENTRYPOINT中写的是你容器启动时候要执行的指令.
第二步: 使用 Dockerfile 构建镜像(在Dockerfile所在目录执行docker指令)
docker build -t sentinel:8 . #不要丢掉这里的点
第三步: 后台运行sentinel容器
docker run -d --name sentinel8181 -p 8181:8080 sentinel:8 #-d 表示后台运行,-p用于指定端口映射,sentinel:8为镜像文件名
第四步: 查看sentinel容器
docker ps
第五步: 访问sentinel服务
可以在window中访问时你的linux系统中启动的sentinel服务,ip地址应该为宿主机的ip地址,端口号为宿主机的端口号
Docker 镜像安装实践
安装MySql数据库
第一步: 在hub.docker.com上搜索mysql镜像
第二步: 拉取指定版本的mysql,也可以指定拉取版本
docker pull mysql:8.0.23
第三步: 检查mysql镜像
docker images
第四步: 启动运行mysql镜像 (docker run 用于启动一个容器)
sudo docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0.23
注意:假如安装过程中失败了,则可通过docker ps -a 查看以前的容器,假如已存在,则通过docker rm 镜像id 删除再重新安装即可。
登陆mysql服务
第一步: 进入容器 (退出容器用exit)
sudo docker exec -it mysql bash
第二步: 登陆(默认密码root),一定要先进入mysql容器。
mysql -uroot -proot
停止和启动mysql服务
docker stop mysql
docker start mysql
# 设置mysql开机自启动(可选
docker update mysql --restart=always
安装Redis数据库
第一步: 下载镜像文件
docker pull redis
第二步: 准备配置文件
mkdir -p /usr/local/docker/redis01/conf
在配置文件录下创建redis.conf配置文件(这个文件一定要创建,否在我们进行目录挂载时默认生成的是一个目录)
touch /usr/local/docker/redis01/conf/redis.conf
第三步: 创建redis实例并启动
sudo docker run -p 6379:6379 --name redis01 \
-v /usr/local/docker/redis01/data:/data \
-v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
第四步: 查看正在运行的进程
docker ps
访问redis服务器
第一步: 控制台直接连接redis测试
docker exec -it redis01 bash
第二步: 检测redis 版本
redis-server -v
redis-cli -v
第三步: 登录redis(默认不需要密码)
redis-cli
或者直接将上面的两个步骤合为一个步骤执行也可以,指令如下:
docker exec -it redis01 redis-cli
停止、启动、重启redis服务
docker stop redis01
docker start redis01
docker restart redis01
安装Nginx代理
第一步: 拉取nginx镜像 (从这里hub.docker.com去查找)
docker pull nginx
#或者直接将nginx的tarz压缩包放到image目录下,直接load
第二步: 查看images镜像
docker images
第三步: 创建数据卷(这个对象会在宿主机直接创建一个目录)
docker volume create nginx-vol
说明:查看数据卷对应的宿主机目录,可以通过如下指令:
docker inspect nginx-vol
第四步: 启动nginx服务
docker run --name nginx -p 80:80 -v nginx-vol:/etc/nginx -d nginx
其中:/etc/nginx 为nginx容器启动时,nginx镜像文件默认的解压目录
注意:假如以后想修改nginx配置,可以直接去nginx-vol数据卷对应的目录去修改.
访问nginx服务
停止,开启,重启nginx服务
docker stop nginx
docker start nginx
docker restart nginx
安装Nacos组件
第一步: 拉取nacos(hub.docker.com)
docker pull nacos/nacos-server:1.4.1
第二步: mysql中执行nacos的sql脚本文件
- 将此文件nacos-mysql.sql(这个文件可从code服务器下载)拷贝到mysql容器的宿主机对应的挂载目录(可通过docker inspect mysql查看你mysql的挂载目录)
- 在linux环境下启动并登录mysql
进入mysql容器(前提是mysql已启动)
docker exec -it mysql bash
登录mysql
mysql -uroot -p
- 通过source指令运行容器目录下的sql文件
source /etc/mysql/nacos-mysql.sql #这里的/etc/mysql为容器中的一个目录(要选择你自己挂载的目录)
第三步: 创建并启动nacos容器(拷贝下面内容时,账号和密码要用自己宿主机ip,自己数据库的账号密码)
docker run \
-e TZ="Asia/Shanghai" \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_DATABASE_NUM=1 \
-e MYSQL_SERVICE_HOST=192.168.126.129 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-p 8848:8848 \
--name nacos \
--restart=always \
-d nacos/nacos-server:1.4.1
参数说明:
单节点模式 :MODE=standalone
数据库地址:MYSQL_SERVICE_HOST
数据库用户名:MYSQL_SERVICE_USER
数据库密码:MYSQL_SERVICE_PASSWORD
需连接的数据库名称:MYSQL_SERVICE_DB_NAME
端口映射:-p 8848:8848
任意时候重启容器,开机就能自动启动容器(需设置docker为开机自启)
--restart=always
第四步: 检查nacos服务
docker ps
假如启动失败,检查启动日志,例如
docker container logs nacos
访问nacos服务
Nacos 与 MySQL 通讯分析
停止启动重启nacos服务
docker stop nacos
docker start nacos
docker restart nacos
Docker 容器互联实践
概述
Docker 中存在多个容器时,容器与容器之间经常需要进行通讯,例如nacos访问mysql,redis集群中各个节点之间的通讯。
解决方案
Docker 中容器与容器之间进行通讯的解决方案一般有两种:
第一种:两个容器通过宿主机进行通讯(容器中的端口会映射到宿主机上)
第二种:两个容器之间直接通过虚拟网络进行连接,但是需要我们在docker中创建网络。
初始化网路
架构设计
新建网络
docker network create -d bridge t-net #t-net为自己起的网络名称
其中,-d driver,网络类型,默认 bridge。
创建好这个网络以后,在网络上添加容器,容器就可以通讯了
查看网络信息
列出所有网络
docker network ls
查看网络信息
docker inspect 67d #67d 为创建的网络id
实现容器互联
创建容器
打开终端,基于centos:7这个镜像启动容器,并加入到t-net这个网络
docker run -it --name app1 --network t-net centos:7
新开终端执行,基于centos:7这个镜像再启动容器,同时也加入到t-net网络
docker run -it --name app2 --network t-net centos:7
测试网络互通 互相ping
ping app1
ping app2
显示如下:
[root@35569c623c4c /]# ping app1
PING app1 (172.18.0.2) 56(84) bytes of data.
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=1 ttl=64 time=0.577 ms
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=3 ttl=64 time=0.066 ms
......