Docker笔记

项目部署的问题

大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题

  • 依赖关系复杂,容易出现兼容性问题
  • 开发,测试,生产环境有差异

 

Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题

  • 将应用函数库,依赖,配置与应用一起打包
  • 将每个应用放到一个隔离容器去运行,使用沙箱机制,避免互相干扰

 

Docker如何解决开发,测试,生产环境有差异的问题

  • Docker镜像中包含完整运行环境, 包括系统库函数,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。

补充:Ubuntu和CentOS都是居于Linux内核,只是系统应用不同,提供的函数库有差异


 

Docker与虚拟机

区别

  • 虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统。
  • Docker是一个系统进程。


Docker架构

镜像和容器

镜像(Image):Docker将应用程序以及其所需的依赖,函数库,环境,配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。

 

Dokcer和DockerHub

DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry

国内也有类似与DockerHub的公共服务,比如网易云镜像服务,阿里云镜像服务库。

 

Docker架构

Docker是一个CS架构的程序,由两部分组成

服务端(Server):Docker守护进程,负责处理Docker指令,管理镜像,容器等

客户端(Client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。


Docker的安装

Docker版本

Docker分为CE和EE两大版本。CE即社区办(免费,支持周期7个月),EE即企业版,强调安全,付费使用,支持周期24个月

Docker CE分为stable test 和nightly三个更新频道。

 

CentOS与Docker版本对应

Docker CE支持64位版本CentOS 7,并且要求内核版本不低于3.10,CentOS 7 满足最低内核的要求,所以基本使用CentOS7安装Docker

 

安装docker

1.查看docker和卸载指定docker

  • 查看已经安装的dockeryum list installed | grep docker
  • 卸载指定的docker:yum -y remove [name]

2..如果之前安装过旧版本的Docker,可以使用以下命令卸载:

yum remove docker \
 docker-client \
 docker-client-latest \
 docker-common \
 docker-latest \
 docker-latest-logrotate \
 docker-logrotate \
 docker-selinux \
 docker-engine-selinux \
 docker-engine \
 docker-ce

3.虚拟机连上网,安装yum工具

yum install -y yum-utils \
 device-mapper-persistent-data \
 lvm2 --skip-broken

 

4.配置镜像源

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/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast

 

5.安装docker

yum install -y docker-ce

参数-y表示安装过程中遇到的所有选项都为yes

查看空间:df -hT


启动Docker

启动前准备的事情

Docker应用需要使用到各种端口,逐一去修改防火墙设置,非常麻烦,因此建议直接关(仅用于学习)

Linux关闭防火墙命令

查看防火墙状态systemctl status firewalld

关闭防火墙systemctl stop firewalld

禁止开机启动防火墙systemctl disable firewalld

 

docker相关操作

启动docker:systemctl start docker

停止docker:systemctl stop docker 

重启docker:systemctl restart docker

查看docker版本:docker -v

 

镜像加速

创建文件夹

sudo mkdir -p /etc/docker

创建daemon.json文件并写入内容

sudo tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": ["https://n0dwemtq.mirror.aliyuncs.com"]

}

EOF

修改文件名

mv /etc/docker/daemon.json /etc/docker/daemon.conf

加载并重启docker

sudo systemctl daemon-reload

sudo systemctl restart docker

 


Docker基本操作

镜像相关命令

镜像名称一般分为两部分组成:[repository]:[tag]

如果没有指定tag,则默认是latest,代表最新版本的镜像

镜像操作命令

  • 构建镜像:docker build [repository]:[tag]
  • 查看镜像 :docker images 
  • 从服务拉取镜像:docker pull [repository]:[tag]
  • 删除镜像:docker rmi [repository]:[tag]
  • 推送镜像到服务:docker push [repository]:[tag]
  • 保存镜像为一个压缩包:docker save [repository]:[tag]
  • 加载压缩包为镜像:docker load [repository]:[tag]

 

案例:从DockerHub拉取一个nginx镜像并查看

  1. 首先去镜像仓库搜索nginx镜像,比如DockerHub。带有Official Image标签的表示官方的正版镜像
  2. 拉取nginx镜像:docker pull nginx
  3. 查看镜像:docker images

 

案例:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来

可以使用docker save --help和docker load --help来查看命令使用方法

  1. 导出到磁盘:“docker save -o 导出的文件名 镜像:版本号。如:docker save -o nginx.tar nginx:latest
  2. 删除镜像:docker rmi nginx
  3. 查看镜像:docker images
  4. 加载镜像:docker load -i 导出的文件名

