Docker基础

目录

介绍

Docker架构

Docker安装(已完成)

命令

进程

镜像

容器

部署程序

部署MySQL​编辑

部署Redis

Compose

安装【已完成】

使用

案例

数据库迁移

将本地数据导出成sql文件

连接服务器上的数据库

修改字符

将sql文件导入服务器中的数据库

数据卷

后端程序部署

安装jdk

打包

上传jar包

运行程序

前端程序部署

镜像制作

使用Dockerfile制作镜像

使用容器制作镜像

镜像导入导出


介绍

Docker是一个开源的应用容器引擎,主要作用是方便我们快速安装部署软件和程序

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上

Docker架构

运行程序----> 运行在容器中----> 镜像创建出来的-----> 镜像仓库下载过来的

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

镜像(Image):镜像是用来创建容器的模版,就像是Java中的类和对象一样

容器(Container):容器是从镜像创建的运行实例,它可以被启动、停止、 删除,每个容器都是相互隔离的、保证安全的平台

Docker安装(已完成)

本课程基于CentOS 7安装Docker:

复制代码
 # 1、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
 yum install -y yum-utils device-mapper-persistent-data lvm2
 ​
 # 2、设置yum源
 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
 ​
 # 3、安装docker,出现输入的界面都按 y 
 yum install -y docker-ce
 ​
 # 4、查看docker版本,验证是否验证成功
 docker -v
 ​
 # 5、启动docker环境
 systemctl start docker
 ​
 # 6、设置开机自启动
 systemctl enable docker

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

创建或修改 /etc/docker/daemon.json文件,修改为如下形式:

复制代码
 {
     "registry-mirrors": [
         "https://docker.m.daocloud.io",
         "https://dockerproxy.com",
         "https://registry.docker-cn.com",
         "https://docker.mirrors.ustc.edu.cn",
         "https://hub-mirror.c.163.com",
         "https://hub.uuuadc.top",
         "https://docker.anyhub.us.kg",
         "https://dockerhub.jobcher.com",
         "https://dockerhub.icu",
         "https://docker.ckyl.me",
         "https://docker.awsl9527.cn",
         "https://mirror.baidubce.com"
   ]
 }
复制代码
 # 重启docker
 systemctl restart docker
 ​
 # 查看是否成功
 docker info

命令

进程

复制代码
 # 启动服务
 systemctl start docker 
 ​
 # 停止服务 
 systemctl stop docker
 ​
 # 重启服务  
 systemctl restart docker
 ​
 # 查看服务的状态   
 systemctl status docker 
 ​
 # 设置开机自启动 
 systemctl enable docker

镜像

复制代码
 # 查看本地镜像 
 docker images
 ​
 # 搜索镜像仓库,推荐:https://hub.docker.com/
 docker search 镜像名称 
 ​
 # 下载(拉取)镜像,镜像名称格式为 名称:版本号
 docker pull 镜像名称
 ​
 # 删除镜像(慎重)
 docker rmi 镜像名称

想要在当前虚拟机运行一个nginx程序

复制代码
 1. 搜索docker仓库中有哪些版本的nginx镜像
 ​
 2. 从docker的镜像仓库中拉取到nginx 1.18.0的镜像文件        
 ​
 3. 查看本地的镜像   
 ​
 4. 从本地删除nginx的镜像 
 ​

容器

复制代码
 # 查看本地容器
 docker ps     # 能查看正在运行
 docker ps -a  # 能查看所有的容器(运行的和停止的)
 ​
 # 创建一个新的容器并运行(-d  后台运行容器,并返回容器ID  -p 主机端口:容器端口  指定映射关系)
 docker run -d -p 80:80 --name=容器名 镜像名称
 ​
 # 进入容器内部
 docker exec -it 容器名称 /bin/bash
 ​
 # 启动容器
 docker start 容器名称
 ​
 # 停止容器
 docker stop 容器名称
 ​
 # 删除容器
 docker rm 容器名称

场景: 使用nginx镜像运行出一个nginx容器(就是一个可以对外提供服务的nginx程序) ​

如果服务器提示你

说明你的linux服务关闭了请求转发功能, docker容器访问一般是需要做转发的,怎么开启呢?

修改文件vim /usr/lib/sysctl.d/00-system.conf,在最后追加一行net.ipv4.ip_forward=1

改完之后需要重启网络服务systemctl restart network

部署程序

部署MySQL

复制代码
# 拉取mysql镜像
docker pull mysql:5.7

# 创建并启动容器
docker run -d -p 3306:3306 --name=mysql5.7 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

部署Redis

复制代码
# 拉取redis镜像
docker pull redis:5.0

# 创建并启动容器
docker run -d --name=redis5.0 -p 6379:6379 redis:5.0

Compose

服务编排 docker-compose k8s

在以后的开发中,可能存在同一环境中出现多个程序的情况,这些程序都会单独的作为容器启动,比如说:

  • container-order 订单程序

  • container-user 用户程序

  • container-redis redis

  • container-mysql mysql

