docker的认识

本文介绍了项目在不同环境中运行的问题,重点阐述了Docker的概念,包括其基于Go语言的实现、云应用管理、容器化部署的优势,以及如何通过Docker解决环境差异、安装、镜像和容器操作、数据卷、网络配置和多服务部署示例,如MySQL、Tomcat和Redis的部署与连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念和理解

一个项目的生成,需要经历几个不同环境,也就是一个项目需要经过好几个环境的运行

开发环境测试环境再到生产环境(运行环境/实际应用环境)

 而这几个环境都不一样,所以项目运行会造成项目出错,或者项目不能运行

 解决问题的办法就是,将开发环境一起打包送到测试服务器上运行,不需要管测试服务器上的环境,最后没有bug再放到应用服务器上

 Docker的概念

Docker就是基于Go语言实现的云开项目

Docker的主要目标就是 Build,Ship and Run Any App,Anywhere(意思就是一次编译(镜像),到处运行)也就是通过对应用组件的封装,分发,部署,运行等生命周期的管理,使用户的APP以及其运行环境能够做到 一次镜像,到处运行

 LInux容器技术的出现就解决了这样一个问题,而Docker就是在他的基础上发展过来的,将应用打包成镜像,通过镜像成为运行在Doker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台性,跨服务器,只需要一次配置好环境,换到别的服务器上也可以一键部署好,极大的简化了操作

 Docker借鉴了集装箱的概念,表示这些集装箱一样的应用,可以被鲸鱼一样的docker,运送到各种海洋(服务器)使用

安装Docker

# 1、yum包更新到最新
yum  -y update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功  会默认为最新版本,需要在后年设置版本号
docker -v

 docker镜像(image)就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器

容器(Container):Docker利用容器独立运行的一个或一组应用,就像是java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体,容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开启、停止、删除、每个容器都是相互隔离,保证安全的平台

仓库(Repository)是集中存放镜像文件的场所

类似于

Maven厂库,存放各种jar包的地方

github仓库,存放各种git仓库的地方

Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方

仓库分为公开仓库(PUblic)和私有仓库(Private)两种形式

最大的公开仓库是Docker Hub(https://hub.docker.com/),

存放了数量庞大的镜像供用户下载,国内的公开仓库包括阿里云、网易云

1.配置Docker镜像加速器

默认情况下,将来从dcoker hub(https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:

USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)

==阿里云== 网易云

腾讯云

 2.Docker常用命令

2.1 Docker服务相关命令

启动docker服务 systemctl start docker

停止docker服务 systemctl stop docker 重启docker服务 systemctl restart docker

查看docker服务状态 systemctl status docker

开机启动dockeh服务 systemctl enable docker

查看docker命令帮助文档: docker 具体命令 --help

 2.2Docker镜像相关的命令

 查看镜像:

docker images

查看远程仓库的镜像:

docker  search redis

 拉取镜像到本地

 docker pull 【镜像名】:【版本号】 ---如果没有则指定为最新版本

删除本地镜像

docker  rmi 【镜像名】:【版本号】

docker rmi   【镜像的id】

帮助命令

docker  【命令】--help

 2.3docker容器相关的命令

运行容器

docker run -it --name=【容器名】 【系统号】  /bin/bash

-i 保持容器一直运行,因为容器没有客户端链接胡自动关闭

-t 给容器分配伪终端接收命令

--name  给容器起名字

cenost:7 镜像加版本号

/bin/bash 进入容器的初始化指令,这里相当于是到打开一个窗口

exit:退出容器 ---  关闭当前容器

ctrl+q+p:退出容器---不会关闭容器

查看本地容器

dockers ps -- 查看运行的容器

docker pa -a  --查看所有的容器

进入容器--运行的容器

docker exec -it  【容器id】|【容器名】  /bin/bash

exit     // 他不会关闭容器

启动一个容器

docker start  【容器id】| 【容器名】

关闭容器

docker stop 【容器id】|【容器名】

删除容器

docker rm 【容器id】|【容器名】   //删除的为停止的容器

docker rm -f 【容器id】|【容器名】 //强制删除容器

查看容器的日志

docker logs  【容器id】|【容器名】

3.容器的数据卷

3.1数据卷的概念和作用

当docker容器被删除后,容器中的数据还能存在吗?

docker容器和外部机器可以直接交换文件吗?

容器之间可以进行数据交互吗?

数据卷的概念

数据卷是宿主机中的一个目录或文件

当容器目录和数据目录绑定后,对方的修改会立即同步

一个数据卷可以被多个数据同时挂载

一个容器也可以挂载多个数据卷

作用:

解决数据持久化问题

解决外部机器和容器的间接通讯问题

解决容器之间的数据交换

3.2配置数据卷

volume

创建启动容器时,使用-v参数 设置数据卷

docker run     -v 【宿主机目录(文件)】:【容器内目录(文件)】

 注意事项:

1、目录必须是绝对路径

2、如果目录不存在,会自动创建

3、可以挂载多个数据卷

===宿主机容器卷中的内容发生改变对应容器内中的目录页跟着改变===

4、删除容器后,子啊此开启容器并挂载容器卷。数据依然存在

5、多个容器挂载多个容器卷

4、Docker应用部署

4.1Docker安装mysql

 容器内部的网络服务器和外部机器不能直接通信

外部机器和宿主机可以直接通信

就像是,1(外部ip)和2(宿主机)相连接,2(宿主机)和3(宿主机的内部容器)相连接,但是1不能直接连接3,

所以容器中的网络服务需要直接连接到外部机器时,可以将容器中提供服务的端口应黑色到宿主机的端口上,外部(1)服务器,访问宿主机时(2)时,就可以间接的通过宿主机访问容器端口号(3) 这个操作就叫:端口映射

从远程仓库拉取mysql镜像

docker pull mysql:5.7

4.2运行mysql容器

docker run -id --name= 容器名 -p 【 宿主机端口】 :【 容器的端口】  -e
MYSQL_ROOT_PASSWORD=【 密码】 【镜像名:端口号

    == -p  :表示宿主机的端口和容器内部端口映射

    == -e  :表示环境设置

4.3 外界navicat连接mysql容器

如果删除容器后,容器内部的数据是否还存在,必须使用数据卷

docker run -id -p 3308:3306 -v
/app/mysql/log:/var/log/mysql -v
/app/mysql/data:/var/lib/mysql -v
/app/mysql/conf:/etc/mysql/conf.d -e
MYSQL_ROOT_PASSWORD=123456 --name=mysql70 mysql:5.7
-p 3307:3306 将 宿主机的端口号,和容器的端口号做一个映射
-v $PWD/conf:/etc/mysql/conf.d :将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf 配置目录
-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录

删除容器后,再创建容器,绑定原来的主机

4.2Docker安装tomcat

5.1拉取镜像

docker  pull

5.2运行容器

docker run -id --name=t01 -p 8088:8080 tomcat:9.0
创作
t01:容器的名车名称
8088:外部访问接口
8080:内部泄露的接口

5.3测试

主机ip:8088

如果出现以下情况

原因是:tomcat容器内部没有webapps目录

docker exec -it t01 /bin/bash

删掉现在的webapps目录

rm -rf  webapps

再次使用IP地址测试

4.3Docker安装redis

docker run -id --name=redis6 -p 6380:6379
redis:6.0.20

连接redis --window图形化界面

4.4Docker配置Nginx镜像

搜索镜像(可写可不写)

docker search nginx

拉取nginx镜像

docker pull nginx

创建容器,设置端口映射,目录映射

在/root目录下创建nginx目录用于存储nginx数据信息


mkdir ~/nginx

cd  ~/nginx

mkdir conf

cd conf

在~/nginx/conf下创建nginx

vi nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
 worker_connections  1024;
}