案例 取DocherHub搜索并拉取一个Redis镜像

  1. 去DockerHub搜索Redis镜像
  2. 查看Redis镜像的名称和版本
  3. 利用docker pull命令拉取镜像
  4. 利用docker save命令将redis:latest打包为一个redis.tar包
  5. 利用docker rmi删除本地额redis:latest
  6. 利用docker load重新加载redis.tar文件

容器相关命令

  • 创建并容器docker run --name [ContainerName] -p 宿主机端口:容器端口 [Container]
    •   参数:
      • -d表示后台启动
      • docker run:创建并运行一个容器
      • --name:给容器起一个名字,比如叫做mn
      • -p:将宿主机端口与容器端口映射,冒号左边是宿主机端口,右侧是容器端口,将宿主机端口与容器端口映射,以后访问宿主机端口时,会自动提交到容器端口
      • [Container]:镜像名称

 

  • 容器挂起docker pause [ContainerName] 

 

  • 容器恢复挂起docker unpause [ContainerName] 

 

  • 停止容器docker stop [ContainerName] 

 

  • 启动容器docker start [ContainerName] 

 

  • 查看所有运行的容器及状态docker ps
    • 参数说明:  -a:输出所有容器,包括停止的

 

  • 查看容器运行日志docker logs [ContainerName]
    • 参数说明:-f表示自动追踪日志

 

  • 查看容器执行命令docker exec

 

  • 删除指定容器docker rm
    • 参数说明:-f:强制删除

 

  • 进入容器docker exec -it [ContainerName] bash
    • 参数说明:
      • -it:给当前进入的容器创建一个标准输入,输出终端,允许我们与容器交互
      • mn:要进入的容器的名称
      • bash:进入容器后执行的命令,bash是一个linux终端交互命令

注意:停止与暂停相当于进程的挂起与终止

注意:docker要在防火墙关闭之后才能启动,否则容器无法使用。

案例:创建一个Nginx容器

1.去docker hub查看Nginx的容器运行命令

2.docker run --name containerName -p 80:80 -d nginx

 

案例:进入Nginx容器,修改HTML文件内容,添加“清风拂明月,山海有相逢”

1.进入容器。进入创建的nginx容器的命令为:docker exec -it mn bash

运行之后终端会发生变化

参考nginx官方文档,可以指导静态文件资源是放在“/usr/share/nginx/html”中,首页尾index.html

2.由于阉割版的的系统没哟vim编辑器,所以使用命令来替换内容

sed命令使用格式:sed -i 's#被替换的内容#新内容#g' 文件名

sed -i 's#Welcome to nginx#清风扶明月,山海有相逢#g' index.html

sed -i 's#<head>#<head><meta charset = "utf-8">#g' index.html

可以使用cat index.html查看index.html内容

3.输入exit命令退出容器,然后重启容器,访问localhost

重启容器:

docker restart mn

或者使用:

docker stop mn 

docker start mn

 

案例:创建并运行一个redis容器,并且支持数据持久化

  1. 拉取redis镜像:docker pull redis
  2. 创建redis容器:docker run --name myredis -p 80:80 -d redis

 

案例 进入redis容器,并执行redis-cli客户端命令,存入num=666

  1. 进入容器:docker exec -it myredis bash
  2. 使用redis客户端:redis-cli
  3. 存入值:set num 666
  4. 查看值:get num或keys *

 

数据卷

容器与数据耦合的问题

不便于修改

当我们要修改Nginx的html内容时,需要进入容器的内部修改,很不方便

数据不可复用

在容器内的修改对外是不可见的,所有修改对新创建的容器是不可复用的

升级维护困难

数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了

 

数据卷的定义

数据卷(volume)是一个虚拟的目录,指向宿主机文件系统中的某个目录

容器内的文件夹与容器外的内容映射。避免了修改时需要进入容器内修改。

 

数据卷的操作

docker volume [COMMAND]

COMMAND命令如下:

create  创建一个volume

inspect  显示一个或多个volume的信息

ls  列出所有的volume

prune  删除未使用的volume

rm  删除一个或多个指定的volume

 

案例,创建一个数据卷,并查看数据卷在宿主机的目录位置

使用docker volume create html来创建一个html数据卷

使用docker volume ls查看自己的创建数据卷

使用docker volume inspect html来检查html数据卷

使用docker volume prune删除所有未使用的数据卷

 

挂在数据卷

在创建容器时,可以通过-v参数来挂在一个数据卷到某个容器目录

案例,创建一个nginx容器,修改容器内的html目录内的index.html内容

需求说明:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。

提示:运行容器时使用-v参数挂载数据卷

使用docker volume create html来创建html数据卷

使用docker run --name mn -p [宿主机端口]:[容器端口] -v html:/usr/share/nginx/html -d nginx挂载容器

注意:如果挂载数据卷的时候数据卷不存在,docker会自动创建一个

检查html数据卷挂载的位置并进入此位置

