docker基础学习

本文介绍了Docker的基础知识,包括Docker为何出现、历史、功能及安装过程。强调了Docker的隔离性和高效利用服务器资源的特点。详细讲述了Docker的常用命令,如镜像和容器管理,以及数据卷的使用。还涵盖了DockerFile的构建和发布镜像到DockerHub或阿里云的过程,以及Docker网络的基本概念。
摘要由CSDN通过智能技术生成

Docker基础学习

Docker概述

Docker为什么出现?

问题:①我在我的电脑上是可以运行的!②版本更新,导致服务器无法使用!

环境配置是十分麻烦的,每一台机器都要部署环境,费时费力。

传统:开发jar,运维来部署

现在:开发打包部署上线,一套流程做完。

Docker给出了解决方案

隔离:Docker的核心思想,打包装箱,每个箱子相互隔离。

Docker通过隔离机制,可以将服务器利用到极致

Docker历史

Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。

2014年4月9日,Docker1.0发布。

在Docker容器技术之前,都是虚拟机技术

虚拟机:属于虚拟化技术,在Windows中装一个VMWare,通过这个软件可以虚拟出一台甚至多台电脑!笨重!

Docker容器技术,也是一种虚拟化技术,轻巧。

官网:Empowering App Development for Developers | Docker

文档:Docker Documentation | Docker Documentation

仓库地址:Docker Hub

Docker能干嘛

虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢

容器化技术:容器化技术不是模拟的一个完整的操作系统

比较Docker和虚拟机的不同:

  • 传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。

  • Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。

  • 每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。

DevOps(开发、运维)

应用更快速的交付和部署

传统:一堆帮助文档,安装程序

Docker:打包镜像发布测试,一键运用

更快捷的升级和扩缩容

使用Docker后部署应用像搭积木一样!

项目打包为一个镜像,通过水平扩展

更简单的系统运维

在容器化后,开发测试环境高度一致

更高效的计算资源利用

Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例,将服务器性能压榨到极致

Docker安装

Docker的基本组成

镜像(Image):

docker镜像好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像-》run-》tomcat01容器

通过这个镜像可以创建多个容器,最终服务运行或项目运行就是在容器中

容器(container):

Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建

基本命令:启动,停止,删除等

仓库(repository):

存放镜像的地方,分为公有,私有

DockerHub(默认为国外的)

阿里云(配置镜像加速)

安装Docker

环境准备

CentOS 7、Xshell连接远程服务器进行操作

环境查看

#系统内核是3.10以上的
uname -r
3.10.0-1160.36.2.el7.x86_64
#系统版本
# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

帮助文档

#1、卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
#2、需要的安装包
yum install -y yum-utils

#3、设置镜像的仓库(二选一)
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo#默认国外的
    
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#阿里云(推荐)

#更新软件包索引
yum makecache fast

#4、安装docker相关的内容
yum install docker-ce docker-ce-cli containerd.io
#一路y下去

#5、启动docker
systemctl start docker

#6、docker version查看是否安装成功

#7、使用hello-world测试
docker run hello-world

#8、查看下载的镜像
docker images

#9、卸载docker
yum remove docker-ce docker-ce-cli containerd.io #删除依赖
rm -rf /var/lib/docker #删除资源
rm -rf /var/lib/containerd

阿里云镜像加速

1、登录阿里云找到容器服务

在这里插入图片描述

2、找到镜像加速地址

在这里插入图片描述

3、配置使用

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://g8h9tnqk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

回顾HelloWorld流程

在这里插入图片描述

底层原理

Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

DockerServer接收到Docker-Client的指令,就会执行这个命令!

在这里插入图片描述

Docker为什么比VM快?

1、Docker有着比VM更少的抽象层

2、Docker利用的是宿主机的内核,vm需要的是Guest OS。

docker不需要像虚拟机一样重新加载一个操作系统内核。

Docker的常用命令

帮助命令

docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令

帮助文档地址:Reference documentation | Docker Documentation

镜像命令

docker images :查看所有本地主机上的镜像

#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小

