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
相关推荐
许白掰1 小时前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
B1nna2 小时前
Docker学习
学习·docker·容器
缘友一世2 小时前
网安系列【15】之Docker未授权访问漏洞
docker·容器
AmosTian8 小时前
【系统与工具】Linux——Linux简介、安装、简单使用
linux·运维·服务器
YC运维9 小时前
RIP实验以及核心原理
运维·网络·智能路由器
慕木兮人可9 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
leo__52010 小时前
自动化运维:使用Ansible简化日常任务
运维·自动化·ansible
霖0010 小时前
C++学习笔记三
运维·开发语言·c++·笔记·学习·fpga开发
CodeWithMe10 小时前
【Note】《Kafka: The Definitive Guide》 第九章:Kafka 管理与运维实战
运维·分布式·kafka