http {
 include       /etc/nginx/mime.types;
 default_type  application/octet-stream;

 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

 access_log  /var/log/nginx/access.log  main;

 sendfile        on;
 #tcp_nopush     on;

 keepalive_timeout  65;

 #gzip  on;

 include /etc/nginx/conf.d/*.conf;
}

配置映射关系

docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx

-p 80:80 将主机的80端口连接到容器的80端口

(如果出现错误无法访问,可能是端口被占用的问题)

-v  $PWD/conf/nginx.conf:/etc/nginx/nginx.conf  将主机当前目录下的

/conf/nginx.conf 挂载到容器的 /etc/nginx/nginx.conf  

使用代理服务器(nginx)+Docker部署springboot项目

前情提要:

宿主机上安装docker,mysql,redis

项目:

配置文件

【】为需要改的地方,不需要输入

需要在服务器的根目录下创建能和容器映射的文件

# 基础镜像使用java
FROM openjdk:8
# 作者
MAINTAINER 【自己的名字,随便起】
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为【】
ADD 【项目jar包名】 【起的名字.jar】
#运行端口号
EXPOSE 8080
# 运行jar包
cmd java -jar 【起的包名】

yml配置环境

yml文件

#自己定义版本号  ,修改【】里面的内容并删除【】
version: "【?】"
services:
  micro_service:
    container_name: 【自己起的名字】
    build:
      context: ./project
      dockerfile: Dockerfile
    ports:
      - "【IP访问端口号:8080】"
    volumes:
      - /app/microService:/data
    networks:
      - aaa_net
    depends_on:
      - 【起的redis名字】
      - 【起的mysql名字】
  【redis服务名字】:
    image: 【版本号:redis:6.0.20】
    ports:
      - "6379:6379"
    volumes:
 # 必须在宿主机中存在redis.cnf文件,创建的是宿主机下的文件,映射容器中的redis.conf
      - /app/redis/redis.conf:/etc/redis/redis.conf 
      - /app/redis/data:/data
    networks:
      - aaa_net
    command: redis-server /etc/redis/redis.conf
  【mysql服务名字】:
    image: 【mysql:5.7】
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'qy168'
    ports:
      - "3306:3306"
    volumes:
      - /app/mysql/db:/var/lib/mysql
      - /app/mysql/conf/my.cnf:/etc/my.cnf # 必须在宿主机中存在my.cnf文件
      - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - aaa_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
  aaa_net:

在宿主机的根目录下创建app文件夹

宿主机的文件关系:

my.cnf文件内容:

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

redis.conf文件内容:是一个文件,太长了不发了

就可以使用服务器id加端口号访问项目了

使用cokder+数据库(mysql)/redis(nosql)+nginx

项目:

一般项目都是配置好,数据库,redis数据库,依赖,所有东西写好之后才会进行测试

项目配置文件

#redis
spring.redis.host=192.168.220.223
spring.redis.port=6379

#mybatis-plus
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

 配置依赖

 

1.项目出现错误,修改内容后需要重新打成jar包,在拉到虚拟机上

2.修改东西之后需要访问虚拟ip:9000,杀掉镜像和服务,再次重启服务

进入这个项目

然后再次运行这个项目

docker-compose up

 从服务器端访问

设置的虚拟ip:端口号访问项目

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值