ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Linux系统安装 docker 容器及部署项目
[打印本页]
作者:
温锦文欧普厨电及净水器总代理
时间:
2024-8-14 17:22
标题:
Linux系统安装 docker 容器及部署项目
目录
一、docker 是什么?
二、为什么要用 docker ?
1、 系统情况不同等
2、 隔离性
三、Linux 系统安装docker容器
1、 卸载旧版(可选)
1.1 停止 docker 服务
1.2 检察已经安装的docker软件包
1.3 卸载已经安装的docker软件包
1.4 删除 Docker 数据和设置文件
2、安装预备
2.1 检察系统版本
2.2 检察系统版本内核
2.3 设置docker镜像源
2.4 提前在本地创建软件包索引缓存,以此来提高搜刮和安装软件的速度
2.5 yum 包更新到最新
2.6 安装指定工具包
3、 安装docker社区版
3.1 安装命令
3.2 centos7 启动 docker 服务
编辑
3.3 设置加快器【https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors】
3.4 设置开机自启
4、 测试安装
5、常用命令
6、 开机报错办理
6.1 报错:
四、Docker 网络
1、 容器与宿主机互连
docker exec -it 运行容器的名称 ping 宿主机ip ap01 172.17.0.2 ap02 172.17.0.3
2、 容器与容器互连
2.1 默认情况下,docker容器之间都是通过IP互连的,但是容器IP会改变(重启,停止等操作)
2.2 通过容器别名进行连接
2.3 基于安全思量,可以通过 vim /etc/docker/daemon.json 在末尾添加设置【阻断容器之间的默认连通(所有容器之间都不能互通)】
3、容器与外部相连
4、自定义网络【将差别的容器参加到同一个自定义网络中,可以实现容器之间自动开启别名互连】
4.1 检察自定义网络
4.2 检察使用本网络的详情
4.3 创建自定义网络
4.4 使用自定义网络
4.5 删除自定义网络【必须确保网络未被使用过】
5、端口映射
5.1 运行时指定端口
5.2 修改端口映射 5.2.1 停止 docker 服务
5.2.2 修改“hostconfig.json”
5.2.3 重启docker及服务
5.3 检察镜像端口映射
5.4 防火墙问题
5.4.1 开放指定端口
5.4.2 停止并禁用防火墙【不安全】
五、Docker 容器部署项目(Mysql数据库、Java、nginx服务)
1、创建专用网络【方便容器之间使用别名进行连接】
2、构建 mysql 服务器镜像
2.1 预备工作
2.2 构建脚本【Dockerfile文件】
2.3 执行构建
2.4 运行容器【命令两种展示方式,命令一样,但是偶尔会出现方法一运行后立即停止的情况,可以使用命令二】
3.构建后端服务器镜像
3.1 预备工作
3.2 构建脚本【Dockerfile】
3.3 执行构建
3.4 运行容器【命令两种展示方式,命令一样,但是偶尔会出现方法一运行后立即停止的情况,可以使用命令二】
4、部署nginx服务(前端)
4.1 预备工作
4.2 构建脚本【Dockerfile 文件】
4.3 执行构建
4.4 运行容器
六、Docker compose 编排技能
1、为什么使用 Docker compose 编排技能?
2、安装
2.1 安装 Docker 引擎时附带 docker-compose 插件
3、测试安装结果
4、设置所需文件
4.1 创建目录用于存放 docker-compose 的设置
4.2 创建并编写 docker-compose.yml 文件【文件为 json 格式】
5、docker-compose 常用命令
(文章来自一个前端开辟的研究,代码(命令)是颠末反复测试的,理论知识是自己浅薄的认知(也有借鉴其他文章),共同砚习)
一、docker 是什么?
docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的步伐放在docker中。
二、为什么要用 docker ?
1、 系统情况不同等
本地开辟正常,服务器正常,但是测试情况(大概其他情况)出问题
docker把操作系统,jdk,tomcat,代码,设置全部放到集装箱里.再打包放到鲸鱼上,由鲸鱼给我们送到服务器上,在开辟职员的呆板上怎么运行,在别的呆板上也怎么运行.不会有任何的问题.一句话就是docker办理了运行情况不同等所带来的问题。
2、 隔离性
docker 是沙箱逻辑,每个系统的设置都是独立的,互相之间不受影响
三、Linux 系统安装docker容器
注:如果报错 “/var/run/yum.pid 已被锁定,PID 为 10853 的另一个步伐正在运行。”
缘故原由是上次使用yum命令之后还没有结束历程。每个历程启动之后都会默认在/var/run目录生产pid文件。删撤除就可以继续使用了。
# 删除yum.pid文件
rm -rf /var/run/yum.pid
复制代码
1、 卸载旧版(可选)
1.1 停止 docker 服务
systemctl stop docker
复制代码
1.2 检察已经安装的docker软件包
yum list installed | grep docker
复制代码
1.3 卸载已经安装的docker软件包
# 以 docker* 开头
# -y 避免后面重复确认
yum remove containerd.io.x86_64 docker* -y
复制代码
1.4 删除 Docker 数据和设置文件
# 存放容器)镜像)网络)卷的配置
rm -rf /var/lib/docker
# 管理 Docker 容器生命周期的组件(Docker容器的运行环境)
rm -rf /var/lib/containerd
# docker 的配置文件
rm -rf /etc/docker
复制代码
2、安装预备
2.1 检察系统版本
cat /etc/centos-release
复制代码
2.2 检察系统版本内核
uname -a
复制代码
2.3 设置docker镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
复制代码
2.4 提前在本地创建软件包索引缓存,以此来提高搜刮和安装软件的速度
yum makecache fast
复制代码
2.5 yum 包更新到最新
yum update
复制代码
2.6 安装指定工具包
yum install -y yum-utils device-mapper-persistent-data lvm2
复制代码
3、 安装docker社区版
3.1 安装命令
# ce为免费的社区版
# docker-ce-cli 是Docker Engine 的命令行界面
# containerd.io 是容器运行的基本组件,负责管理容器的生命周期
yum install -y docker-ce docker-ce-cli containerd.io docker~build-plugin docker-compose-plugin
复制代码
3.2 centos7 启动 docker 服务
关闭防火墙
systemctl stop firewalld
禁止防火墙开机自启动
systemctl disable firewalld
启动docker
systemctl start docker
查询当前状态
systemctl status docker
复制代码
运行时的状态:
停止的状态:
3.3 设置加快器【https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors】
网址进入阿里云的控制台,找到“镜像加速器”=>"CengOS"复制配置项
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6vfewj39.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
复制代码
3.4 设置开机自启
systemctl enable docker
systemctl start docker
复制代码
4、 测试安装
查看版本号(可以查看是否安装了docker 容器)
docker -v
查看 docker-compose 版本
docker compose version
拉取镜像
docker pull hello-world
启动容器
docker run hello-world
输出 Hello from Docker! 说明成功
复制代码
5、常用命令
拉取镜像:
docker pull 镜像名称:版本
如果不指定版本,则拉取最新版本
运行镜像:
docker run -itd --name 运行的名称 镜像名称
# --link 运行的名称:镜像别名(可以直接修改镜像的hosts映射)(/etc/hosts)
docker run -itd --name 运行的名称 --link 运行的名称:镜像别名 镜像名称
查看运行的容器:
docker ps
查看历史运行容器:
docker ps -a
停止容器运行:
docker stop 运行的名称
删除容器(如果镜像名称有且只有一个,就可以使用ID删除,如果有多个,就要使用"镜像名称:版本号"进行删除)
docker rmi -f 镜像ID/镜像名称 rmi 镜像名称/镜像名称:版本号
删除历史容器(运行中/已停止)
docker rm 容器名称
删除已经停止的容器
docker container prune
进入运行容器执行命令
docker exec -it 运行的名称
查看运行容器ip地址
docker exec -it 运行的名称 hostname -i
进入运行容器查看内部数据:
docker exec -it 运行的名称 bash
进入容器内部后退出
exit
# 查看本地镜像
docker images
表头说明:
REPOSITORY:镜像名称
TAG:镜像版本 latest指最新版
IMAGE ID:镜像ID(删除时会用到)
CREATED:创建时间
SIZE:镜像大小
# 搜索镜像(docker search 镜像名称)(自动到 docker hub 上查询)
docker search nginx
(搜索展示的结果没有版本号,想要下载具体的版本,到docker hub 上查询具体版本)
表头说明:
NAME:镜像名称
DESCRIPTION:描述信息
STARS:点赞数
OFFICIAL:是否为官方团队维护
# 拉取镜像(没有版本号默认拉取最新版)
docker pull nginx
# 删除镜像(如果镜像名称有且只有一个,就可以使用ID删除,如果有多个,就要使用"镜像名称:版本号"进行删除)
docker rmi 镜像ID / docker rmi 镜像名称:版本号
# 查看所有的镜像列表
docker images -q
# 删除所有镜像(轻易不要用)
docker rmi `docker images -q`
复制代码
6、 开机报错办理
6.1 报错:
报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
原因:docker容器没有启动
解决:运行命令启动 docker
systemctl start docker
复制代码
四、Docker 网络
1、 容器与宿主机互连
docker exec -it 运行容器的名称 ping 宿主机ip
ap01 172.17.0.2
ap02 172.17.0.3
2、 容器与容器互连
2.1 默认情况下,docker容器之间都是通过IP互连的,但是容器IP会改变(重启,停止等操作)
2.2 通过容器别名进行连接
# --link 运行的名称:镜像别名(可以直接修改镜像的hosts映射)(/etc/hosts)
docker run -itd --name 运行的名称 --link 运行的名称:镜像别名 镜像名称
复制代码
2.3 基于安全思量,可以通过 vim /etc/docker/daemon.json 在末尾添加设置【阻断容器之间的默认连通(所有容器之间都不能互通)】
"icc": false
可禁止容器之间的互连,但是可以通过 -- link 方式进行互连,并且不受 icc 方法影响(需要重启生效)
"iptables": true
systemctl restart docker
nginx01 172.17.0.2
nginx02 172.17.0.3
复制代码
3、容器与外部相连
docker exec -it ap01 sh
ping www.baidu.com
复制代码
4、自定义网络【将差别的容器参加到同一个自定义网络中,可以实现容器之间自动开启别名互连】
4.1 检察自定义网络
docker network ls
复制代码
4.2 检察使用本网络的详情
docker network inspect 自定义网络名
复制代码
4.3 创建自定义网络
# --derver:驱动类型,默认 bridge
# --subnet=192.168.1.0/24:网段设置,默认docker0地址向上递增【172.17.0.1-->172.18.0.0】
docker network create [--derver] [--subnet=192.168.1.0/24] 自定义网络名
通过以下命令查询更多参数说明
docker network create --help
复制代码
4.4 使用自定义网络
容器启动时:
docker run --network 自定义网络名 ...
容器启动后:
docker network connect 网络名 容器名
复制代码
4.5 删除自定义网络【必须确保网络未被使用过】
docker network rm 网络名
将容器退出自定义网络
docker network disconnect 网络名 容器名
复制代码
5、端口映射
5.1 运行时指定端口
docker run -itd --name 运行的名称 -p 外部访问端口:容器内部端口 镜像名称
复制代码
5.2 修改端口映射
5.2.1 停止 docker 服务
# 停止后不能进行任何操作,否则会自动重启服务
systemctl stop docker
复制代码
5.2.2 修改“hostconfig.json”
查询容器ID
docker ps
cd /var/lib/docker/containers
cd 容器ID(输入前几位,然后按tab键自动补齐)
vim hostconfig.json
搜索"PortBindings"【进入文件,直接输入/粘贴关键字回车就可以搜索】
# "HostIp":"如果为空,代表容器内部可以使用任意端口进行访问"
# "HostPort":"宿主机端口设置"
"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"81"}]}
复制代码
5.2.3 重启docker及服务
systemctl start docker
docker start 镜像运行的名称
复制代码
5.3 检察镜像端口映射
docker port 运行的名称
docker ps -a 也可以查看,在返回信息的表头 PORTS 字段显示
复制代码
5.4 防火墙问题
5.4.1 开放指定端口
添加指定端口
firewalld-cmd --zone=public --permanent --add-port=80/tcp
重启防火墙
firewalld-cmd --reload
复制代码
5.4.2 停止并禁用防火墙【不安全】
停止防火墙
systemctl stop firewalld
禁止开机自启
systemctl disable firewalld
复制代码
五、Docker 容器部署项目(Mysql数据库、Java、nginx服务)
1、创建专用网络【方便容器之间使用别名进行连接】
docker network create appnet
复制代码
2、构建 mysql 服务器镜像
2.1 预备工作
拉取镜像
docker pull mysql:8.0
创建专用目录
mkdir app/db -p
获取配置文件
【下方所有操作(构建脚本、运行容器)都在该目录下完成】
cd app/db
# 运行一个临时容器,要使用里面的配置文件
docker run --name temp -itd -e MYSQL_ROOT_PASSWORD=123456 mysql
# 复制主配置文件
docker cp temp:/etc/mysql/my.cnf .
# 复制从配置文件
docker cp temp:/etc/mysql/conf.d .
# 删除临时容器
docker rm -f temp
修改字符集
vim my.cnf
[mysql]
default-character-set=utf8mb4
[mysql.server]
default-character-set=utf8mb4
准备初始化脚本init.sql
复制代码
2.2 构建脚本【Dockerfile文件】
# 指定基础镜像
FROM mysql:latest
# 拷贝数据库初始化脚本到指定目录
COPY init.sql /docker-entrypoint-initdb.d
复制代码
2.3 执行构建
docker build -t myappdb .
复制代码
2.4 运行容器【命令两种展示方式,命令一样,但是偶尔会出现方法一运行后立即停止的情况,可以使用命令二】
方法一:
docker run --name appDB -itd \
-p 3306:3306 \
-v ./my.cnf:/etc/mysql/my.cnf \
-v ./conf.d:/etc/mysql/conf.d \
-v ./data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--network appnet \
myappdb
方法二:
docker run --name appDB -itd -p 3306:3306 -v ./my.cnf:/etc/mysql/my.cnf -v ./my.cnf:/etc/mysql/my.cnf -v ./conf.d:/etc/mysql/conf.d -v ./data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --network appnet myappdb
复制代码
3.构建后端服务器镜像
3.1 预备工作
创建专用目录
mkdir app/javaBuild -p
创建后端配置文件
【下方所有操作(构建脚本、运行容器)都在该目录下完成】
cd app/javaBuild
【通过配置文件修改数据库连接信息(账号、密码等),该文件优先级高于项目代理的配置】
vim application.properties
spring.datasource.url=jdbc:mysql://appDB:3306/sql01
spring.datasource.username=root
spring.datasource.password=123456
后端文件打包
idea -> maven -> clean && package -> myapp.jar
复制代码
3.2 构建脚本【Dockerfile】
# 指定基础镜像(因 SpringBoot3 要求jdk17+)
FROM openjdk:11.0
# 工作目录app
WORKDIR /app
# 拷贝jar包
COPY myapp.jar .
# 暴露后端
EXPOSE 8088
# 默认执行jar
CMD ["java","-jar","myapp.jar"]
复制代码
3.3 执行构建
# javaBuild:镜像名
docker build -t javabuild .
复制代码
3.4 运行容器【命令两种展示方式,命令一样,但是偶尔会出现方法一运行后立即停止的情况,可以使用命令二】
# appBackend:容器名
# 8899:8899 宿主机端口:容器端口
# appnet 自定义的网络名
# javaBuild:镜像名
方法一:
docker run --name appServer -itd \
-p 8899:8899 \
-v ./application.yml:/app/application.yml \
--network appnet \
javaBuild
方法二:
docker run --name appServer -itd -p 8088:8088 -v ./application.properties:/app/application.properties --network appnet javabuild
复制代码
4、部署nginx服务(前端)
4.1 预备工作
创建专用目录
mkdir app/nginx/html -p
获取配置文件(启动一个临时的容器,将里面的配置文件复制出来)
【后续操作(从获取配置文件一直到启动容器)都在该目录下进行】
cd app/nginx
# 启动临时的容器
docker run --name temp -itd nginx
# 复制主配置文件
docker cp temp:/etc/nginx/nginx.conf ./nginx.conf
# 复制从配置文件
docker cp temp:/etc/nginx/conf.d .
# 删除临时文件
docker rm -f temp
修改配置文件
vim ./conf.d/default.conf
server{
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri /index.html;
}
location /api/ {
rewrite ^.+api/?(.*)$ /$1 break;
proxy_pass http://appServer:8088;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
复制代码
4.2 构建脚本【Dockerfile 文件】
# 指定基础镜像(nginx)
FROM nginx:latest
# 拷贝前端文件
COPY ./html /usr/share/nginx/html
# 暴露前端宿主机端口8082
EXPOSE 8082
复制代码
4.3 执行构建
# nginxBuild:镜像的名字
docker build -t nginxbuild .
复制代码
4.4 运行容器
# nginx_demo 容器的名字
# -p 8082:80 宿主机端口:容器端口
# --network appnet 加入网络(便于访问) appnet:自定义的网络名
# nginxbuild 镜像名
docker run --name nginx_demo -itd -p 8082:80 -v ./nginx.conf:/etc/nginx/nginx.conf -v ./conf.d:/etc/nginx/conf.d --network appnet nginxbuild
复制代码
六、Docker compose 编排技能
1、为什么使用 Docker compose 编排技能?
使用该技能管理容器,可以简化到使用一条命令敏捷启动内部管理的容器
mysql、java、nginx这几个容器启动需要经历 docker build 和 docker run 命令,三个容器就要执行六次命令,使用 docker compose 管理,一条命令就可以启动三个容器
2、安装
2.1 安装 Docker 引擎时附带 docker-compose 插件
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
或者安装 Docker 引擎后补充安装 docker-compose 插件
yum install -y docker-compose-plugin
复制代码
3、测试安装结果
docker compose version
复制代码
4、设置所需文件
4.1 创建目录用于存放 docker-compose 的设置
mkdir myprj
【后续编辑配置文件和运行项目都在该目录下】
cd myprj
复制代码
4.2 创建并编写 docker-compose.yml 文件【文件为 json 格式】
# 版本信息可以查看网站:https://docs.docker.com/compose/compose-file/compose-versioning/ 找到对应的 docker 版本
version: "3.8"
# 应用程序使用的名字(不指定该属性,则默认使用 yml 文件所在目录名)
# 只能包含小写字母,数字、破折号和下划线,且必须以小写字母或数字开头
name: "myapp"
# 定义应用程序所需的服务集合
services:
# 自定义的服务名
appnginx:
# 打包所需的文件
build: ./nginx
# 端口映射
ports:
# 宿主机端口:容器端口
- "80:80"
# 挂载的文件
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf.d:/etc/nginx/conf.d
# 定义应用程序使用的网络(网络不存在会自动创建)
networks:
- net1
# 依赖的服务
depends_on:
- appbackend
appbackend:
build: ./javaBuild
ports:
- "8088:8088"
volumes:
- ./javaBuild/application.properties:/app/application.properties
networks:
- net1
depends_on:
- appdb
appdb:
build: ./db
ports:
- "3306:3306"
volumes:
- ./db/conf.d:/etc/mysql/conf.d
- ./db/data:/var/lib/mysql
- ./db/my.cnf:/etc/mysql/my.cnf
networks:
- net1
# 环境的配置,通常将数据库名及密码加入其中
# 文件前面加 . 表示该文件在Linux系统中是隐藏的
env_file:
- .mysql_env
# 暴露的端口号
expose:
- "3306"
# 自定义的网络
networks:
net1:
driver: bridge # 默认 bridge 网络模式(可以省略不写)
复制代码
5、docker-compose 常用命令
5.1 docker compose config
含义:验证和显示由 docker-compose.yml 文件定义的服务设置
5.2 docker compose up [-d]
含义:启动应用步伐所需的所有服务。
-d 代表后台运行
5.3 docker compose ps
含义:检察已经启动的容器
5.4 docker compose stop/kill [容器名]
含义:停止已经启动的容器。
kill:逼迫停止容器。
后面加上容器名,代表只停止指定的容器
5.5 docker compose start/restart [容器名]
含义:启动被停止的容器(重启容器)
5.6 docker compose exec 容器名 bash
含义:进入容器
5.7 docker compose logs [-f]
含义:检察服务日志
-f 代表输出实时日志
5.8 docker compose down
含义:用于停止和移除由 docker compose up 创建的容器、网络和卷
七、使用 Docker 容器部署项目,常见问题处理
1、可能会出现宿主机时间(大概容器时间)与系统时间不一样的情况
1.1 描述:
场景:
后端返回的数据中,时间字段与系统时间相差8小时的情况
缘故原由:
我们电脑系统使用的是东八区时间(上海),linux 系统使用的是
1.2 办理:
先查看宿主机的系统时间:
date
# 输出:Sun Jun 30 01:13:33 CST 2024
# 说明系统时间已经是需要的东八区时间,接下来进入容器查看容器时间
启动docker服务(我是通过 docker compose 统一管理项目的)
docker compose up -d
查看容器id
docker compose ps
进入对应容器(为了查询容器时间)
docker exec -it 容器id(或者名称) bash
查询容器时间
date
# 如果容器时间比系统时间晚8小时,说明没有同步
Sat Jun 29 16:53:57 UTC 2024
复制宿主机下面的zoneinfo文件到容器内
docker cp /usr/share/zoneinfo 容器id:/usr/share/
进入对应容器(为了解决时间)
docker exec -it 容器名 bash
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone
再次查询就会同步了
date
重启 docker 容器
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4