使用vim工具修改index.html

访问页面即可看到修改后的内容

docker容器内使用文件的优先级是 数据卷内容 > 容器内容

数据卷内容与容器内容同时存在时,加载的是数据卷内容,当数据卷内容被删除时,加载的才是容器内容。

 

基于文件或者目录挂在

案例,创建并运行一个MySQL容器,将宿主机目录直接挂载到容器

提示:目录挂在与数据卷挂在的语法类似:

-v [宿主机目录]:[容器内目录]

-v [宿主机文件]:[容器内文件]

 

拉取mysql5.7.25镜像

docker pull mysql:5.7.25

 

创建目录/tmp/mysql/data

 mkdir -p mysql/data

创建爱目录/tmp/mysql/conf

mkdir -p mysql/config

-p表示多级创建

 

创建容器

docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=123456789 -p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25

第一个-v是挂在配置目录

第二个-v是挂在数据目录

基于数据卷挂在的区别

数据卷挂在耦合度低,由docker来管理目录,但是目录较深,不好找

目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

 

 Dockerfile自定义镜像

镜像结构

镜像是将应用程序以及其所需要的系统库函数,环境,配置,依赖打包而成。


自定义镜像

什么是Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

 

案例,基于Ubuntu镜像构建一个新镜像,运行一个java项目

1.新建一个空文件夹docker-demo

mkdir -p /tmp/docker-demo

2.下载文件

https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ#list/path=%2F

密码:1234

下载jdk8.tar.gz,Dockerfile,docker-demo.jar

补充:linux打包命令

tar zcvf xxx.tar.gz xxx

Dockerfile内容为:

3.进入到/tmp/docker-demo中构建包

docker build -t javaweb:1.0 .

最后要加一个空格再加一个“.”表示在本目录

 

4.根据镜像创建容器并启动

docker run --name web -p 8090:8090 -d javaweb:1.0

访问localhost:8090/hello/count即可访问成

 

DockerCompose

Docker Compose可以居于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行

 

安装DockerCompose

1.下载

curl -L \

https://github.com/docker/compose/releases/downlead/1.29.1/docker-compose-'uname -s'-'uname -m' > /usr/local/bin/docker-compose

或者直接在百度网盘下载然后使用Xftp上传到/usr/local/bin/文件中

https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ#list/path=%2F

密码:1234

 

2.进入/usr/local/bin/目录,给文件加个执行的权限

chmod +x /usr/local/bin/docker-compose

 

3.配置自动补全命令

curl -L \
https://raw.githubusercontent.com/docker/conpose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

 

 

案例,将之前学习的cloud-demo微服务集群利用DockerCompose部署

1.下载cloud-demo

https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ#list/path=%2F

密码:1234

修改自己的cloud-demo项目,将数据库,nacos地址都命名为docker-compose中的服务名

 

使用maven打包工具,将项目中的每个微服务项目都打包成app.jar

pom文件中build标签中有个finalName标签,里面写的就是打包完成的名称

将打包好的app.jar拷贝到cloud-demo中的每一对应的子目录中

 

将cloud-demo上传到虚拟机/usr/local/bin,利用docker-compose up -d来部署

由于nacos启动比其他的服务慢,可能导致其他服务无法注册到nacos,需要重启

docker-compose restart gateway userservice orderservice来重启服务

docker-compose logs -f userservice 可以查看日志


 

Docker镜像仓库

常见的镜像仓库

镜像仓库(Docker Registry)有公共的和私有的两种形式:
公共仓库:例如Docker官方的Docker Hub

私有仓库:用户可以在本地搭建私有Docker Registry

 

简化版镜像仓库

缺点是没有图形化界面,

搭建方式如下:

docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry

 

带图形化界面版本

使用DockerCompose部署带有图像界面的DockerRegistry

 

配置Docker信任地址

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
#添加内容
"insecure-registries":["http://自己的ip:8080"]
#重新加载
systemctl daemon-reload
#重启docker

注意:配置之间需要使用逗号“,”隔开

创建文件夹

mkdir registry-ui

创建compose文件

touch docker-compose.yml

写入以下内容

version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=波的仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

部署:docker-compose up -d 

查看日志:docker-compose logs -f

打开浏览器输入地址:localhost:8080即可访问自己的私有仓库

推送镜像到私有服务,步骤如下:

1.重新tag本地镜像,名称前缀必须为私有仓库地址:自己ip:8080/

docker tag nginx:latest xxx.xxx.xxx.xxx:8080/nginx:1.0

2.推送到私有仓库

docker push xxx.xxx.xxx.xxx:8080/nginx:1.0

3.拉取镜像

点击Tag会自动复制命令

 

posted @   Laplace蒜子  阅读(239)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示