#可选项
  -a, --all             #列出所有镜像
  -q, --quiet           #只显示镜像的ID

docker search:搜索镜像

docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11526     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4373      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   851                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   558       [OK]      

#可选项
  -f, --filter          
  eg:--filter=STARS=3000:搜索3000星以上的

doucker pull:下载镜像

docker pull 镜像名[:tag]

docker rmi:删除镜像

docker rmi-f 镜像ID #删除指定镜像
docker rmi-f 镜像ID 镜像ID 镜像ID... #删除多个镜像
docker rmi-f ${docker images -aq} #删除全部镜像

容器命令

新建容器并启动

docker run {可选参数} image
# 参数说明
--name="name" 容器名字
-d  后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p  指定容器的端口  -p 8080:8080
	-p  ip:主机端口:容器端口
	-p  主机端口:容器端口(常用)
	-p  容器端口
	容器端口
-P  随机指定端口

#测试,启动并进入容器
docker run -it centos /bin/bash

列出所有运行中的容器

docker ps
#参数
   #列出所有正在运行的容器
-a #列出所有正在运行的容器,带出历史运行过的容器
-n=#显示最近创建的n个容器
-q #只显示容器的编号

退出容器

exit   #直接容器停止并退出
ctrl + P + Q #容器不停止并退出

删除容器

docker rm 容器ID  #删除指定容器
docker rm -f #{docker ps -aq}  #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器

#参数
-f 强制删除

启动和停止容器

docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器

常用其它命令

后台启动容器

#命令 docker run -d 镜像名
docker run -d centos

#问题:docker ps发现centos被停止了

#常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#容器启动后发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

docker logs

-tf #显示日志
--tail n #显示n条日志

查看容器中的进程信息

docker top 容器ID

查看镜像的元数据

docker inspect 容器ID

进入当前正在运行的容器

#方式一 进入容器后开启一个新的终端,可在里面操作
docker exec -it 容器ID bashShell
#方式二 进入容器正在执行的终端,不会启动新的进程
docker attach 容器ID

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的的主机路径