这些容器需要同时启动,同时停止,如果我们一个个的去操作,就会变的很麻烦,这时候我们就需要一个批量操作容器的工具

Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用

Compose通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景

安装【已完成】

复制代码
# 安装docekr compose 工具
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 设置权限
chmod +x /usr/local/bin/docker-compose

# 查看版本 
docker-compose -version

使用

docker-compose主要是通过一个配置文件和几个命令来管理多个容器的

配置文件用于配置多个容器信息,命令用于控制多个容器的行为

注意: 上面两条命令执行位置必须跟docker-compose.yml位于同一个目录

案例

通过docker compose进行容器批量管理:一次性启动两个容器(mysql,redis)

1) 创建docker-compose目录

复制代码
mkdir ~/a/docker-compose -pv
cd ~/a/docker-compose

2) 创建docker-compose.yml文件,内容如下

复制代码
version: '3'
services: 
  mysql:
   container_name: my_mysql
   image: mysql:5.7
   ports:
    - 3306:3306
   environment:
      MYSQL_ROOT_PASSWORD: root
      collation-server: utf8mb4_unicode_ci
      character-set-server: utf8mb4    
  redis:
   container_name: my_redis
   image: redis:5.0
   ports:
    - 6379:6379

3) 启动容器

复制代码
# 为了演示效果更佳明显,我们使用下面命令先停止并删除所有容器
docker stop $(docker ps -q)
docker rm $(docker ps -aq)

# 执行命令,启动容器
# 执行此命令的时候,需要和配置文件在同一个目录下
docker-compose up -d
  1. 停止并删除容器
复制代码
# 执行此命令的时候,需要和配置文件在同一个目录下
docker-compose down 

数据库迁移

将本地数据导出成sql文件

连接服务器上的数据库

修改字符

utf8mb4_0900_ai_ci 替换为 utf8_general_ci

utf8mb4 替换为utf8

将sql文件导入服务器中的数据库

数据卷

思考这样两问题:

  • Docker容器删除后,容器中的数据会不会永久丢失,如果是,岂不是很危险?

  • 容器之间可不可以实现文件的共享呢?

数据卷:

  • 数据卷是宿主机中的一个目录或文件,它可以被挂载到容器中,在容器中对它的操作可以直接反应到宿主机上

  • 一个容器可以被挂载多个数据卷,一个数据卷也可以被多个容器同时挂载

将数据库的data目录映射到Linux宿主机上

  1. 停止mysql
复制代码
docker-compose down
  1. 准备一个空目录存储数据库信息
复制代码
mkdir -p ~/a/data
  1. 修改docker-compose.yml添加数据卷
复制代码
version: '3'
services: 
  tomcat:
   container_name: my_mysql
   image: mysql:5.7
   ports:
    - 3306:3306   
   environment:
     MYSQL_ROOT_PASSWORD: root
     collation-server: utf8mb4_unicode_ci
     character-set-server: utf8mb4
   volumes:
    - /root/a/data:/var/lib/mysql
  redis:
   container_name: my_redis
   image: redis:5.0
   ports:
    - 6379:6379
  1. 重启容器
复制代码
docker-compose up -d
  1. 重新导入一遍数据库

后端程序部署

安装jdk

复制代码
#1 解压
	tar -zxvf /root/a/jdk-11.0.18_linux-x64_bin.tar.gz -C /usr/local/
#2 配置环境变量
	vim /etc/profile
	
	export JAVA_HOME=/usr/local/jdk-11.0.18
	export PATH=$PATH:$JAVA_HOME/bin
#3 更新配置文件
	source /etc/profile
#4 测试
	java -version

打包

修改配置文件中mysql和redis的连接信息,然后使用maven插件打出jar包

上传jar包

将得到的web.jar包上传到服务器上

运行程序

复制代码
java -jar /root/web.jar --server.port=9090

上面方式会占据控制台运行,下面是后台运行

复制代码
nohup java -jar /root/web.jar --server.port=9090 > /root/web/9090.log &

查看日志

复制代码
tail -f /usr/local/9090.log

前端程序部署

Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师伊戈尔·西索夫所开发。

Nginx性能非常优秀,官方测试 nginx 能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

Nginx的作用有很多,我们经常使用的是用它来做静态资源服务器、负载均衡服务器和反向代理服务器。

负载均衡配置

复制代码
	upstream a{
        server 192.168.150.3:9090;
        server 192.168.150.3:9091;
    }
        
     server {
        listen       8077;
        server_name  localhost;

		# 反向代理,处理管理端发送的请求
		location /api/ {
			proxy_pass http://a;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header REMOTE-HOST $remote_addr;
		}
	}

镜像制作

使用Dockerfile制作镜像

Dockerfile是一个用于描述生产docker镜像的文件,它里面是一条条的指令,每条指令都会对镜像产生一定影响
案例:基于jdk1.8环境运行springboot项目,打包为镜像

  1. 将springboot-hello-0.0.1-SNAPSHOT.jar上传到linux

  2. 创建一个springboot-dockerfile文件,内容如下

复制代码
# 定义基础镜像(从哪个镜像的基础上开始做)
FROM java:8 
# 定义作者信息(可以省略)
MAINTAINER  itheima <a@a.cn>
# 将jar包添加到容器,并改名为app.jar
ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
# 镜像启动容器的时候,执行的命令
CMD java -jar app.jar
  1. 通过dockerfile构建镜像
复制代码
# -f :指定要使用的Dockerfile路径   -t :指定生成的镜像名称   .  镜像构建过程中的上下文环境的目录 	
docker build -f ./springboot-dockerfile -t app-a.
  1. 查看生成的镜像,并运行为容器
复制代码
[root@a~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app-a                latest              663f3e3e33fb        35 minutes ago      661MB

[root@itcast ~]# docker run -d -p 18080:8080 app-itheima:latest
5ea166a3dbec4c091d7a70f84b75703f55a9ccd93f3a45466e4eeb9ac56fdb17

[root@a~]#
[root@a~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED            PORTS                         NAMES
5ea166a3dbec        app-a:latest   "/bin/sh -c 'java -j…"   7 seconds ago      0.0.0.0:18080->8080/tcp       serene_antonelli

使用容器制作镜像

docker允许将一个容器直接转化为镜像,使用的命令如下:

docker commit 容器id 镜像名称:版本号
案例:修改当前的nginx容器中的index.html文件内容为hehe,然后将修改后的容器做成一个名为mynginx:hehe的镜像

复制代码
 #1. 查看当前正在运行的容器
 [root@a~]# docker ps
 CONTAINER ID        IMAGE        COMMAND                 CREATED             STATUS              PORTS                     NAMES
 0ce0bf14399d        nginx       "/docker-entrypoint.…"   14 hours ago        Up 14 hours         0.0.0.0:80->80/tcp        nginx
 ​
 #2. 进入nginx容器,然后向主页面覆盖写入"hehe",然后退出容器
 [root@a~]# docker exec -it nginx /bin/bash
 root@0ce0bf14399d:/# echo "hehe" > /usr/share/nginx/html/index.html
 root@0ce0bf14399d:/# exit
 ​
 #3. 将修改之后的容器生成为mynginx:hehe镜像
 [root@a~]# docker commit nginx mynginx:hehe
 sha256:139a9ea6a6008bc5557566e54316ccd8b93f508dba1daf7296235a461c8d471e
 ​
 #4. 查看镜像
 [root@a~]# docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 mynginx             hehe                139a9ea6a600        8 seconds ago       133MB

镜像导入导出

需求:将mynginx:hehe镜像共享给其他人,或者是将别人共享给的镜像包导入到系统中

复制代码
 # 将镜像保存成tar包: docker save -o 包名 镜像:版本
 [root@a ~]# docker save -o mynginx.tar mynginx:hehe
 [root@a ~]# ls
 mynginx.tar
 ​
 # 接下来删除我们本地的mynginx:hehe镜像
 [root@a ~]# docker rmi mynginx:hehe
 Untagged: mynginx:hehe
 Deleted: sha256:0121bd7115b67719cc215cea3c2a2b090c0a42a1d70cbd46d4d243fa9c8b0edd
 ​
 # 然后再从tar包中将镜像导入到本机
 [root@a ~]# docker load -i  mynginx.tar
 Loaded image: mynginx:hehe
相关推荐
落非3 分钟前
Ubuntu配置阿里云docker apt源
ubuntu·阿里云·docker
fareast_mzh12 分钟前
Setting Up a Simple Live Streaming Server on Debian 11
运维·debian·直播
BillKu1 小时前
Linux设置Nginx开机启动
linux·运维·nginx
东方佑1 小时前
FastHTML快速入门:服务器渲染超媒体应用的利器
运维·服务器
baidu_375528812 小时前
光感传感器 芯片stk3171 linux驱动程序
linux·运维·服务器
飞腾开发者2 小时前
飞腾平台Arm NN软件栈安装使用指南
linux·运维·人工智能·机器学习·计算机视觉
x2lab2 小时前
国产化 ARM 环境mysql-mariadb 部署
arm开发·mysql·docker·mariadb
鸠摩智首席音效师2 小时前
.NET Core 应用程序如何在 Linux 中创建 Systemd 服务 ?
linux·运维·.netcore
叫我龙翔3 小时前
【计网】实现reactor反应堆模型 --- 多线程方案优化 ,OTOL方案
linux·运维·网络
mit6.8243 小时前
[Docker#9] 存储卷 | Volume、Bind、Tmpfs | -v/mount | MySQL 灾难恢复 | 问题
linux·运维·docker·容器·架构