可视化

  • portainer(先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true potainer/potainer
  • Rancher(CI/CD)

什么是portainer?

Docker图形化界面管理工具!提供一个后台面板!

Docker镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

所有的应用,直接打包docker镜像,方便扩展和部署。

如何得到镜像:

  • 从远程仓库下载
  • 拷贝
  • 自己制作镜像DockerFile

Docker镜像加载原理

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。

Commit镜像

docker commit #提交容器成为一个新的副本

docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[TAG]

容器数据卷

什么是容器数据卷

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!就是卷技术!

实现容器的持久化与同步操作。

使用容器数据卷

方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录

#测试
docker run -it -v /home/ceshi:/home centos /bin/bash

具名挂载和匿名挂载

#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有卷的情况
docker volune ls

#具名挂载
docker run -d -P --name nginx02 -v xxxxxx:etc/nginx nginx
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
#通过 -v 容器内路径:ro/rw 改变读写路径
ro:只读
re:可读可写

docker run -d -P --name nginx02 -v xxxxxx:etc/nginx:ro nginx
docker run -d -P --name nginx02 -v xxxxxx:etc/nginx:rw nginx

初识Dockerfile

Dockerfile就是用来构建docker镜像的构建文件!命令脚本!

方式二:

dockerfile

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "---end---"
CMD /bin/bash

构建镜像

docker build -f /home/docker-test/dockerfile1 -t xxx/centos:1.0 .

数据卷容器

可以使两个mysql甚至多个mysql同步数据

--volumes-from

#例子
docker run -it --name docker02 --volumes-from docker01 xxx/centos:1.0

多个mysql实现数据共享

#启动mysql01
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v
/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=XXXX --name mysql01 mysql:5.7

#启动mysql02
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=XXXX --name mysql02 --volumes-from mysql01 mysql:5.7

容器的生命周期一直持续到没有容器使用为止。

持续化到了本地,本地数据不会被删除。

DockerFile

DockerFile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

1、编写一个dockerfile文件

2、docker build构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像

DockerFile构建过程

基础知识:

1、每个保留关键字(指令)都必须大写

2、指令从上到下顺序执行

3、#表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交

DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件

DockerFile指令

FROM        #基础镜像,一切从这开始构建
MAINTAINER  #镜像作者,一般姓名+邮箱
RUN         #镜像构建的时候需要运行的命令
ADD         #添加内容
WORKDIR     #镜像的工作目录  /bin/bash等
VOLUME      #挂载的目录位置
EXPOSE      #指定暴露端口
CMD         #指定这个容器启动的时候要运行的命令,只有最后一个会生效,会被替代
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD     #当构建一个被继承的DockerFile时,会运行该指令,触发指令。
COPY        #将文件拷贝到镜像中
ENV         #构建的时候设置环境变量

发布自己的镜像

发布到DockerHub

地址:Docker Hub

1、在官网注册账号并在服务器上登录

#登录
docker login
-p --password
-u --username

2、在服务器上提交自己的镜像

#打tag
docker tag 镜像id 辨识名/镜像名:[标签]

#上传
docker push 辨识名/镜像名:[标签]

发布到阿里云镜像上

1、登录阿里云

2、找到容器镜像服务

3、创建命名空间

4、创建容器镜像

5、浏览其中信息,根据指示上传

Docker网络

理解Docker0网络

清空所有环境

查看网络地址

ip addr

在这里插入图片描述

三个网络

#创建一个容器并查看内部网络地址
#docker run -d -P --name [新建容器名] [镜像名]    创建容器
#docker exec -it [镜像名/ID] ip addr            查看网络地址

10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
       
       
# Linux 能 ping 通容器内部
ping 172.17.0.2

#结果:
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.382 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.122 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.120 ms

原理:

1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,并有一个网卡docker0,桥接模式,使用的技术是 veth-pair 技术!

2、再启动一个容器会再多一对网卡

#evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段连着彼此
#正因为该特性,veth-pair用来充当一个桥梁,连接各种虚拟网络设备
#OpenStac,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术

3、测试tomcat01与tomcat02之间ping,可以ping通

容器之间是可以互相ping通的!

–link

解决项目不重启但ip更换了无法连通的问题,使可以通过明在来访问容器。

目前使用Docker时,不建议使用–link

#docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known


#如果出现报错:OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown
#表示容器内没有这个命令,需要先安装
#docker exec -it tomcat02 /bin/bash
#apt-get update 更新
#apt install net-tools 安装相关工具 
#apt -y install iputils-ping 安装ping命令

#通过--link可以解决无法ping通的问题
#docker run -d -P --name tomcat03 --link tomcat02 tomcat
 
#docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.2): icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=3 ttl=64 time=0.079 ms

#若p2 ping p3则无法ping通

本质:–link 就是再hosts配置中增加一个tomcat02的映射

自定义网络

查看所有docker网络

在这里插入图片描述

网络模式

bridge:桥接 docker(默认,常用)

none:不配置网络

host:和宿主机共享网络

container:容器内网络联通!(用得少!局限大!)

#我们直接启动时也有默认参数 --net bridge ,就是我们的docker0
docker run -d -P --name tomcat01 --net bridge tomcat

#docker0特点,默认,域名不能访问,通过--link可以打通

#自定义网络
[root@iZbp1hwila2m3ijtql6hikZ /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
4735d093a9c777ca7490aaf94cfa71e2252a009395fa4b1286c1ddcc3632e623
[root@iZbp1hwila2m3ijtql6hikZ /]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
fa37657c6867   bridge    bridge    local
ffdfa5e65f23   host      host      local
4735d093a9c7   mynet     bridge    local #创建出来的网络
aadc5938d23b   none      null      local

#创建自定义网络中的容器
docker run -d -P --name tomcat01 --net mynet tomcat
#且不使用--link,互相之间也可以ping通

好处:

不同集群可以使用不同网络,可以保证集群的安全与健康

网络连通

docker network connect [选项] [网络名] [容器名]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值